예전 전달 방식이라면, tag list 형식으로 고쳐준다. 

[ parse_tags ] arch/arm/kernel/setup.c
 
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
 
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 형태로 저장된다.)

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
Posted by blee
,