상위 디렉토리로 움직일 때 ../ 을 반복해서 치기 귀찮을 때가 많은데 이럴 때 쓸 수 있도록 하나 짜서 만들어 두면 편하다.

~/bin/backdir.sh

#!/bin/bash

if [ "$1" = "" ] ; then
        COUNT=4;
else
        COUNT=$1;
fi

for ((i = 0; i < COUNT; i++))
do
        cd ..;
done


~/.profile

alias b=". ~/bin/backdir.sh"


사용?
$ b
or
$ b 5
구글의 커널을 받아보면 Full defconfig 를 생성하지 않고 최소한의 것들만 셋팅해서 사용하는데, 난 이제껏 손으로 그냥 수정해서 사용하는 줄 알았다. 알고보니 minimum defconfig 를 만드는 방법이 있었다.

make ARCH=<ARCH 이름> <이름>_defconfig
make ARCH=<ARCH 이름> savedefconfig

이렇게 하면 커널 루트에 defconfig 라는 파일로 Minimum defconfig 가 생성된다. 이를 <이름>_defconfig 로 만들면 되는 것.

몰랐네~ 몰랐어~
자기가 어떤 후보를 찍을지에 대한 정보는 찾아봐야지!

새누리당 신영수 후보

- 의안 번호 1807922 인천국제공항공사법 일부개정법률안 발의 - 인천 공항 민영화라고 불리우는 것으로 보이는 개정법률안 발의
- 한미 FTA 비준 동의안 표결 및 찬성 - 경향신문 한미 FTA 비준 국회 표결자 명단에 네티즌 “매국노…”

민주통합당 김태년 후보

- 과거 노무현 정권 때 한미 FTA 찬성 - 한겨레 뉴스, 여당 의원토론회 ‘FTA’ 찬-반 정면충돌
- 최근 한미 FTA 전면 무효화 1인 시위 - 아름방송, [정치] FTA 반대 일인시위
- 과거 의정연구센터 멤버, 출자총액제한제 완화, 폐지 주장한 것으로 보임 - 한겨레21, 삼팔육의 십팔번은 실용주의? - 친재벌 노선으로 의심할 만 한 것으로 보인다.
- "분배가 성장의 동력이 될 수 있다", "성장 없는 분배는 공허한 것",  "기업이 살아야 나라가 산다. 이 때문에 불필요한 규제는 제거해야 한다"고 강조했다. - 매일경제, 386의원들 정말 맞아 ?
- 김진표 원내대표의 2010년 민주당 김진표 경기도지사 후보 경선대책위원회 총괄본부장 - 수원 일보 김진표 “5+4 단일화안 따르겠다” 중  - 경제 민주화를 외치는 일부 사람들은 김진표 대표를 반대하고 있는 것으로 보인다. 김진표 대표와의 관계가 친한 것으로 의심해 볼 만한 것으로 보인다.
- 최근 김진표 원내대표 초청강연회 한 이력 있음 - 성남 투데이, 민주당 성남수정, 김진표 원내대표 초청 강연회 연다
- 의안 번호 171822 재외동포의출입국과법적지위에관한법률 일부개정법률안 - 재외동포법 개정안 기권
- BBK 문제 쟁점화 - 이데일리, 정무위, 이명박 후보 `BBK` 재점화 예고
- 의안 번호 177691 국군부대의 이라크 파견연장 및 임무종결계획 동의안 - 이라크 파병 연장안 반대 - 오마이뉴스, 이라크파병연장안 통과... 찬성 110, 반대 31, 기권 17,
CONFIG_CMDLINE_EXTEND 옵션을 켜면 CONFIG_CMDLINE 의 cmdline 뒤에 부트로더에서 넘기는 cmdline 을 덧붙인다.

ARM 의 경우 arch/arm/kernel/setup.c 에 보면 다음과 같은 것들을 볼 수 있다.

...
static char default_command_line[COMMAND_LINE_SIZE] __initdata = CONFIG_CMDLINE;
...

static int __init parse_tag_cmdline(const struct tag *tag)
{
#if defined(CONFIG_CMDLINE_EXTEND)
        strlcat(default_command_line, " ", COMMAND_LINE_SIZE);
        strlcat(default_command_line, tag->u.cmdline.cmdline,
                COMMAND_LINE_SIZE);
#elif defined(CONFIG_CMDLINE_FORCE)
        pr_warning("Ignoring tag cmdline (using the default kernel command line)\n");
#else
        strlcpy(default_command_line, tag->u.cmdline.cmdline,
                COMMAND_LINE_SIZE);
#endif
        return 0;
}


참고로 안드로이드의 경우, boot.img 에 쓰이는 cmdline 에 아무것도 없을 것이라고 기대된다. boot.img 안에 있는 cmdline 의 경우 fastboot -c 옵션을 통해 디버깅 목적으로 쓸 때 사용되곤 한다.

이 문서의 저작권은 GPL을 따른다(This document is released under a GPL license).

일전에 OMAPpedia 에 나와 있다고 쓴 적이 있었는데, 그 글에서 다른 이슈들에 묻혀서 잘 안보이길래 아예 다른 글로 하나 빼서 쓴다.
가끔 ssh 를 Proxy 환경에서 사용해야 할 일이 있다. 이럴 때는 corkscrew 를 설치하고 ~/.ssh/config 안에 다음과 같이 설정하면 된다.

ProxyCommand /usr/local/bin/corkscrew <Proxy URL or IP> <Proxy Port> %h %p


참고 : http://daniel.haxx.se/docs/sshproxy.html
초기화 할 때 gpio_request 를 하고 값을 셋팅하는 걸 한방에 할 수 있는 방법!
gpio_request_one 을 쓰시라~

int gpio_request_one(unsigned gpio, unsigned long flags, const char *label);

기존의 GPIOF_ 가 다음과 같으므로

* GPIOF_DIR_IN		- to configure direction as input 
* GPIOF_DIR_OUT		- to configure direction as output

* GPIOF_INIT_LOW - as output, set initial level to LOW
* GPIOF_INIT_HIGH	- as output, set initial level to HIGH

flags 에는 다음과 같은 값들을 쓸 수 있다. 이름을 보면 대충 뭐하는지 다 알 듯.

* GPIOF_IN		- configure as input
* GPIOF_OUT_INIT_LOW	- configured as output, initial level LOW
* GPIOF_OUT_INIT_HIGH	- configured as output, initial level HIGH

그리고 array 로 만들어서 한방에 할 수도 있다.

static struct gpio leds_gpios[] = { 
	{ 32, GPIOF_OUT_INIT_HIGH, "Power LED" }, /* default to ON */
	{ 33, GPIOF_OUT_INIT_LOW,  "Green LED" }, /* default to OFF */
	{ 34, GPIOF_OUT_INIT_LOW,  "Red LED"   }, /* default to OFF */
	{ 35, GPIOF_OUT_INIT_LOW,  "Blue LED"  }, /* default to OFF */
	{ ... },
};

err = gpio_request_array(leds_gpios, ARRAY_SIZE(leds_gpios)); 
if (err)
	...

당연히 array 를 free하는 것도 있다.

gpio_free_array(leds_gpios, ARRAY_SIZE(leds_gpios))


request 할 때 맨 뒤의 label 을 만들 때 kasprintf() 를 이용하면 내부에서 kmalloc 해서 잡아준다. 런타임에 label을 정하거나 할 때 유용히 쓸 수 있다.

 char *label = kasprintf(GFP_KERNEL, "LED %d", i);

 gpio_request_one(32, GPIOF_OUT_INIT_HIGH, label);

 ...
 gpio_free(32);
 kfree(label);


이 문서의 라이센스는 GPL을 따른다(This document is released under a GPL license.)

참고 :  http://lwn.net/Articles/369182/  
부쉐론, 티파니, 까르띠에 셋 간의 경합에서 부쉐론 탈락!(여기까지도 참 많은 고민이;;)- 티파니, 까르띠에 중 며칠(몇달?) 간의 탐색과 고민 끝에 드디어 결정! 결정은 내가!

포장은 이렇다. 흰색의 깔끔한 포장에 빨간 색 밀랍 포인트.

요렇게 봉해주는데 난 요거부터 너무 맘에 든다.

그래서 조심조심 잘 뜯었지롱. 다시 쌀 때 고대로 다시 넣으려고~

근데 저쪽은 이미...;;;; 그래서 고대로 뜯은 내껀 현정이가... 웬지 뜯을 때부터 그럴 거 같았어....

 

포장을 벗기면 이런 상자가 나온다. 고급스럽다(나만 그런가?).

 

그리고 이 박스를 위로 들어 열면 반지함이 나온다. 두개를 다 열어서 펼쳐놓기! 옆에 보이는 파란색 붙은 투명 테이프는 두 개를 구별하기 위해서 상점에서 붙여 준 것이었다. 내건 파란색, 현정이 건 노란색

 

사진을 찍어야지! 저 카메라는 오늘, 현정이 생일을 맞아 내가 사준 Sony Nex-7. 전에 가족구매센터에서 좀 더 싸게 샀는데 생일까진 자기만 쓸 거라고 제대로 만지지도 못하게 했다-_- 오늘 좀 만져보쟀더니 아직 오늘이 지나지 않았는데 무슨 소리냐고....


아무튼 저 반지함은 이렇게 생겼다. 얘도 고급스럽다. 아래 삐죽 튀어 나온 것을 누르면 열린다.

 

드디어 반지함을 열면~ 짜자잔! 반지 등장이요! 왼쪽이 현정이 것, 오른쪽이 내 것! 이 것을 고르기 위해 얼마나 고민했던가~, 한번 보고, 두번째 보고, 세번째, ..., 볼 때마다 달라지는 느낌에 마지막까지 정말 고르기 힘들었다. 경합에 경합을 거쳐 최후의 후보 두 개 중 마지막 선택을 받은 니네가 슈퍼스타~

 

현정이 것은 3색 골드의 가운데에 돌아가며 둘레로 다이아몬드가 알알이 박힌 디자인. 화려하고 예쁘다. 내가 아는 이름은 "트리니티 3색 골드링인데 가운데 다이아 박힌 것" ...이다. -_-)>

 

내 것은 심플하게 생긴 아래 것. 얘는 그럼 "트리니티 3색 골드링"인가..

 

세가지 색상의 골드-핑크 골드, 화이트 골드, 옐로우 골드-가 차례로 붙어 이어진 것이 심플하면서도 멋스럽다(이 것도 나만 그런가? ㅋ).


반지는 사실 사진이나 그냥 보았을 때 아무리 예뻐보여도 실제 껴보았을 때 예뻐야 한다. 그래서 고르는데 어려웠지~ 반지를 실제로 보러 가보기 전에 내가 골랐던 것은 완전 두꺼운 슐럼버제 링, 파란 사파이어 박힌 링들이었다. 가서 껴보니 헐......... 그런 의미에서 현정이가 끼었던 반지 들 중 이게 제일 손에도 잘 어울리고 예쁘다.

그리고 그런 의미에서 내 것도 완전 잘 어울린다. 내 손가락이 좀 짧고 굵고 못생겨서 너무 두꺼운 건 잘 안어울리고.. 심플하면서도 멋스럽고. 너무 맘에 든다! 나이 들어도 잘 끼고 다닐 수 있을 거 같다.

반지 안쪽에 이니셜도 새길 수 있다고 하니 어떻게 새길지 잘 생각해보고~ 새겨 넣어야지~ 이히히히. 이니셜은 공간제약으로 영문, 숫자로 대소문자 구분되고 10글자 정도 새길 수 있다고 한다.

이전에 꼈던 커플링도 예쁘고 좋다. 난 이전 커플링도 너무 사랑스럽다. 사진에는 잘 나오지 않았지만, 아직도 나에게는 반짝반짝 너무 예쁘고 잘 어울리고. 오랜동안 함께 했었고.. 너희들도 고마웠어. 잊지 않을께.
작년 8월부터 10월에 "개발 환경 개선 Git + Gerrit + checkpatch + cleanpatch" 에서 이야기했던대로
회사에서는 아무도 나에게 이런 것을 하라고 한 적은 없지만,

1. Gerrit 시스템 상에서 리눅스 커널에 대한 Change는 자동으로 checkpatch.pl 를 실행해서 해당 결과를 자동으로 comment하고, Error 나 Warning이 있는 경우 해당 패치셋에 -1로 리뷰 점수를 부여하고,
2. White space error, 소스 코드, Kconfig, Makefile 등의 파일의 Execution 권한 에러 등이 있는 경우 자동으로 수정해서 새로운 Patch set으로 올려주는

시스템을 구현해서 도입했다(나중에 연말 임원 회의 때 "우리 부서의 자랑" 같은 발표를 하려고 했던 것으로 알고 있다. 했나?).

그런데 올해 2월 초부터 구글의 gerrit 시스템에도 비슷한 것이 보이기 시작했다. "Kernel code style" 이라는 사용자 이름으로 checkpatch 결과가 붙기 시작한 거다. 내가 구현한 위의 것에서는 1단계까지의 것으로 보인다. 보자마자 '어라? 이것들 나랑 비슷한거 만들었네?' 란 생각에 흥미로움을 감출 수 없었다. 더 재밌는 건 내 스크립트가 comment 하는 형식과 구글의 comment 형식이 거의 같다는 거다. 난 너무 많으면 길어서 내용을 좀 자르긴 했다. 도입 초기에는 에러가 3만개, 6만개씩 있는 패치들도 있었으니까! ㅎㅎㅎㅎ

그래서 찾아보니 구글의 커널 개발자 Brian Swetland 가 2009년 9월에 이를 할 수 있으면 좋겠다는 이슈를 올렸었고, 2010년 2월에 hooks 를 이용할 수 있다는 답변으로 closed 되었다. 답변으로 달린 방법이 거의 정확히 1단계를 위해 내가 구현한 방법과 일치하는데, 구글 내부 gerrit 에서도 사용했었는지는 알 수 있는 방법은 없다. 그런데 Nexus S때도, Galaxy Nexus 때도 2월 이전에는 쓴 적이 없단 말이지... ㅎㅎㅎ

동작하는 방식을 조금 보니 아마 커널 Change를 올리는 개발자 그룹이 있어서 해당 그룹에 속한 개발자가 Change를 올리면 checkpatch로 체크를 하는 것 같다.

이글을 쓰다가 TI 커널 브랜치에서부터 시작이 된 것 같아서 찾아보니 TI Gerrit(http://review.omapzoom.org/)은 2011년 7월부터 Ruslan Bilovol 이란 개발자가 자기 Bot을 사용해서 Change-Id check와 checkpatch를 자동으로 돌리는 것을 시작했었다! 난 작년 7월에 산호세에 있었고 7월 말부터 이 일을 맡아서 시작했었으니! 오! 세계 최초라 한 것이 부끄럽구나! ...근데 자동으로 고쳐서 올려주는 건 아직 나밖에 안했잖아???? ㅎㅎㅎㅎ

아무튼 내가 생각한 것과 비슷한 생각들, 그리고 비슷한 구현물들을 세계 이곳저곳에서 발견할 수 있다는 게 너무나도 재밌다!!!


p.s.: 나한테 더 성능좋은 PC, 서버들이 더 많이 주어진다면, 아마 더 많은 일을 할 수 있을텐데...
 
Documentation/CodingStyle에서 inline disease 에 언급된 (slab 기준) kmalloc 구현을 살펴보다가 눈에 띄어서 정리해 둔다.
__builtin_constant_p(exp) 는 컴파일 타임에 상수로 정해질 수 있는 경우에 1을, 아닌 경우에는 0을 리턴한다. 따라서 이 조건에 따라 다른 코드를 사용함으로 써 최적화할 수 있도록 할 수 있다.

(이 글을 쓰는 시점인 v3.3-rc6 기준)kmalloc 의 경우 다음과 같이 구현되어 있다.

include/linux/slab_def.h

static __always_inline void *kmalloc(size_t size, gfp_t flags)

{
	struct kmem_cache *cachep;
	void *ret;

	if (__builtin_constant_p(size)) {
		int i = 0;

		if (!size)
			return ZERO_SIZE_PTR;

#define CACHE(x) \
		if (size <= x) \
			goto found; \
		else \
			i++;
#include <linux/kmalloc_sizes.h>
#undef CACHE
		return NULL;
found:
#ifdef CONFIG_ZONE_DMA
		if (flags & GFP_DMA)
			cachep = malloc_sizes[i].cs_dmacachep;
		else
#endif
			cachep = malloc_sizes[i].cs_cachep;

		ret = kmem_cache_alloc_trace(size, cachep, flags);

		return ret;
	}
	return __kmalloc(size, flags);
}


이외에도 __always_inline 사용, CACHE(x) 매크로를 상황에 따라 define하고 linux/kmalloc_sizes.h 헤더를 include 하여 사용하는 부분은 매우 흥미롭다. __always_inline 은 gcc의 function attribute 를 이용한다.

이 글의 라이센스는 GPL 을 따른다(This document is released under a GPL licence.).

참고 :  http://gcc.gnu.org/onlinedocs/gcc-4.6.3/gcc/Other-Builtins.html