30 | 部门响应:设备如何处理内核I/O包?
LMOS
该思维导图由 AI 生成,仅供参考
你好,我是 LMOS。
在上一课中,我们实现了建立设备的接口,这相当于制定了部门的相关法规,只要遵守这些法规就能建立一个部门。当然,建立了一个部门,是为了干活的,吃空饷可不行。
其实一个部门的职责不难确定,它应该能对上级下发的任务作出响应,并完成相关工作,而这对应到设备,就是如何处理内核的 I/O 包,这节课我们就来解决这个问题。
首先,我们需要搞清楚什么是 I/O 包,然后实现内核向设备发送 I/O 包的工作。最后,我还会带你一起来完成一个驱动实例,用于处理 I/O 包,这样你就能真正理解这里的来龙去脉了。
什么是 I/O 包
就像你要给部门下达任务时,需要准备材料报表之类的东西。同样,内核要求设备做什么事情,完成什么功能,必须要告诉设备的驱动程序。
内核要求设备完成任务,无非是调用设备的驱动程序函数,把完成任务的细节用参数的形式传递给设备的驱动程序。
由于参数很多,而且各种操作所需的参数又不相同,所以我们就想到了更高效的管理方法,也就是把各种操作所需的各种参数封装在一个数据结构中,称为 I/O 包,这样就可以统一驱动程序功能函数的形式了。
思路理清以后,现在我们来设计这个数据结构,如下所示。
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
- 深入了解
- 翻译
- 解释
- 总结
本文深入介绍了设备如何处理内核I/O包的相关内容,围绕着设备处理内核I/O包展开,深入浅出地介绍了相关的技术细节和实现方法。文章首先解释了I/O包的概念,以及创建和删除I/O包的方法。其次,详细介绍了向设备发送I/O包的过程,包括定义发送设备I/O的函数和调用设备驱动的步骤。最后,通过实现一个systick设备驱动程序的示例,展示了如何实现一个真实而简单的设备驱动程序。文章内容涵盖了设备驱动程序的整体框架、驱动程序入口、配置设备和驱动、打开与关闭设备等方面的内容,为读者提供了全面的设备处理内核I/O包的概览。 在实现systick驱动程序的过程中,文章重点介绍了systick设备中断回调函数的重要性,以及在中断回调函数中执行的操作。通过展示中断回调函数的实现和调用,读者可以深入了解如何处理设备产生的中断以及在中断回调函数中执行特定操作的方法。此外,文章还强调了更新进程运行时间的重要性,并展示了如何在中断回调函数中调用相关函数来实现这一目的。 总的来说,本文通过具体的示例和详细的技术讲解,使读者能够快速了解设备处理内核I/O包的基本原理和实现过程,为读者提供了一份全面而实用的技术指南。
仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《操作系统实战 45 讲》,新⼈⾸单¥68
《操作系统实战 45 讲》,新⼈⾸单¥68
立即购买
© 版权归极客邦科技所有,未经许可不得传播售卖。 页面已增加防盗追踪,如有侵权极客邦将依法追究其法律责任。
登录 后留言
全部留言(8)
- 最新
- 精选
- neohope置顶一、数据结构 objnode_t表示一个IO包,包括了各种操作所需的各种参数 二、 向设备发送 I/O 包 krldev_io->krldev_call_driver->通过函数指针,调用设备驱动指定功能编号的功能函数 所有驱动功能函数,都会传入objnode_t参数 三、 8254初始化 在上一节中,完成了8254设备的初始化及驱动的初始化,并启用了8254硬件中断 其中,在初始化驱动时: systick_entry->krlnew_devhandle->krladd_irqhandle->hal_add_ihandle 将intserdsc_t结构【包括驱动回调函数】,挂载到了intfltdsc_t.i_serlist中 四、8254中断调用链 1、8254产生硬件中断 2、CPU收到中断,通过中断处理表IDT,找到中断门,通过门检查后,会找到中断处理入口,然后找到硬件中断分发函数hal_hwint_allocator 【第一个参数为中断编号,在rdi;第二个参数为中断发生时的栈指针,在rsi】 调用硬件中断处理函数hal_do_hwint 3、hal_do_hwint 如有必要,结束硬件中断 调用中断回调函数hal_do_hwint->hal_run_intflthandle 4、hal_run_intflthandle 先获取intfltdsc_t中断异常表 然后调用intfltdsc_t中,i_serlist上所有挂载intserdsc_t 结构中的中断处理的回调函数s_handle 5、8254回调函数为systick_handle 6、systick_handle 更新进程的tick,如果超出20毫秒,让出CPU使用权限,进行进程调度
作者回复: 对的,老哥总结到位
2021-07-219 - springXu因为内核的调度器也要被激活。如果没定时器中断,调度器的激活貌似只能靠其他中断,比如用户结束进程,或者进程抢占了其他被锁资源,才能激活进程调度器。
作者回复: 正确 正确
2021-07-1613 - 罗 乾 林进程调度发生在用户态和内核态切换,如果一个应用程序只在用户态做计算不进行系统调用,系统将没有机会完成进程调度。定时器的出现就能打破这一问题,使系统进入中断处理程序,进而完成进程调度
作者回复: 正确 老铁
2021-07-164 - 青玉白露因为进程根本不知道自己执行了多久的CPU,所以需要时钟来提醒他,并且在超时的时候强制进行进程调度。
作者回复: 是的 是的
2021-08-271 - LDxyI/O 包这个概念第一次听说
作者回复: 我搞 很多 新名词概念 哈哈
2021-07-1621 - 艾恩凝打卡,看简单,调程序 又花了点时间
作者回复: 哈哈
2022-05-08 - Entropy如果产生时钟中断,那么此时cpu不是要切换上下文来执行中断回调函数systick_handle吗? 如果是,那么调用krlsched_retn_currthread()是不是返回的是中断处理函数所在的进程,所以之前被切换的进程计时不会加1?
作者回复: 只有进程上下文
2021-08-253 - pedro因为之前实现的调度主要看优先级和运行时间,如果没有 systick 中断来记录运行时间,那么调度器就无法根据运行时间来强制休眠高优先级进程,高优先级进程将会霸占CPU。
作者回复: 是的 铁汁
2021-07-16
收起评论