[code]asmlinkage void __init start_kernel(void) printk(KERN_NOTICE "%s", linux_banner); setup_arch(&command_line);//獲取command_line printk(KERN_NOTICE "Kernel command line: %s\n", boot_command_line); console_init(); //控制台初始化 //setup_arch //1.獲取並解析cmdline //2.設置頁表 //3.初始化一些板級硬件 void __init setup_arch(char **cmdline_p) mdesc = setup_machine(machine_arch_type); if (mdesc->boot_params) tags = phys_to_virt(mdesc->boot_params); //獲取tag的虛擬地址 if (tags->hdr.tag == ATAG_CORE) { if (meminfo.nr_banks != 0) squash_mem_tags(tags); save_atags(tags); parse_tags(tags);//parse_tags } paging_init(mdesc); devicemaps_init(mdesc); if (mdesc->map_io) mdesc->map_io(); //對於smdkc100 static void __init smdkc100_map_io(void) { s5p_init_io(NULL, 0, S5P_VA_CHIPID); s3c24xx_init_clocks(12000000);//初始化時鐘 s3c24xx_init_uarts(smdkc100_uartcfgs, ARRAY_SIZE(smdkc100_uartcfgs));//初始化串口 } //對於tty void __init console_init(void) call = __con_initcall_start; while (call < __con_initcall_end) { (*call)(); call++; } __con_initcall_start,__con_initcall_end 在哪兒定義 grep -r "__con_initcall_start" ./ ./arch/cris/kernel/vmlinux.lds.S __con_initcall_start = .; *(.con_initcall.init) __con_initcall_end = .; .con_initcall.init 在哪兒定義 grep -r ".con_initcall.init" ./ ./include/linux/init.h #define console_initcall(fn) \ static initcall_t __initcall_##fn \ __used __section(.con_initcall.init) = fn //console_initcall宏,例如。 console_initcall(serial8250_console_init); static initcall_t __initcall_serial8250_console_init __used __section(.con_initcall.init) = serial8250_console_init ; 對於s3c24xx平台 console_initcall(s3c_serial_console_init) static struct console s3c24xx_serial_console = { .name = S3C24XX_SERIAL_NAME, .device = uart_console_device, .flags = CON_PRINTBUFFER, .index = -1, .write = s3c24xx_serial_console_write, .setup = s3c24xx_serial_console_setup }; int s3c24xx_serial_initconsole(struct platform_driver *drv, struct s3c24xx_uart_info **info) { register_console(&s3c24xx_serial_console); return 0; } //根據register_console來選擇終端 void register_console(struct console *newcon) if (strcmp(console_cmdline[i].name, newcon->name) != 0) //名字匹配 continue; if (newcon->index < 0) newcon->index = console_cmdline[i].index;//index newcon->setup(newcon, console_cmdline[i].options) //更具cmdline 設置serial總結:
xxxx_serial_console結構鏈入全局鏈表console_driver中,並且與啟動參數
console=ttySAC0和struct console中的name與index比較,如果相符,就
從這個控制台輸出。