예전 전달 방식이라면, tag list 형식으로 고쳐준다.
[ parse_tags ] arch/arm/kernel/setup.c
#define __tag __attribute_used__ __attribute__((__section__(".taglist.init")))
arch/arm/kernel/setup.c 에 다음과 같은 코드가 존재한다.
__tagtable(ATAG_CORE, parse_tag_core);
ATAG_NONE 일 때까지 루프 돌면서 parse_tag 에 태그(struct tag)를 인자로 넘겨 호출한다.
parse_tag 는 넘겨온 tag 가 __tagtable_begin에서 __tagtable_end 까지 섹션 .taglist.init 영역 안에 저장되어 있는 tagtable 구조체의 tag 값을 비교하여 같은 것이 있다면, tagtable 구조체의 parse 함수를 호출한다. tagtable 구조체는 include/asm-arm/setup.h 정의되어 있다.
struct tagtable {
__u32 tag;
int (*parse)(const struct tag *);
};
.taglist.init 영역에 값을 넣는 매크로는 __tagtable 로써 include/asm-arm/setup.h 에 정의되어 있다.
#define __tag __attribute_used__ __attribute__((__section__(".taglist.init")))
#define __tagtable(tag, fn) \
static struct tagtable __tagtable_##fn __tag = { tag, fn }
arch/arm/kernel/setup.c 에 다음과 같은 코드가 존재한다.
__tagtable(ATAG_CORE, parse_tag_core);
__tagtable(ATAG_MEM, parse_tag_mem32);
:
__tagtable(ATAG_REVISION, parse_tag_revision);
tagtable[0] |
ATAG_REVISION | <-- __tagtable_begin |
parse_tag_revision | ||
: | : | |
: | ATAG_MEM | *.taglist.init |
: | parse_tag_mem32 | |
tagtable[n] |
ATAG_CORE | |
|
parse_tag_core | <-- __tagtable_end |
[ parse_cmdline ] arch/arm/kernel/setup.c
struct early_params {
.early_param.init 영역에 값을 넣는 매크로는 __early_param 로써 include/asm-arm/setup.h 에 정의되어 있다.
#define __early_param(name,fn) \
arch/arm/kernel/setup.c 에 다음과 같은 코드가 존재한다.
arch/arm/mm/mmu.c 에 다음과 같은 코드가 존재한다.
default_command_line 에 저장되어 있는 문자열을 분석한다. 이 값은 커널 옵션에서 지정한 값이며, 만약 부트로더에서 ATAG_CMDLINE 태그로 넘겼을 경우 부터로더에서 넘긴 값으로 대체된다.
__early_begin 부터 __early_end 까지 .early_param.init 영역에 저장되어 있는 early_params 구조체의 arg 값을 string를 처음부터 끝까지 memcmp 로 메모리 비교를 하고, 같으면 해당 함수에 일치하는 문자 다음부터 포인터를 인자로 넘기며 호출한다. 그렇지 않으면 cmdline_p에 내용을 복사한다.
early_params 구조체는 include/asm-arm/setup.h 에 정의되어 있다.
( cmdline_p=“ xxx=1234 yyy=1234” 형태로 저장된다.”)
early_params 구조체는 include/asm-arm/setup.h 에 정의되어 있다.
( cmdline_p=“ xxx=1234 yyy=1234” 형태로 저장된다.”)
struct early_params {
const char *arg;
void (*fn)(char **p);
};
.early_param.init 영역에 값을 넣는 매크로는 __early_param 로써 include/asm-arm/setup.h 에 정의되어 있다.
#define __early_param(name,fn) \
static struct early_params __early_##fn __attribute_used__ \
__attribute__((__section__(".early_param.init"))) = { name, fn }
arch/arm/kernel/setup.c 에 다음과 같은 코드가 존재한다.
__early_param("initrd=", early_initrd);
__early_param("mem=", early_mem);
arch/arm/mm/mmu.c 에 다음과 같은 코드가 존재한다.
__early_param("cachepolicy=", early_cachepolicy);
__early_param("nocache", early_nocache);
__early_param("nowb", early_nowrite);
__early_param("ecc=", early_ecc);
“initrd=“ |
<-- __early_begin |
early_initrd | |
: | |
“nowb” |
.early_param.init |
early_nowrite | |
“ecc=“ | |
early_ecc |
<-- __early_end |
'리눅스커널' 카테고리의 다른 글
[ ecc_mask ] arch/arm/mm/mmu.c (0) | 2009.10.02 |
---|---|
[ build_mem_type_table ] arch/arm/mm/mmu.c (0) | 2009.10.02 |
[ setup_processor ] arch/arm/kernel/setup.c (0) | 2009.10.02 |
[ setup_arch ] arch/arm/kernel/setup.c (0) | 2009.10.02 |
[ volatile , barrier ] (0) | 2009.10.02 |