Re: [問題] printf/printk 在 embedded linux 到 s …
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
討論串 (同標題文章)
LinuxDev 近期熱門文章
PTT數位生活區 即時熱門文章