一、计算机的结构
芯片并非独立存在,而是以总线为基础链接在一起的,相互配合,共同实现用户的要求的功能。 总线有层级关系,各种设备通过总线相连。
二、如何管理设备?
1.分而治之
每个设备对应一个设备控制代码模块,操作系统内核要控制哪个设备,就加载相应的设备代码模块,以后如果不使用这个设备,就可以删除对应的设备控制代码模块。
2.设备分类
操作系统内核所感知的设备,并不需要和物理设备对应,这取决于设备控制代码自身的行为。操作系统内核所定义的设备,可以成为内核设备或者逻辑设备。例如,NETWORK_DEVICE网络设备,不管它是有线网卡还是无线网卡,或者是设备控制代码虚拟出来的虚拟网卡.
3.设备驱动
将操作每个设备的相关代码独立出来——设备驱动程序。
1.设备
用一个包含设备类型、设备名称、设备状态、设备id、设备驱动程序等的数据结构来表示一个逻辑设备。在操作系统中建立这个数据结构的实例变量,就表示操作系统内核中存在一个逻辑设备了。用包括设备类型号、设备子类型号、设备序号的数据结构devid_t来表示设备ID,子设备号是为了解决多个相同设备的,还有一个指向设备驱动程序的指针,用于访问设备时调用设备驱动程序的。只要建立一个设备结构的实例变量,内核就能感知到设备的存在。
2.驱动
控制设备的代码就是驱动程序,定义一个数据结构来表示一个驱动程序,数据结构应该包含驱动程序名,驱动程序ID,驱动程序所管理的设备,最重要的是完成功能设备相关功能的函数。Cosmos内核每加载一个驱动程序模块,就会自动分配一个驱动程序结构数据并将其实例化。 Cosmos内核在首次启动程序时,就会调用这个驱动程序的入口点函数,在这个函数中驱动程序会分配一个设备数据结构,用相关信息将其实例化,比如填写正确的设备类型、设备ID号、设备名称等。 Cosmos内核负责建立驱动数据结构,而驱动程序又建立了设备数据结构。
3.设备驱动的组织
用一个叫做***设备表***的数据结构,来组织这些驱动程序数据结构和设备数据结构。 devtable_t(设备表)结构中,devtlst_t时每个设备类型一个,表示一类设备,但每一类可能有多个设备,所以在devtlst_t结构中,有一个设备计数和设备链表。Cosmos肯定需要一个devtable_t(设备表)数据结构的全局变量。 devtable_t 结构中能找到所有的设备和驱动,然后从设备能找到对应的驱动,从驱动也能找到其管理的所有设备 ,最后就能实现一个驱动管理多个设备。
4.驱动程序功能
驱动程序为操作系统内核提供哪些基本功能? 写驱动程序就是为了操控相应的设备,主要包括,输入数据、处理数据、输出数据,然后完成一些特殊功能。我们可以把每一个操作定义成一个函数,让驱动去实现这些函数。驱动driver_t结构中哪个函数指针数组drv_dipfun函数指针,正是存放上述那12个驱动程序函数的指针,这样,操作系统内核就能通过driver_t结构,调用对应的驱动程序函数操作对应的设备。
|