cosmos为简化驱动的设计,把程序和内核链接到一起,省略了加载驱动的过程,cosmos自动加载驱动,在驱动中注册相应的设备;
流程:内核初始化驱动,内核扫描驱动表,加载一个驱动,创建driver_t 结构,调用驱动入口函数,驱动开始运行,创建device_t 结构,向内核注册设备,查看是否还有驱动,初始化完成;
驱动程序表:
drventyexit类型 ,就是函数指针数组,存放驱动入口函数;init_krl 函数调用init_krldriver 函数;
init_krldriver 函数:遍历驱动程序表的每个驱动程序入口,并作为参数传给krlrun_driverentry 函数;
运行驱动程序:
调用驱动程序入口函数:
krlrun_driverentry 函数:先调用new_driver_dsc函数,建立一个driver_t 结构;用驱动描述符指针 drvp 指向;然后调用drventry 函数,运行程序入口函数;最后调用krldriver_add_system 函数,把驱动程序加入系统;
驱动入口函数流程:
首先要建立建立一个设备描述符,接着把驱动程序的功能函数设置到 driver_t 结构中的 drv_dipfun 数组中,并将设备挂载到驱动上,然后要向内核注册设备,最后驱动程序初始化自己的物理设备,安装中断回调函数
设备挂载到驱动:
krldev_add_driver 函数,遍历这个驱动上所有设备;比较设备id 有相同的则返回错误,将设备挂载到驱动上;
向内核注册设备:
krlnew_device 函数:遍历设备类型表上的所有设备,检查有无设备id冲突,没有的话就加入全局设备链表中;再加入对应设备类型的链表中;最终通过设备id找到对应设备;
安装中断回调函数:
该函数是驱动程序提供,内核提供接口安装该函数;
krlnew_devhandle 安装接口函数:调用内核层中断框架接口 krladd_irqhandle 函数;
krladd_irqhandle 函数:创建一个intserdsc_t结构,保存设备和驱动程序提供的回调函数,中断处理框架和设备驱动相联系;
中断处理框架找到对应的intserdsc_t结构,又能从 该结构中得到回调函数和设备描述符,继而调用回调函数,执行中断;
驱动加入内核:
krldriver_add_system 挂载函数:将driver_t 结构挂载到全局驱动程序链表上,并增加驱动程序计数变量;
标签:函数,16,driver,内核,注册,驱动,设备,驱动程序 From: https://www.cnblogs.com/xuan01/p/17365488.html