操作系统实战 45 讲
彭东
网名 LMOS,Intel 傲腾项目关键开发者
65203 人已学习
新⼈⾸单¥68
登录后,你可以任选4讲全文学习
课程目录
已完结/共 60 讲
尝尝鲜:从一个Hello到另一个Hello (2讲)
特别放送 (1讲)
操作系统实战 45 讲
15
15
1.0x
00:00/00:00
登录|注册

30 | 部门响应:设备如何处理内核I/O包?

systick设备中断回调函数
打开与关闭设备
配置设备和驱动
systick设备驱动程序的入口
systick设备驱动程序的整体框架
调用设备驱动
发送设备IO
删除objnode_t结构
建立objnode_t结构
设计I/O包的数据结构
I/O包的定义
思考题
建立了systick驱动程序实例
使设备完成相应的功能
为了搞清楚设备如何处理I/O包
驱动程序实例
向设备发送I/O包
创建和删除I/O包
什么是I/O包
重点回顾
驱动程序实例

该思维导图由 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
立即购买
登录 后留言

全部留言(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-21
    9
  • springXu
    因为内核的调度器也要被激活。如果没定时器中断,调度器的激活貌似只能靠其他中断,比如用户结束进程,或者进程抢占了其他被锁资源,才能激活进程调度器。

    作者回复: 正确 正确

    2021-07-16
    13
  • 罗 乾 林
    进程调度发生在用户态和内核态切换,如果一个应用程序只在用户态做计算不进行系统调用,系统将没有机会完成进程调度。定时器的出现就能打破这一问题,使系统进入中断处理程序,进而完成进程调度

    作者回复: 正确 老铁

    2021-07-16
    4
  • 青玉白露
    因为进程根本不知道自己执行了多久的CPU,所以需要时钟来提醒他,并且在超时的时候强制进行进程调度。

    作者回复: 是的 是的

    2021-08-27
    1
  • LDxy
    I/O 包这个概念第一次听说

    作者回复: 我搞 很多 新名词概念 哈哈

    2021-07-16
    2
    1
  • 艾恩凝
    打卡,看简单,调程序 又花了点时间

    作者回复: 哈哈

    2022-05-08
  • Entropy
    如果产生时钟中断,那么此时cpu不是要切换上下文来执行中断回调函数systick_handle吗? 如果是,那么调用krlsched_retn_currthread()是不是返回的是中断处理函数所在的进程,所以之前被切换的进程计时不会加1?

    作者回复: 只有进程上下文

    2021-08-25
    3
  • pedro
    因为之前实现的调度主要看优先级和运行时间,如果没有 systick 中断来记录运行时间,那么调度器就无法根据运行时间来强制休眠高优先级进程,高优先级进程将会霸占CPU。

    作者回复: 是的 铁汁

    2021-07-16
收起评论
显示
设置
留言
8
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部