OS-李治军-L26-IO与显示器

IO与显示器

核心问题,printf是如何打印到显示器上的呢?
如何让外设工作?CPU通过控制总线(PCI)对对应外设的控制卡发送信息,对应的REG接受下指令后,就让外设做相应的一些工作了。这些最终反映为OUT指令。等外设工作结束后,写中断处理指令。这两部分就构成了CPU控制外设工作的方法。向设备控制器写东西是非常繁琐的,因为寄存器地址、内容、格式、语义都不太一样......操作系统要给用户提供一个简单的视图-文件视图。设备驱动就由以上三部分构成,out-中断-文件视图。
一段操作外设的程序:
操作什么东西,都是要open一个/dev/下的文件,然后向里面read、write一些东西。

系统调用结果解释open,read,write,将其数据写到底层里面。下面是所谓的文件视图。

现在要将一个write、read命令解释为多个分支,向下链接到各个设备上去。
write进入内核后,执行的是sys_write函数,从PCB中的file读取一个文件出来,并取出文件的信息inode,其中包含的是要向哪输出的信息,具体如下:

而PCB都是fork来的,就是copy_process来的,那么可以确定flip是继承自父进程的,向上回溯,追踪到0号进程,在系统初始化的时候创建出来的。

进一步,看看open都干了:主要是为了得到inode!

核心就是建立这样一个链子,pcb中存放了filp,filp链接到file_table,file_table中每个file都对应了一个inode,其中存放了对应设备的一些重要信息,例如这里的/dev/tty0。

现在还有继续向下查找,inode到底是干什么的,如果我们向其中写入信息:
先从inode中判断,是不是字符设备,这个信息存放在inode->i_mode中,inode->i_zone[0]中存放的是设备号,然后从crw_table中根据dev查出函数指针,即处理方法。

而crw_table是一个函数指针的数组,其中的第4项(对应这里取出的显示器项目)是一个叫rw_ttyx的函数指针,而rw_ttyx函数中对写逻辑的处理是返回一个tty_write函数处理后的对象。tty_write函数就是实现输出的核心函数,其将输出放到缓存队列当中。

最后,tty_write就是真的向外设屏幕输出了

console_write()是包装out的东西,其实最后是mov,内存io映像的原理。

写设备驱动=写出核心的out指令、实现相关的功能函数、注册到表中。

在系统启动的时候,会将光标的位置放置在X090000

posted @ 2020-11-03 00:04  HermioneGranger  阅读(174)  评论(0)    收藏  举报