기존 이솝 임베디드 포럼의 지식인 서비스가 게시판 형태로 변경되었습니다.

linux/arch/arm/mach-at91/ 폴더에 있는 board-sam9m10g45ek.c 파일은 무엇에 쓰이는 함수들인가요?

제가 이 위치에 있는 board-sam9m10g45ek.c 를 함 살펴보니..

 

왠지 펌웨어 하던 시절에 제가 짰던 시작 코드 부분인듯해서요...왠지 죽 흘터보니..보드의 설정등에 쓰이는 함수들의

모임인듯 한데요...여기에 있는 함수들이 보드 셋업 부분이 맞나요?

 

그리고 만약 셋업 부분이라면 이 함수들을 어딘가에서는 사용해야 할 텐데 어디서 어떤 함수에서 사용되는 것인가요?

 


freestyle

2012.03.09 03:47:35
*.33.89.239

* 잘못된 내용이 포함되었을 수 있습니다. 참고만 하세요.


살펴보신 바와 같이 해당 보드에 대한 설정(레지스터 세팅 등)을 해주는 부분입니다.


호출과정의 실마리를 찾기 위해서는 파일 가장 아래의 다음 부분을 보셔야 합니다.


MACHINE_START(AT91SAM9M10G45EK, "Atmel AT91SAM9M10G45-EK")

    /* Maintainer: Atmel */

    .timer      = &at91sam926x_timer,

    .map_io     = at91_map_io,

    .init_early = ek_init_early,

    .init_irq   = at91_init_irq_default,

    .init_machine   = ek_board_init,

MACHINE_END



MACHINE_START, MACHINE_END는 arch/arm/include/asm/mach/arch.h에 선언된 매크로로,

struct machine_desc 구조체 변수를 선언해 .arch.info.init 영역(arch/arm/kernel/vmlinux.lds.S)에 저장해 줍니다. 


(struct machine_desc 구조체의 선언은 arch/arm/include/asm/mach/arch.h에 있습니다)


부팅 과정에서 이 구조체의 멤버 변수로 등록된 함수 포인터를 따라가 함수를 실행시켜 주는 형태인데,

예를 들어 보면 

    .init_early = ek_init_early,에서 .init_early에 등록한 함수 포인터는

arch/arm/kernel/setup.c의 setup_arch에서 호출해주고,

setup_arch는 init/main.c의 start_kernel에서 호출해 줍니다.

start_kernel은 arch/arm/kernel/head-common.S에서 호출해 주고요.



장황하게 설명했는데 정리하면

'매크로 확장이 되면 함수 포인터 등을 멤버로 하는 구조체 변수가 선언되고,

이렇게 등록된 함수들은 초기화 과정(init/main.c)에서 초기화 함수에 의해 각각 호출되어 해당 보드의 특성에 맞는 초기화를 수행한다'

입니다.

고도리

2012.03.09 04:57:27
*.200.239.234

보통 Machine code라고 불리우는 코드입니다.


ARM에서 Machine은 Board를 지칭한다라고 보시면 됩니다.

거기 있는 함수들은 


커널 start시 setup_arch() 함수에서 특정 함수 포인터로 세팅이 되고, 각 단계별 함수에서 초기화시 호출이 됩니다.

초기화 코드라고 보시면 되고, 호출되는 순서는 각 단계별 함수를 봐야 알 수 있습니다.

List of Articles
번호 제목 글쓴이 날짜 조회 수

사용자 로그인