__arch_info_begin 부터 __arch_info_end 까지 ( 섹션 .arch.info.init 영역 )  저장된 machine_desc 구조체에서 MACHINFO_TYPE 값에 해당하는, 변수 nr 을 읽어 온다.

 이 값이 부
터로드에서 넘긴 arch 넘버(R1)와 같은지 비교하고, 같으면 리턴하고, 다르면 machine_desc 구조체 만큼 증가하여 __arch_info_end 까지 반복하게 된다. 성공 하면, R5 은 일치하는 machine_desc 구조체의 시작 주소를 가지게 되고, 실패하면 R5에 0값을 대입한다.

섹션 .arch.info.init 영역은 컴파일 시에 MACHINE_START define 에 의해서 저장되게 된다.
include/asm-arm/mach/arch.h 에 정의 되어 있다.

#define MACHINE_START(_type,_name)
          \
static const struct machine_desc __mach_desc_##_type    \
 __attribute_used__                 \
 __attribute__((__section__(".arch.info.init"))) = {    \
    .nr     = MACH_TYPE_##_type,        \
    .name       = _name,
MACH_TYPE_##_type 은 arch/arm/tools/mach-types 에 그 값들이 정의 되어 있다.

각 arch 별로 아래와 같은 정의가 존재한다.

// arch/arm/mach-s3c2410/mach-smdk2410.c
MACHINE_START(SMDK2410, "SMDK2410")
// arch/arm/mach-realview/realview_eb.c
MACHINE_START(REALVIEW_EB, "ARM-RealView EB“)
Posted by blee
,