Re: [問題] printf/printk 在 embedded linux 到 s …

看板LinuxDev作者 (Sincerely Yours.)時間16年前 (2009/02/02 09:38), 編輯推噓0(000)
留言0則, 0人參與, 最新討論串3/3 (看更多)
printk 初始化 以 ARM7 S3C4510 + Linux 2.2.x 為例, 2.4.x 或 2.6.x 可能方法不同, 但是我想概念是一樣的 1. ./linux/init/main.c: asmlinkage void __init start_kernel(void) 中 ... printk(linux_banner); 呼叫 ./linux/kernel/printk.c 2. ./linux/kernel/printk.c: asmlinkage int printk(const char *fmt, ...) 中 if (msg_level < console_loglevel && console_drivers) { struct console *c = console_drivers; while(c) { if ((c->flags & CON_ENABLED) && c->write) c->write(c, msg, p - msg + line_feed); c = c->next; } } 表示有一 console_drivers 實體, 呼叫了 c->write(c, msg, p - msg + line_feed); 此函式指標 此 console_drivers 目前是存在 buffer 中, 沒有實體可以印出 但是 ./linux/init/main.c: 之後有 memory_start = console_init(memory_start,memory_end); 3. ./linux/drivers/char/tty_io.c: long __init console_init(long kmem_start, long kmem_end) 其中有呼叫 kmem_start = serial_console_init(kmem_start, kmem_end); 4. ./linux/arch/arm/special/serial-s3c4.c: __initfunc (long serial_console_init(long kmem_start, long kmem_end)) 其中 register_console(&sercons); 註冊了 sercons 此實體 5. ./linux/kernel/printk.c: void register_console(struct console * console) 其中有 console_drivers = console; 把 printk 的 console_drivers 指向上述的 sercons 實體 此 sercons 實體包含了 static struct console sercons = { "ttyS", serial_console_write, NULL, serial_console_device, serial_console_wait_key, NULL, serial_console_setup, CON_PRINTBUFFER, -1, 0, NULL }; 等函式指標, 其中 serial_console_write 並將先前留在緩衝區的內容印出 6. ./linux/arch/arm/special/serial-s3c4.c: static void serial_console_write(struct console *co, const char *s, unsigned count) 為真正 printk 時所呼叫的 UART1 硬體 7. 爾後, 要 printk 時, 就會呼叫 c->write(c, msg, p - msg + line_feed); 就會呼叫到真正的函式指標 serial_console_write -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 60.250.138.121
文章代碼(AID): #19Xaw8eH (LinuxDev)
文章代碼(AID): #19Xaw8eH (LinuxDev)