操作系统课程设计课件_第1页
操作系统课程设计课件_第2页
操作系统课程设计课件_第3页
操作系统课程设计课件_第4页
操作系统课程设计课件_第5页
已阅读5页,还剩47页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、2021/11/22操作系统课程设计PPT课件1操作系统课程设计操作系统课程设计2021/11/22操作系统课程设计PPT课件2内容简介内容简介设计目的设计目的设计内容设计内容实施方法及要求实施方法及要求时间安排时间安排辅导辅导2021/11/22操作系统课程设计PPT课件3设设 计计 目目 的的v掌握掌握LinuxLinux操作系统的使用方法;操作系统的使用方法;v了解了解LinuxLinux系统内核代码结构;系统内核代码结构;v掌握实例操作系统的实现方法。掌握实例操作系统的实现方法。2021/11/22操作系统课程设计PPT课件4内容简介内容简介设计目的设计目的设计内容设计内容实施方法及要

2、求实施方法及要求时间安排时间安排辅导辅导2021/11/22操作系统课程设计PPT课件5设设 计计 内内 容容(1)(1)要求:熟悉和理解要求:熟悉和理解LinuxLinux编程环境编程环境内容内容1 1)编写一个)编写一个C C程序,实现文件拷贝功能。程序,实现文件拷贝功能。2 2)编写一个)编写一个C C程序,使用程序,使用LinuxLinux下的图形库,分窗口显下的图形库,分窗口显示三个并发进程的运行。示三个并发进程的运行。#include http:/ 计计 内内 容容(2)(2)要求:掌握添加系统调用的方法要求:掌握添加系统调用的方法内容内容v采用编译内核的方法,添加一个新的系统调用

3、。采用编译内核的方法,添加一个新的系统调用。 v编写一个应用程序,测试新添加的系统调用。编写一个应用程序,测试新添加的系统调用。v系统调用的功能:文件拷贝。系统调用的功能:文件拷贝。2021/11/22操作系统课程设计PPT课件7设设 计计 内内 容容(3)(3)要求:掌握添加设备驱动程序的方法要求:掌握添加设备驱动程序的方法内容:内容:v采用模块方法,添加一个新的设备驱动程序。采用模块方法,添加一个新的设备驱动程序。 v要求添加字符设备的驱动。要求添加字符设备的驱动。v编写一个应用程序,测试添加的驱动程序。编写一个应用程序,测试添加的驱动程序。2021/11/22操作系统课程设计PPT课件8

4、设设 计计 内内 容容(4)(4)要求:理解和分析要求:理解和分析/ /procproc文件文件内容内容v了解了解/ /procproc文件的特点和使用方法。文件的特点和使用方法。v监控系统状态,显示系统中若干部件的使用情况。监控系统状态,显示系统中若干部件的使用情况。v用图形界面显示系统监控状态。用图形界面显示系统监控状态。2021/11/22操作系统课程设计PPT课件9设设 计计 内内 容容(5)(5)要求:理解和掌握文件系统的设计方法要求:理解和掌握文件系统的设计方法 (选做)(选做)内容内容v设计、实现一个模拟的文件系统。设计、实现一个模拟的文件系统。2021/11/22操作系统课程设

5、计PPT课件10内容简介内容简介设计目的设计目的设计内容设计内容实施方法及要求实施方法及要求时间安排时间安排辅导辅导2021/11/22操作系统课程设计PPT课件11实施方法及要求实施方法及要求每位同学都必须每位同学都必须独立独立完成课程设计内容。完成课程设计内容。 上机考核上机考核 演示完成的系统,并回答老师的问题。演示完成的系统,并回答老师的问题。 提交提交文本的课程设计报告,内容包括课程设计内容分析、程序清单文本的课程设计报告,内容包括课程设计内容分析、程序清单(附注释附注释)、调试记录(碰到的问题和解决方案)以及课程设计、调试记录(碰到的问题和解决方案)以及课程设计心得。心得。程序(电

6、子版)。程序(电子版)。 2021/11/22操作系统课程设计PPT课件12实施方法及要求(续)实施方法及要求(续)支持借鉴和学习已有的优秀知识!反对全盘拷贝,不求甚解!吸收和消化他人经验,做自己的课程设计!自学能力的培养:学会上网查资料、解决问题!2021/11/22操作系统课程设计PPT课件13内容简介内容简介设计目的设计目的设计内容设计内容实施方法及要求实施方法及要求时间安排时间安排辅导辅导2021/11/22操作系统课程设计PPT课件14课程设计时间:第一、二周课程设计时间:第一、二周答疑答疑南一楼南一楼804804EMAILEMAIL:郑伟德:郑伟德 郑郑 然然 考核考核系统、问答、

7、报告系统、问答、报告时间安排时间安排2021/11/22操作系统课程设计PPT课件15内容简介内容简介设计目的设计目的设计内容设计内容实施方法及要求实施方法及要求时间安排时间安排辅导辅导2021/11/22操作系统课程设计PPT课件16课程设计辅导课程设计辅导LinuxLinux系统的相关知识系统的相关知识v以以Redhat Linux 9.0Redhat Linux 9.0为例为例 添加系统调用添加系统调用添加设备驱动程序添加设备驱动程序/ /procproc文件分析文件分析2021/11/22操作系统课程设计PPT课件17Linux系统的相关知识系统的相关知识Linux版本版本 Linux

8、通过简单的编号来区别内核的稳定版和开发通过简单的编号来区别内核的稳定版和开发版。每个版本用三个数字描述,由圆点分隔。前两个数版。每个版本用三个数字描述,由圆点分隔。前两个数表示版本号,第三个数表示发布号,如表示版本号,第三个数表示发布号,如2.4.20。(。(2.62.6版版本和本和2.42.4版本在具体的操作细节上有很大差异)版本在具体的操作细节上有很大差异) 如果第二个数为偶数,则表示稳定的内核;否则,如果第二个数为偶数,则表示稳定的内核;否则,表示开发中的内核。表示开发中的内核。 稳定版的发布主要用来纠正用户所报告的错误,但稳定版的发布主要用来纠正用户所报告的错误,但实现内核的主要算法和

9、数据结构基本不变。然而,开发实现内核的主要算法和数据结构基本不变。然而,开发版本间可能存在很大的差异。版本间可能存在很大的差异。2021/11/22操作系统课程设计PPT课件18LinuxLinux系统的常用目录系统的常用目录文件目录结构文件目录结构树型结构树型结构常用目录有:常用目录有:/dev: dev是是device的缩写。这个目录包含的缩写。这个目录包含Linux的所有的所有设备文件,如设备文件,如/dev/hda代表第一个物理代表第一个物理IDE硬盘。硬盘。v/etc: 这个目录用来存放系统管理所需要的配置文件这个目录用来存放系统管理所需要的配置文件和子目录。和子目录。v/lib:

10、这个目录里存放着系统最基本的动态链接共享这个目录里存放着系统最基本的动态链接共享库,几乎所有的应用程序都需要用到这些共享库。库,几乎所有的应用程序都需要用到这些共享库。2021/11/22操作系统课程设计PPT课件19LinuxLinux系统的常用目录(续)系统的常用目录(续) /usr: 这是最庞大的目录,我们要用到的应用程这是最庞大的目录,我们要用到的应用程序和文件几乎都存放在这个目录下。其中包含序和文件几乎都存放在这个目录下。其中包含以下子目录以下子目录: :/usr/include: Linux下开发和编译应用程序所需的头文件;下开发和编译应用程序所需的头文件; /usr/lib: 常

11、用的动态链接共享库和静态档案库;常用的动态链接共享库和静态档案库; /usr/local: 这是提供给一般用户的目录,在这里安装软件这是提供给一般用户的目录,在这里安装软件最适合;最适合; /usr/man: 帮助文档的存放目录;帮助文档的存放目录; /usr/src: Linux的源代码目录。的源代码目录。2021/11/22操作系统课程设计PPT课件20LinuxLinux系统的核心源码系统的核心源码vLinux核心源代码位于核心源代码位于/usr/src/linux下,包括:下,包括:varch: 包括所有和包括所有和CPU类型相关的核心代码。它的每一个子目类型相关的核心代码。它的每一个

12、子目录都代表一种支持的录都代表一种支持的CPU类型,例如类型,例如i386就是关于就是关于I Intel CPU及及与之相兼容的体系结构的子目录,与之相兼容的体系结构的子目录,PC机一般都基于此目录;机一般都基于此目录;vdrivers: 放置系统所有的设备驱动程序放置系统所有的设备驱动程序; ;每种驱动程序又各占用每种驱动程序又各占用一个子目录,如一个子目录,如/block下为块设备驱动程序;下为块设备驱动程序;vinclude: 包括编译核心所需要的大部分头文件。与平台无关的包括编译核心所需要的大部分头文件。与平台无关的头文件在头文件在include/linux子目录下,与子目录下,与I

13、Intel CPU相关的头文件在相关的头文件在include/asm-i386子目录下;子目录下;2021/11/22操作系统课程设计PPT课件21LinuxLinux系统的核心源码(续)系统的核心源码(续)Linux核心源代码中的内容还包括:核心源代码中的内容还包括:vinit: 包含核心的初始化代码包含核心的初始化代码( (注:不是系统的引导代码注:不是系统的引导代码) ),包含,包含两个文件两个文件 main.c和和version.c,这是研究核心如何工作的一个非这是研究核心如何工作的一个非常好的起点;常好的起点;vmm: 包括所有独立于包括所有独立于CPU体系结构的内存管理代码,如页式

14、存体系结构的内存管理代码,如页式存储管理中内存的分配和释放等,而和体系结构相关的内存管理储管理中内存的分配和释放等,而和体系结构相关的内存管理代码则位于代码则位于arch/*/mm/下下;vkernel: 主要的核心代码,此目录下的文件实现了大多数主要的核心代码,此目录下的文件实现了大多数L Linux系统的内核函数,其中最重要的文件当属进程调度系统的内核函数,其中最重要的文件当属进程调度sched.c,同同样,和体系结构相关的代码在样,和体系结构相关的代码在arch/*/kernel中。中。2021/11/22操作系统课程设计PPT课件22课程设计辅导课程设计辅导LinuxLinux系统的相

15、关知识系统的相关知识v以以Redhat Linux 9.0Redhat Linux 9.0为例为例 添加系统调用添加系统调用添加设备驱动程序添加设备驱动程序/ /procproc文件分析文件分析2021/11/22操作系统课程设计PPT课件23添加系统调用添加系统调用LinuxLinux系统调用机制系统调用机制vLinuxLinux内核中设置了一组用于实现各种系统功能内核中设置了一组用于实现各种系统功能的子程序,称为的子程序,称为系统调用系统调用。v用户可以通过系统调用命令在自己的应用程序中用户可以通过系统调用命令在自己的应用程序中调用它们。调用它们。系统调用与普通函数调用的区别系统调用与普通

16、函数调用的区别v系统调用系统调用 核心态核心态 操作系统核心提供操作系统核心提供v普通的函数调用普通的函数调用 用户态用户态 函数库或用户自己提函数库或用户自己提供供2021/11/22操作系统课程设计PPT课件24添加系统调用(续)添加系统调用(续)LinuxLinux系统调用机制系统调用机制 vint 0 x80int 0 x80 使用寄存器中适当的值跳转到内核中事先定使用寄存器中适当的值跳转到内核中事先定义好的代码中执行:跳转到系统调用的总入口义好的代码中执行:跳转到系统调用的总入口system_callsystem_call,检查系统调用号,再查找系统调检查系统调用号,再查找系统调用表

17、用表sys_call_tablesys_call_table,调用内核函数,最后返回。调用内核函数,最后返回。v系统调用是靠一些宏、一张系统调用表、一个系系统调用是靠一些宏、一张系统调用表、一个系统调用入口来完成的。统调用入口来完成的。 2021/11/22操作系统课程设计PPT课件25添加系统调用(续)添加系统调用(续)与系统调用相关的内核代码文件: /usr/src/linux/include/asm-i386/unistd.h系统调用清单系统调用清单( (为每个系统调用分配唯一号码为每个系统调用分配唯一号码) ) /usr/src/linux/arch/i386/kernel/entry

18、.S包含系统调用和异常的底层处理程序、信号量的识别程包含系统调用和异常的底层处理程序、信号量的识别程序序ret_from_sys_call:调用和中断的返回点:调用和中断的返回点对对sys_call_table (系统功能调用表)(系统功能调用表)进行初始化进行初始化 / /usr/src/linux/kernel/sys.cusr/src/linux/kernel/sys.c系统调用实现代码系统调用实现代码/usr/src/linux/arch/i386/kernel/traps.c定义许多出错处理程序定义许多出错处理程序2021/11/22操作系统课程设计PPT课件26添加系统调用(续)添

19、加系统调用(续)步骤步骤_1 _1 添加源代码添加源代码编写添加到内核中的源程序,函数名以编写添加到内核中的源程序,函数名以sys_sys_开头。开头。如:如:mycall(int num),在在/usr/src/linux/kernel/sys.c文件文件中添加如下代码:中添加如下代码: asmlinkage int sys_mycall(int number) return number; /该系统调用仅返回一个整型值该系统调用仅返回一个整型值 2021/11/22操作系统课程设计PPT课件27添加系统调用(续)添加系统调用(续)步骤步骤_2 _2 连接新的系统调用连接新的系统调用 使内核

20、的其余部分知道该系统调用的存在。为此,使内核的其余部分知道该系统调用的存在。为此,需编辑两个文件:需编辑两个文件:v/usr/src/linux/include/asm-i386/unistd.h系统调用清单系统调用清单( (为为每个系统调用分配唯一号码每个系统调用分配唯一号码) ) define _NR_name nnn 这里,这里,name:系统调用名;系统调用名;nnn:系统调用对应的号码,不系统调用对应的号码,不能与内核自身的系统调用号相同。能与内核自身的系统调用号相同。v/usr/src/linux/arch/i386/kernel/entry.S对对sys_call_table 进

21、行初始化进行初始化( (增加新的内核函数的指针增加新的内核函数的指针) ) .long SYMBOL_NAME(sys_mycall)2021/11/22操作系统课程设计PPT课件28添加系统调用(续)添加系统调用(续)步骤步骤_3 _3 重建重建LinuxLinux内核内核v以以root身份进入身份进入/usr/src/linux目录,重建内核目录,重建内核 #make config /基于文本的传统配置界面基于文本的传统配置界面 #make dep / /检验内核源代码文件的依赖性和完整性检验内核源代码文件的依赖性和完整性 #make clean / /清除以前编译的目标文件清除以前编译的

22、目标文件 #make bzImage / /编译内核编译内核,也可采用,也可采用make zImagemake zImagev编译生成的内核文件为编译生成的内核文件为 /usr/src/linux/arch/i386/boot/bzImage v配置内核的方式配置内核的方式make config 基于文本的传统配置界面基于文本的传统配置界面make menuconfig 基于文本的菜单形式配置界面,字符终端下使用基于文本的菜单形式配置界面,字符终端下使用make xconfig 基于图形窗口模式的配置界面,基于图形窗口模式的配置界面,Xwindow下使用下使用v对每个配置选项,有三种选择:对每

23、个配置选项,有三种选择:“Y”将该功能编译进内核将该功能编译进内核“N”不将该功能编译进内核不将该功能编译进内核“M”将该功能编译成可动态载入的内核模块将该功能编译成可动态载入的内核模块2021/11/22操作系统课程设计PPT课件29补充说明补充说明v配置内核的方式配置内核的方式make config 基于文本的传统配置界面基于文本的传统配置界面make menuconfig 基于文本的菜单形式配置界面,字符终端下使用基于文本的菜单形式配置界面,字符终端下使用make xconfig 基于图形窗口模式的配置界面,基于图形窗口模式的配置界面,Xwindow下使用下使用make oldconfi

24、g 在原来的配置上作小的修改在原来的配置上作小的修改 v对每个配置选项,有三种选择:对每个配置选项,有三种选择:“Y”将该功能编译进内核将该功能编译进内核“N”不将该功能编译进内核不将该功能编译进内核“M”将该功能编译成可动态载入的内核模块将该功能编译成可动态载入的内核模块2021/11/22操作系统课程设计PPT课件30添加系统调用(续)添加系统调用(续)步骤步骤_4 _4 重启内核重启内核v将将/usr/src/linux/arch/i386/boot/bzImage拷贝到拷贝到/boot/bzImage v配置启动文件配置启动文件 若采用若采用lilo,修改修改/etc/lilo.con

25、f,添加新的引导内核添加新的引导内核image=/boot/bzImage / 上面编译生成的内核映象上面编译生成的内核映象label=Linuxtest / 给该系统取个名字给该系统取个名字root=/dev/hda5 / 根目录所在的分区,可用命令根目录所在的分区,可用命令df查看查看read-only 若采用若采用grub,修改修改/etc/grub.conf,添加新的引导内核添加新的引导内核title Linuxtestroot(hd0,4)kernel /boot/bzImage ro root=/dev/hda5initrd /boot/initrd-2.4.18-3.imgv重启

26、后,出现重启后,出现Linuxtest选项,选择它进入新的内核选项,选择它进入新的内核 2021/11/22操作系统课程设计PPT课件31添加系统调用(续)添加系统调用(续)步骤步骤_5 _5 使用新的系统调用使用新的系统调用v应用程序应用程序app.c中调用新添加的系统调用中调用新添加的系统调用mycall: 宏指令说明:宏指令说明:_syscalln(parameters):n表示系统调用所需参数,表示系统调用所需参数,parameters为参数。如上面的宏中,第一个参数为参数。如上面的宏中,第一个参数int表示返回值类型,表示返回值类型,第二个参数第二个参数mycall为函数名。第三个和

27、第四个分别用来指定参数的为函数名。第三个和第四个分别用来指定参数的类型和名称。类型和名称。v编译编译gcc o app app.c int main(int argv, char *argc) int a = mycall(100); printf(“%dn”,a); return 0; #include#include#include_syscall1(int, mycall, int, ret)2021/11/22操作系统课程设计PPT课件32添加系统调用(续)添加系统调用(续)注意(与内容一文件拷贝的异同): 相同点:功能相同、代码基本完全一样 不同点:作为内核代码,不能直接调用系统调用

28、命令,应直接使用系统调用的实际函数printf printkopen() sys_open()close() sys_close()read() sys_read()write() sys_write()2021/11/22操作系统课程设计PPT课件33课程设计辅导课程设计辅导LinuxLinux系统的相关知识系统的相关知识v以以Redhat Linux 9.0Redhat Linux 9.0为例为例 添加系统调用添加系统调用添加设备驱动程序添加设备驱动程序/ /procproc文件分析文件分析2021/11/22操作系统课程设计PPT课件34添加设备驱动程序添加设备驱动程序内核模块 LKM

29、Loadable Kernel ModulesLoadable Kernel ModulesLinux核心是一种monolithic类型的内核,即单一的大核心。linux内核是一个整体结构,因此向内核添加任何东西.或者删除某些功能,都十分困难。为了解决这个问题,引入了模块机制,从而可以动态的在内核中添加或者删除模块。一旦被插入内核,他就和内核其他部分一样。2021/11/22操作系统课程设计PPT课件35添加设备驱动程序添加设备驱动程序( (续)续)模块的实现机制模块的实现机制v模块初始化模块初始化 int init_module( ) ; v模块卸载模块卸载 int cleanup_modu

30、le( ) ; v操作操作 unsigned long sys_create_module (char *name, unsigned long size); /重新分配内存重新分配内存int sys_delete_module (char *name); /卸载卸载int sys_query_module (const char *name, int which, void *buf, size_t bufsize, size_t *ret); /查询查询v头文件:头文件:/usr/scr/linux/include/linux/module.h2021/11/22操作系统课程设计PPT课件

31、36添加设备驱动程序(续)添加设备驱动程序(续)模块的实现机制模块的实现机制v模块加入:模块加入:insmod modulename.o 完成:加载目标文件完成:加载目标文件 调用调用create_module重新分配内存重新分配内存 内核符号用内核符号用get_kernel_syms解析未解析的引用解析未解析的引用 调用调用init_module初始化初始化LKM-LKM-执行执行init_module(void)函数函数 v查看模块:查看模块:lsmod 结果:结果:Module Page Used byModule Page Used by modulename 1( modulenam

32、e 1(内存信息内存信息) 0() 0(使用次数使用次数) ) v删除模块:删除模块:rmmod modulename 2021/11/22操作系统课程设计PPT课件37添加设备驱动程序(续)添加设备驱动程序(续)模块编程实例模块编程实例vhello.c源码源码 v编译编译gcc DMODULE D_KERNEL_ -I /usr/src/linux_2.4.20-8/include -c hello.c printk(hello world !n); printk(I have runing in a kernel mod! n); return 0; void cleanup_module

33、() /* 模块卸载模块卸载 */ printk( I will shut down myself in kernel mod!n); #include linux/kernerl.h #include linux/module.h /*处理版本问题处理版本问题CONFIG_MODVERSIONS */ #if CONFIG_MODVERSIONS=1 #define MODVERSIONS #include linux/version.h #end if int init_module() /* 模块初始化模块初始化*/ 2021/11/22操作系统课程设计PPT课件38添加设备驱动程序(续

34、)添加设备驱动程序(续)LinuxLinux支持的设备类型支持的设备类型v字符设备字符设备 c c 存取时没有缓存;对字符设备发出读写请求时,实际存取时没有缓存;对字符设备发出读写请求时,实际的的I/OI/O就发生了。如:鼠标、键盘等。就发生了。如:鼠标、键盘等。 v块设备块设备 b b 利用一块系统内存区域作缓冲区,当用户进程对设备利用一块系统内存区域作缓冲区,当用户进程对设备请求能满足用户要求时,返回请求数据,否则,调用请求请求能满足用户要求时,返回请求数据,否则,调用请求函数进行实际的函数进行实际的I/OI/O操作。如:硬盘、软盘、操作。如:硬盘、软盘、CD-ROMCD-ROM等。等。v

35、网络设备网络设备 2021/11/22操作系统课程设计PPT课件39添加设备驱动程序(续)添加设备驱动程序(续)设备驱动程序设备驱动程序v一组常驻内存的具有特权的共享库,是低级硬件处理例程。一组常驻内存的具有特权的共享库,是低级硬件处理例程。v设备等同文件处理,每个设备文件有两个设备号设备等同文件处理,每个设备文件有两个设备号 主设备号:标识驱动程序主设备号:标识驱动程序 从设备号:表示使用同一个设备驱动程序的不同硬件设备。从设备号:表示使用同一个设备驱动程序的不同硬件设备。设备驱动程序工作的基本原理设备驱动程序工作的基本原理 用户进程利用系统调用对设备进行诸如用户进程利用系统调用对设备进行诸

36、如read/writeread/write操作,操作,系统调用通过设备文件的主设备号找到相应的设备驱动程序,系统调用通过设备文件的主设备号找到相应的设备驱动程序,然后读取这个数据结构相应的函数指针,接着把控制权交给然后读取这个数据结构相应的函数指针,接着把控制权交给该函数。该函数。2021/11/22操作系统课程设计PPT课件40添加设备驱动程序(续)添加设备驱动程序(续)设备驱动程序的功能设备驱动程序的功能v对设备初始化和释放;对设备初始化和释放; v把数据从内核传送到硬件和从硬件读取数据;把数据从内核传送到硬件和从硬件读取数据; v读取应用程序传输给设备文件的数据和回送应用读取应用程序传输

37、给设备文件的数据和回送应用程序请求的数据;程序请求的数据; v检测和处理设备出现的错误。检测和处理设备出现的错误。 2021/11/22操作系统课程设计PPT课件41添加设备驱动程序(续)添加设备驱动程序(续)LinuxLinux系统采用一组固定的入口点来实现驱动设备的功能。系统采用一组固定的入口点来实现驱动设备的功能。vopen入口点入口点: : 打开设备准备打开设备准备I/OI/O操作。操作。open子程序必须对将要进子程序必须对将要进行的行的I/OI/O操作做好必要的准备工作,如清除缓冲区等。操作做好必要的准备工作,如清除缓冲区等。vclose入口点入口点: : 关闭一个设备。当最后一次

38、使用设备终结后,调关闭一个设备。当最后一次使用设备终结后,调用用close子程序。子程序。vread入口点入口点: : 从设备上读数据。从设备上读数据。 vwrite入口点入口点: : 往设备上写数据。往设备上写数据。 vioctl入口点入口点: : 执行读、写之外的操作。执行读、写之外的操作。vselect入口点入口点: : 检查设备,看数据是否可读或设备是否可用于写检查设备,看数据是否可读或设备是否可用于写数据。数据。 如果设备驱动程序没有提供上述入口点中的某一如果设备驱动程序没有提供上述入口点中的某一个,系统会用缺省的子程序来代替。对于不同的系统,个,系统会用缺省的子程序来代替。对于不同

39、的系统,也还有一些其它的入口点。也还有一些其它的入口点。2021/11/22操作系统课程设计PPT课件42添加设备驱动程序(续)添加设备驱动程序(续)入口点采用如下数据结构实现:入口点采用如下数据结构实现: int (*flush) (struct file *); int (*release) (struct inode *, struct file *); int (*fsync) (struct file *, struct dentry *, int datasync); int (*fasync) (int, struct file *, int); int (*lock) (str

40、uct file *, int, struct file_lock *); ssize_t (*readv) (struct file *, const struct iovec *, unsigned long, loff_t *); ssize_t (*writev) (struct file *, const struct iovec *, unsigned long, loff_t *); ssize_t (*sendpage) (struct file *, struct page *, int, size_t, loff_t *, int); unsigned long (*get

41、_unmapped_area)(struct file *, unsigned long, unsigned long, unsigned long, unsigned long); includestruct file_operations struct module *owner; loff_t (*llseek) (struct file *,loff_t ,int); ssize_t (*read) (struct file *,char *,size_t,loff_t *); ssize_t (*write) (struct file *, const char *, size_t,

42、 loff_t *); int (*readdir) (struct file *, void *, filldir_t); unsigned int (*poll) (struct file *, struct poll_table_struct *); int (*ioctl) (struct inode *, struct file *, unsigned int, unsigned long); int (*mmap) (struct file *, struct vm_area_struct *); int (*open) (struct inode *, struct file *

43、);2021/11/22操作系统课程设计PPT课件43添加设备驱动程序(续)添加设备驱动程序(续)注册设备:向系统登记设备及驱动程序的入口注册设备:向系统登记设备及驱动程序的入口点点vint register_chrdev (unsigned int major, const char *name, struct file_operations *fops);/向系统的字符设备表登记一个字符设备向系统的字符设备表登记一个字符设备/major:希望获得的设备号,为希望获得的设备号,为0 0时系统选择一个没有被占用的设备号返回。时系统选择一个没有被占用的设备号返回。/name:设备名设备名/fop

44、s:登记驱动程序实际执行操作的函数的指针登记驱动程序实际执行操作的函数的指针/登记成功,返回设备的主设备号,否则,返回一个负值登记成功,返回设备的主设备号,否则,返回一个负值vint register_blkdev (unsigned int major, const char *name, struct file_operations *fops); /向系统的块设备表登记一个块设备向系统的块设备表登记一个块设备2021/11/22操作系统课程设计PPT课件44添加设备驱动程序(续)添加设备驱动程序(续)设备卸载设备卸载vint unregister_chrdev (unsigned int

45、 major, const char *name); /卸载字符设备卸载字符设备/major:要卸载设备的主设备号要卸载设备的主设备号/name:设备名设备名 vint unregister_blkdev (unsigned int major, const char *name); /卸载块设备卸载块设备 2021/11/22操作系统课程设计PPT课件45典型驱动程序的结构典型驱动程序的结构 / / 在注销模块中卸载设备在注销模块中卸载设备void cleanup_module(void) unregister_chrdev(test_major, test); / / 驱动子程序驱动子程序

46、static int open(struct inode *inode, struct file *file ) static void release(struct inode *inode, struct file *file ) / /将系统调用和驱动程序关联起来将系统调用和驱动程序关联起来struct file_operations *test_fops= .open; .release;/ / 在初始化模块中注册设备在初始化模块中注册设备int init_module(void) result = register_chrdev(0, test, &test_fops); 字

47、符设备提供的主要入口有:open ()、release ()、read ()、write ()、ioctl ()、llseek()、poll()等。2021/11/22操作系统课程设计PPT课件46添加设备驱动程序(续)添加设备驱动程序(续)添加设备驱动程序的方法添加设备驱动程序的方法o编写设备驱动程序编写设备驱动程序mydev.c 在模块的初始化在模块的初始化init_module()中调用设备注册函数;中调用设备注册函数; 在模块的卸载在模块的卸载cleanup_module()中调用设备的卸载函数。中调用设备的卸载函数。 o设备驱动模块的编译设备驱动模块的编译 gcc -O2 -DMOD

48、ULE -D_KERNEL_ -I/usr/src/linux-2.4.20-8/include -c mydev.co加载设备驱动模块加载设备驱动模块: : insmod f mydev.o 若加载成功,在文件若加载成功,在文件/ /proc/devicesproc/devices中能看到新增加的设备,中能看到新增加的设备,包括设备名包括设备名mydevmydev和主设备号。和主设备号。o生成设备文件生成设备文件 mknod /dev/test c 254 0 mknod /dev/test c 254 0 /其中,其中,testtest为设备文件名,为设备文件名,254254为主设备号,为主设备号,0 0为从设备号,为从设备号,c c表示字符设备表示字符设备 2021/11/22操作系统课程设计PPT课件47编写应用程序,测试驱动程序编写应用程序,测试驱动程序编译编译gcc hello.c o hello添加设备驱动程序(续)添加设备驱动程序(续) if ( testdev = -1 ) printf(Cannt open file n); exit(0); read(testdev,buf,

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论