Skip to content

15 控制台初始化tty init:字符是怎么显示在屏幕上的?

你好,我是闪客。

上一讲我们说到,继内存管理结构 mem_map 和中断描述符表 idt 建立好之后,我们又通过 blk_dev_init 在内存中倒腾出了一个新的数据结构 request,并且把它们都放在了一个 request[32] 数组中。

这是块设备驱动程序内存缓冲区的桥梁,通过它我们就可以完整地表示出一个块设备读写操作要做的事。

控制台初始化 tty_init

我们继续往下来看tty_init。

// init/main.c
void main(void) {
    ...
    tty_init();
    ...
}

这个方法执行完成之后,我们将会具备从键盘输入字符、到显示器输出字符这个最常用的功能,这时我们能直观感受到操作系统有了点交互性!

打开这个函数后我有点慌。

// kernel/chr_drv/tty_io.c
void tty_init(void)
{
    rs_init();
    con_init();
}

看来这个方法已经多到需要拆成两个子方法了,不好对付!

打开第一个方法,发现还好。

// kernel/chr_drv/serial.c
void rs_init(void)
{
    set_intr_gate(0x24,rs1_interrupt);
    set_intr_gate(0x23,rs2_interrupt);
    init(tty_table[1].read_q.data);
    init(tty_table[2].read_q.data);
    outb(inb_p(0x21)&0xE7,0x21);
}