Linux操作系统内核实验指导

上传人:我*** 文档编号:133098964 上传时间:2020-05-24 格式:PDF 页数:81 大小:720.17KB
返回 下载 相关 举报
Linux操作系统内核实验指导_第1页
第1页 / 共81页
Linux操作系统内核实验指导_第2页
第2页 / 共81页
Linux操作系统内核实验指导_第3页
第3页 / 共81页
Linux操作系统内核实验指导_第4页
第4页 / 共81页
Linux操作系统内核实验指导_第5页
第5页 / 共81页
点击查看更多>>
资源描述

《Linux操作系统内核实验指导》由会员分享,可在线阅读,更多相关《Linux操作系统内核实验指导(81页珍藏版)》请在金锄头文库上搜索。

1、Linux操作系统内核实验指导 编著 张鸿烈 2008 2009 实验进度表 Linux内核实验和考查进度表 周次学时实验题目实验内容实验准备考查内容 1 4观察 Linux 行为编 程 从 proc 获 取内核信息 调 试跟踪内核行为 收集实验数据 熟悉内核开发 编程环境 准备和编写下 次实验的内容 考查本次实验 程序执行结果 2 4Shell 命令解析编 写 Shell 命 令 解释程序 调试 跟踪解释程序功 能 收集实验数据 编写和提交上 次实验报告 准备和编写下 次实验的内容 考查本次实验 程序执行结果 考查上次实验 报告 评定实 验成绩 3 4内核定时编程测试内核时 间控制 测量和

2、监控多线程并发 执行的时间 测试 和收集实验数据 编写和提交上 次实验报告 准备和编写下 次实验的内容 考查本次实验 程序执行结果 考查上次实验 报告 评定实 验成绩 4 4内核模块设计和调试可动 态加载的内核模 块 测试和收集实 验数据 编写和提交上 次实验报告 准备和编写下 次实验的内容 考查本次实验 程序执行结果 考查上次实验 报告 评定实 验成绩 5 4系统调用设计和调试系统 调用 跟踪添加的 系统调用功能 测试和收集实验 数据 编写和提交上 次实验报告 准备和编写下 次实验的内容 考查本次实验 程序执行结果 考查上次实验 报告 评定实 验成绩 6 4同步机制 共享内存 设计和调试内核

3、 同步机制 虚拟 内 存 缺 页 情 况 测试和收集实验 数据 编写和提交上 次实验报告 准备和编写下 次实验的内容 考查本次实验 程序执行结果 考查上次实验 报告 评定实 验成绩 7 4字符设备驱动设计和调试可动 态加载的虚拟字 符设备驱动 测试 和收集实验数据 编写和提交上 次实验报告 准 备和编写下次 实验的内容 考查本次实验 程序执行结果 考查上次实验 报告 评定实 验成绩 8 4文件系统编程探测内核文 件系统的内部机 制 测试和收集实 验数据 编写和提交上 次实验报告 准 备和编写下次 实验的内容 考查本次实验 程序执行结果 考查上次实验 报告 评定实 验成绩 9 4块符设备驱动设计

4、和调试可动 态加载的虚拟块 符设备驱动 测试 和收集实验数据 编写和提交上 次实验报告 总 结和补充各次 实验的内容 考查本次实验 程序执行结果 综合考查各次 实验 总评实 验成绩 实验进度表 备注 备注 按时提交实验报告 独立完成实验且实验报告内容充实的成绩为良好 实验内容有创 新的成绩提升一级 实验报告内容不充实的降低一级 没按时提交实验报告的降低一级 实验学时数不包括实验准备时间 目录 目录 第一章 第一章 LINUXLINUX 操作系统内核实验环境操作系统内核实验环境 3 3 1 1 内核编程的特点 3 1 1 1 使用 GNU C 编写和开发内核程序 3 1 1 2 不能使用标准的

5、C 函数库 4 1 1 3 没有内存保护机制 4 1 1 4 不要轻易在内核中使用浮点数 4 1 1 5 容量小而且长度固定的内核栈 4 1 1 6 要求同步和并发的编程方法 5 1 1 7 可移植性的重要性 5 1 2 编译内核的方法 5 1 2 1 内核编译参数的配置 6 1 2 2 内核映像和模块文件的生成 6 1 2 3 内核的安装和启动 7 1 3 内核的调试技术 8 1 3 1 内核调试配置选项 8 1 3 2 内核中的打印函数 printk 8 1 3 4 oops 机制 9 第二章 第二章 LINUXLINUX 内核实验内容内核实验内容 1212 2 1 PROC 文件系统实验

6、 12 2 1 1 Proc 文件系统简介 12 2 1 2 pro 文件系统的目录结构 12 2 1 3 Proc 文件系统中的进程目录 13 2 1 4 proc 文件系统的实验程序样例 14 2 1 4 实验问题 17 2 2 SHELL 命令解释系统设计实验 18 2 2 1 设计自己的 shell 系统得意义 18 2 2 2 linx 中管道的类型 18 2 2 3 一个简易的 shell 解释系统样例 18 2 2 4 实验问题 21 2 3 内核的定时机制实验 22 2 3 1 内核定时机制的功能和作用 22 2 3 2 系统时间的获取和内核定时机制 22 2 3 3 利用内核

7、的定时机制测试应用程序的例子 23 2 3 4 实验问题 26 2 4 动态模块设计实验 27 2 4 1 内核动态模块的的功能和作用 27 2 4 2 模块最基本的框架 27 2 4 3 动态模块的编译 27 2 4 4 与动态模块有关的 Shell 命令 28 2 4 5 模块安装时携带的可选参数 28 1 目录 2 4 6 在模块中使用内核的 proc 接口 29 2 4 7 利用动态模块创建 Proc 文件的样例 30 2 4 8 实验问题 32 2 5 设计新系统调用实验 33 2 5 1 在内核源代码中引入用户自定义系统调用入口 33 2 5 2 在用户空间访问新加入的系统调用 3

8、4 2 5 3 实验问题 34 2 6 构造新的内核同步机制实验 35 2 6 1 同步机制设计的总体思路 35 2 6 2 设计事件的数据结构和系统调用函数 35 2 6 3 测试设计的同步机制 38 2 6 4 实验问题 40 2 7 字符设备驱动程序实验 41 2 7 1 设备编号的内部表示 41 2 7 2 加载并建立设备文件 41 2 7 3 字符设备的注册 43 2 7 4 设备中断处理 43 2 7 5 模拟字符设备的例题 44 2 7 6 实验问题 55 2 8 文件系统实验 56 2 8 1 安装点对象 56 2 8 2 索引 i 节点对象 活动 i 节点 56 2 8 3

9、目录项对象 57 2 8 4 文件对象 57 2 8 5 VFS 文件系统其他辅助数据结构 58 2 8 6 与进程相关的文件系统数据结构 59 2 8 7 从当前进程访问内核 VFS 文件系统的例子 59 2 8 8 实验问题 60 2 9 块设备驱动程序实验 61 2 9 1 块设备的接口和注册 61 2 9 2 块设备的建立 61 2 9 3 块设备操作 62 2 9 4 块设备的请求处理 62 2 9 5 一个简化了的 RAM 盘块设备驱动 sbull 65 2 9 6 实验问题 77 参考教材 78 2 Linux内核实验 第一章 第一章 LinuxLinux 操作系统内核实验环境操

10、作系统内核实验环境 1 1 1 1 内核编程的特点内核编程的特点 相对于用户空间的应用程序 内核开发有很大的不同 最重要的差异包括以下几点 内核编程时不能访问C 库 内核编程时必须使用GNU C 内核编程时缺乏像用户空间那样的内存保护机制 内核编程时浮点数很难使用 内核只有一个很小的定长堆栈 内核支持异步终端 抢占和SMP 因此内核编程时必须时刻注意同步和并发 内核编程要考虑可移植性 1 1 1 1 1 1 使用使用 GNU C GNU C 编写和开发内核程序编写和开发内核程序 Linux 内核使用 C 语言编写的 但 Linux 内核开发总是要用到一些 gcc 提供的 C 语言扩充部分 gc

11、c 是GNU 编译器的集合 它包含了可以用于编译操作系统内核的C语言的扩展 内核开发者使用的C语言涵盖了 ISO C99和 GUN C 扩展特性 与标准 C 有区别 主要的扩展有 1 内联函数 inline 内联函数在它所调用的位置上展开 从而消除了函数调用和返回的开销 由于编译器会把内联函数 在调用函数的代码处展开 所以也便于代码的优化 不过篇幅较大的程序段做成内联函数会使程 序变长 通常把那些执行时间要求短且函数代码也比较短的函数定义成内联函数 内联函数必须在调用之前定义好 通常在头文件或 C文件开始的地方定义好内联函数 内联函数 使用static inline 关键字限制 以便编译时不会

12、为内联函数单独建立一个函数体 例如 static inlinestatic inline void dog unsigned long tail size 2 内联汇编 Gcc 编译器支持 在C函数中嵌入汇编指令 当然 在内核编程时 只有知道对应的体系结构 才 能使用这个功能 Linux 的内核混合使用了 C 和汇编语言 在接近体系结构的底层或对执行时间要求严格的地方 一般嵌入汇编语言 而内核其他部分的大部分代码是用C语言写的 3 分支优化 对于条件选择语句 gcc 内建了一条优化指令 在一个条件经常出现 或者很少出现时 编译可 以根据这条指令对条件分支选择进行优化 内核把这条指令封装成了宏

13、likely 和 unlikely 例如 if foo 3 Linux内核实验 如果这个选择的条件大多数情况都为假 则可以改进为 if unlikely foo 反之 这个选择的条件大多数情况都为真 则可以改进为 if likely foo 1 1 2 1 1 2 不能使用标准的不能使用标准的 C C 函数库 函数库 与用户空间的应用程序不同 内核不能链接使用标准的 C 函数库 主要的原因在于对于内核来 说完整的C库太大了 但大部分常用的 C 库函数在内核中都已经实现了 比如操作字符串的函数组 就位于内核文件lib string c 中 只要包含 就可以使用它们 注意 内核程序 中包含的头文件

14、是指内核代码树中的内核头文件 不是指的开发应用程序时的外部头文件 内核 代码是无法调用外部库函数的 在内核中实现的库函数最著名的当数函数printk 它是库函数printf 的内核版本 Printk 和 printf 有基本相同的用法和功能 一个显著的区别是 printk 可以带有一个优先级标志 syslog 程序会根据这个优先标志决定在什么地方显示这条系统消息 例如 Printk KERN ERR this is an error n 1 1 3 1 1 3 没有内存保护机制没有内存保护机制 如果一个用户程序试图进行一次非法的内存访问 内核会发现这个错误并结束整个用户进程 但内核自己非法访问

15、了内存 那后果就很难控制了 内核中发生的内存错误会导致oops这是内核 中出现的最常见的一类错误 在内核中 不应该去非法内存访问 引用空指针指类的操作 否则 系统将会死掉 并没有任何错误提示 此外 内核中的内存都不分页 也就是说每用掉一个字节 物理内存就减少一个字节 1 1 4 1 1 4 不要轻易在内核中使用浮点数不要轻易在内核中使用浮点数 在用户空间的进程进行浮点操作的时候 内核会完成从整数到浮点数操作的模式转换 在执行浮 点指令时倒地会做些什么 则因体系结构的不同 内核的选择也不同 和用户空间不同 内核并不能完美的支持浮点操作 在内核中使用浮点数时 除了要人工保存 和恢复浮点寄存器外还有

16、一些琐碎的事情要做 为了避免麻烦通常不在内核中使用浮点数 1 1 5 1 1 5 容量小而且长度固定的内核栈容量小而且长度固定的内核栈 用户空间的程序可以从栈上分配大量的空间来存放变量 甚至用栈存放巨大的数据结构或者数 组都没问题 之所以能这样做是因为应用程序是非常驻内存的 它们可以动态的申请和释放所有 4 Linux内核实验 可用的内存空间 内核要求使用固定常驻的内存空间 因此要求尽量少的占用常驻内存 而尽量多的留出内存提 供给用户程序使用 因此内核栈的长度是固定大小的 不可动态增长的 32 位机的内核栈是 8KB 64位机的内核栈是 16KB 1 1 6 1 1 6 要求同步和并发的编程方法要求同步和并发的编程方法 内核很用以引起竞争条件 和单线程的用户空间程序不同 内核的许多特性要求能够并发的访 问能散居据结构 这就要求有同步机制保证不出现竞争条件 特别是 Linux 内核支持多处理器的并发处理 所以如果没有适当的保护 在两个或两个以上的处理 器上运行的代码很可能会同时访问共享的同一个资源 中断是异步到来的 完全不顾及当前正在执行的代码 如果不加以适当的保护 中断完全有 可能在代

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 办公文档 > 教学/培训

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号