最新要闻

广告

手机

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案

家电

16 内核中注册设备_世界今亮点

来源:博客园

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 结构挂载到全局驱动程序链表上,并增加驱动程序计数变量;

关键词: