안녕하세요. Kernel ARM10차생입니다.
회사에서 어찌어찌하다 보니 커널 포팅하게 되었는데 초반부터 막히게되어 답답해서
글을 올립니다.
init/main.c의 start_kerenl()에서
console_init();함수 부분에서 더 이상 부팅이 되지 않고 있습니다.(MIP계열 사용)
void __init console_init(void)
{
initcall_t *call;
/* Setup the default TTY line discipline. */
tty_ldisc_begin();
/*
* set up the console device so that later boot sequences can
* inform about problems etc..
*/
call = __con_initcall_start;
while (call < __con_initcall_end){
(*call)();
call++;
}
}
빨간색 부분부터 넘어가질 않고 있네요.
아마 __con_initcall_start에서 문제가 있지 않을까 싶은데...
드라이버는 drivers/serial 에서
8250_early.o 8250.o 8250_pci.o built-in.o serial_core.o
이렇게 컴파일 되어 있습니다.
도무지 어디서부터 어떻게 봐야할지 감이 오지 않아 많이 답답하네요.
조그만 댓글이라도 많은 도움이 될 것 같습니다.
조언 부탁드립니다.^^
.
안녕하세요.
답변이 이미 늦은건 아닌지..
아시다시피 __con_initcall_start ~ __con_initcall_end 영역 사이에는 console initialize 관련된 function pointer 들이 존재합니다. 즉, 문제가 되는 부분은 이 영역에 존재하는 함수들 중 하나가 무한루프를 돌거나 return 이 안되기 때문일 것입니다.(영역 내의 function pointer 들을 while 문을 이용해 순차적으로 호출함)
arch/${ARCH}/kernel/vmlinux.lds 를 보시면 __con_initcall_start ~ __con_initcall_end 영역이 존재하며 이 영역에 들어가게 되는 *(.con_initcall.init) 즉, con_initcall_init 으로 검색하시거나 objdump 혹은 readelf 를 사용하셔도 됩니다. 저는 보통 gdb 를 사용합니다.
gdb 를 통해 해당 함수들이 무엇인지 찾는 다면 아래와 같이 하시면 됩니다.
(arm 기준으로 제가 빌드한 vmlinux 를 가지고 설명드리겠습니다.)
gdb vmlinux
(gdb) p/x &__con_initcall_start
$4 = 0xc04b4e08
(gdb) p/x &__con_initcall_end
$5 = 0xc04b4e0c