第二讲程序员技术手段 李 林 电子科技大学计算机学院
第二讲 程序员技术手段 李 林 电子科技大学 计算机学院
第二讲程序员技术手段 内核学习方法 。内核模块模型 修改内核源码 kgdb 阅读内核源码
第二讲 程序员技术手段 ◼ 内核学习方法 ◼ 内核模块模型 ◼ 修改内核源码 ◼ kgdb ◼ 阅读内核源码
第二讲程序员技术手段 内核学习方法 。内核模块模型 修改内核源码 kgdb 阅读内核源码
第二讲 程序员技术手段 ◼ 内核学习方法 ◼ 内核模块模型 ◼ 修改内核源码 ◼ kgdb ◼ 阅读内核源码
内核学习方法 本课程的目的不仅仅是了解Linux内核的基 本原理和结构特征 更重要的是掌握如何探索这些原理和特征的 方法 内核不断在进步,当前内核版本已经是5.6 而大部分内核书籍还是2.6.*,非常落后 开发环境是4.*.*,又当如何?
内核学习方法 ◼ 本课程的目的不仅仅是了解Linux内核的基 本原理和结构特征 ◼ 更重要的是掌握如何探索这些原理和特征的 方法 ◼ 内核不断在进步,当前内核版本已经是5.6 ◼ 而大部分内核书籍还是2.6.*,非常落后 ◼ 开发环境是4.*.*,又当如何?
内核学习方法 达到上述日的的方法:程序员手段 动手:利用程序员的手段,来了解、理解、掌 握Linux内核基本原理和关键技术 千万不能只看书 程序员手段 编写内核模块 驱动程序,站在内核使用者的角度,感性认识内核 了解内核的编程接口、关键数据结构 比如kmalloc、四级页表结构
内核学习方法 ◼ 达到上述目的的方法:程序员手段 ◼ 动手:利用程序员的手段,来了解、理解、掌 握Linux内核基本原理和关键技术 ◼ 千万不能只看书 ◼ 程序员手段 ◼ 编写内核模块 ◼ 驱动程序,站在内核使用者的角度,感性认识内核 ◼ 了解内核的编程接口、关键数据结构 ◼ 比如kmalloc、四级页表结构
内核学习方法 程序员手段 ·编写内核模块 ·调试内核及内核模块 帮助理解内核的内部处理流程、关键数据结构 比如sys clone的处理流程 阅读内核源码 修改内核源码 为内核增加新功能,验证新方法 比如增加新的系统调用,测试新的调度算法 汇编与反汇编 内核与体系结构关系密切,比如GDTR、CR3、int3
内核学习方法 ◼ 程序员手段 ◼ 编写内核模块 ◼ 调试内核及内核模块 ◼ 帮助理解内核的内部处理流程、关键数据结构 ◼ 比如sys_clone的处理流程 ◼ 阅读内核源码 ◼ 修改内核源码 ◼ 为内核增加新功能,验证新方法 ◼ 比如增加新的系统调用,测试新的调度算法 ◼ 汇编与反汇编 ◼ 内核与体系结构关系密切,比如GDTR、CR3、int 3
内核实证的好处 敢动手 对内核有感性认识,而不仅仅是背诵原理,今 后相关项目中上手快 破除误解 学了等于没学,内核知识感觉没什么用处 刺激学习 内核知识 体系结构 编译、链接、调试 黄
内核实证的好处 ◼ 敢动手 ◼ 对内核有感性认识,而不仅仅是背诵原理,今 后相关项目中上手快 ◼ 破除误解 ◼ 学了等于没学,内核知识感觉没什么用处 ◼ 刺激学习 ◼ 内核知识 ◼ 体系结构 ◼ 编译、链接、调试
第二讲程序员技术手段 内核学习方法 。内核模块模型 修改内核源码 kgdb 阅读内核源码
第二讲 程序员技术手段 ◼ 内核学习方法 ◼ 内核模块模型 ◼ 修改内核源码 ◼ kgdb ◼ 阅读内核源码
内核模块模型 驱动和一般应用程序的执行方式很大不同 一般应用由main函数开始执行,流程基本由程 序自身控制 驱动程序没有main函数,由回调方式驱动运行 回调方式: 先向内核注册函数,然后应用程序触发这些函 数的执行 例如:驱动程序在初始化时,向内核注册处理 某个设备写操作的函数 当应用程序使用write系统调用写该设备时,内 核就会调用注册的上述函数
内核模块模型 ◼ 驱动和一般应用程序的执行方式很大不同 ◼ 一般应用由main函数开始执行,流程基本由程 序自身控制 ◼ 驱动程序没有main函数,由回调方式驱动运行 ◼ 回调方式: ◼ 先向内核注册函数,然后应用程序触发这些函 数的执行 ◼ 例如:驱动程序在初始化时,向内核注册处理 某个设备写操作的函数 ◼ 当应用程序使用write系统调用写该设备时,内 核就会调用注册的上述函数
内核模块常见的回调函数(代码2.1) DriverInitialize 驱动初始化函数,通过宏静态注册 #insmod PrintModule.ko,安装驱动并触发该 函数,通常会创建设备对象 DriverUninitialize 驱动销毁函数,通过宏静态注册 #rmmod PrintModule,卸载驱动并触发该函数 DriverOpen 打开设备函数,动态注册 应用调用open函数打开设备对象时,会触发该 函数
内核模块常见的回调函数(代码2.1) ◼ DriverInitialize ◼ 驱动初始化函数,通过宏静态注册 ◼ #insmod PrintModule.ko,安装驱动并触发该 函数,通常会创建设备对象 ◼ DriverUninitialize ◼ 驱动销毁函数,通过宏静态注册 ◼ #rmmod PrintModule,卸载驱动并触发该函数 ◼ DriverOpen ◼ 打开设备函数,动态注册 ◼ 应用调用open函数打开设备对象时,会触发该 函数