1、嵌入式 Linux 内核编程与驱动开发实验1嵌入式 Linux 内核编程与驱动开发实验手册李国斌合肥学院计算机科学与技术系嵌入式 Linux 内核编程与驱动开发实验2实验环节课时安排实验大类 课时子实验标题 内容1.1内核浏览。 Source insight工具浏览 1.内核编译入门(必做)2 1.2内核编译实验 内核编译2.1简单模块实验 (1) 模块基础2.2简单模块实验 (2) module_init,module_exit宏2.3简单模块实验 (3) MODULE_LICENSEMODULE_AUTHOR等宏2.4简单模块实验 (4) 模块参数的传递功能2.内核模块驱动实验(必做)42
2、.5 简单模块实验 (5) 多文件模块的编译3.1简单字符设备实验(1)添加设备号的注册3.2简单字符设备实验(2)添加设备的注册3.3简单字符设备实验(3)open、release 功能3.4简单字符设备实验(4)read功能3.5简单字符设备实验(5)Write功能3.6简单字符设备实验(6)DEBUG控制3.7简单字符设备实验(7)创建 PROC结点3.简单字符驱动实验(必做)63.8简单字符设备实验(8)添加 ioctl功能4.1 PIPE实验 PIPE4.2 Poll实验 Poll4.3异步通知实验 异步通知4.4秒表字符设备 秒表字符设备4.5 Tasklet实验 Tasklet实
3、验4.高级字符驱动实验(必做)64.6 工作队列实验 工作队列5.1 LED灯驱动程序编写实验GPIO5.2按键中断字符驱动程序编写实验按键中断5.嵌入式驱动实验(选做)25.3 编写一个 sbull驱动 将一段 ram空间模拟为 DISK嵌入式 Linux 内核编程与驱动开发实验3使用。实验 1.1、内核浏览实验【实验内容】利用工具查看内核代码。【实验目的】了解 Linux 内核源代码的目录结构及各目录的相关内容。【实验平台】Ubantu10.10【工具介绍】Source Insight 实质上是一个支持多种开发语言(java,c ,c 等等)的编辑器,只不过由于其查找、定位、彩色显示等功能
4、的强大,常被我们当成源代码阅读工具使用。【实验练习】:(1)使用 sourceinsight 浏览内核源码。熟悉内核中代码的结构。了解内核中KCONFIG 和 Makefile 的作用及含义。(2)参考其他资料,分析内核中链表的相关代码,熟悉内核中链表的函数及使用。【实验步骤】1. Source Insight 安装及内核代码工程配置安装 Source Insight 并启动程序,可以进入图 1 界面。在工具条上有几个值得注意的地方,如图所示,图中内凹左边的是工程按钮,用于显示工程窗口的情况;右边的那个按钮按下去将会显示一个窗口,里边提供光标所在的函数体内对其他函数的调用图,通过点击该窗体里那
5、些函数就可以进入该函数所在的地方。嵌入式 Linux 内核编程与驱动开发实验4图 1 Source Insight 界面图由于 Source Insight 实质上是一个支持多种开发语言(Java,C ,C+等等)的编辑器,只不过由于其查找、定位、彩色显示等功能的强大,而被我们当成源代码阅读工具使用。所以,为了有效的阅读源程序,首先必须选择功能菜单上的 “Project”选项的子菜单“New Project”新建一个项目,项目名称可以自由选定,当然也可以选择删除(Remove)一个项目。当删除一个项目的时候,并不删除原有的源代码文件,只是将该软件生成的那些工程辅助文件删除。设定之后,将会弹出一
6、个对话框如图 2,接受默认选择,如果,硬盘空间足够,可以将第一个复选框选上,该选项将会需要与源代码大致同等的空间来建立一个本地数据库以加快查找的速度。图 2 工程设置点击“OK”按钮,接受选择后,将会有一个新的对话框弹出,在这个对话框里,可以选择将要阅读的文件加入工程,一种方式是通过在 File Name 中输入要阅读源代码文件的名称,点击“Add”按钮将其加入,也可以通过其中“Add All”和“Add Tree”两个按钮嵌入式 Linux 内核编程与驱动开发实验5可以将选中目录的所有文件加入到工程中,其中“Add All”选项会提示加入顶层文件和递归加入所有文件两种方式,而“Add Tre
7、e”相当于“Add All”选项的递归加入所有文件,可以根据需要使用,就我来说,更喜欢“Add Tree”一些。由于该程序采用了部分打开文件的方式,没有用到的文件不会打开,所以,加入数千个文件也不用担心加入的文件超出程序的所能容忍的最大值,我就是采用“Add Tree”的方式将 Linux2.4 内核的四千五百九十一个文件加入的。图 3 添加文件加入文件后,点击一个文件,可以出现使用界面,如图 4 所示,其中,右边的那个窗口(Linux Project,即工程窗口)缺省按照字母顺序列出当前工程中所有的文件。图 4 工作窗口点击一个文件就可以打开该文件,显示如图 5 所示,进入到右边的那个窗口分
8、别可以以文件列表的方式,列出所有的文件,每个窗体下边有一排按钮,左边的窗口(21142.c)从左至右分别为:按字母顺序排列所有标记、按照文件中行数顺序排列标记、按照类型排列标记、浏览本地文件标记、标记窗口属性。右边的窗口(Linux Project)从左至右分别嵌入式 Linux 内核编程与驱动开发实验6为:按字母顺序文件列表、显示文件夹、按照文件类型归类文件、全部文件的所有标记列表、按照标记类型归类标记、跳转到定义处、显示标记信息、浏览工程标记、查找函数调用、工程属性,其中全部文件的所有标记列表选项可能要一段时间抽取标记,同步到数据库去,如果开始选择了建立标记数据库,将会在今后节省同步时间,
9、最有用的莫过于浏览标记信息和查找函数调用,前者可以通过“Jump”按钮在不同的地方查找同样的标志,还可以通过“Reference”按钮结合后者进行全局的标记查找。Reference 功能是 Source Insight 的特色之一,它可以在速度极快的在整个工程中找到所有的标记,并且在该行程序的前边加上红色箭头的小按钮链接上。图 6 是一个Reference 搜索后的结果,它可以有两种模式,一种集中显示结果,图 6 显示的就是这种模式,在这种模式下,可以通过前边的红色箭头小按钮进入另外一种模式,该标记的具体的所在处,也可以通过标记的具体所在处点击红色箭头小按钮进入警种模式,还可以通过工具条上的两
10、个红色小箭头直接在第二种模式下前后移动,察看相应信息。它的这个强大的功能使得阅读 Linux 源程序有如神助。但是要注意的是,当进行了第二次“Reference”时,它会提示你将结果集附加在第一个结果集的后边还是取代第一个结果集。如果选择前者,不能对结果集根据前后两次搜索结果进行分类,然后在其子类里进行移动,只能在整个结果集里移动;如果,选择后者,结果集将会被替换为第二次搜索的结果,略微有些不方便。嵌入式 Linux 内核编程与驱动开发实验7图 6 Reference 的搜索结果Source Insight 设置1、 背景色选择 要改变背景色 Options-preference-window
11、s background-color 设置背景色2、 解决字符等宽对齐问题。SIS 默认字体是 VERDANA,很漂亮。这网页上应该也是用的 VERDANA 字体。但由于美观的缘故,VERDANA 字体是不等宽的。比如下面两行LlllllllllMMMMMMMMMM同样 10 个字符,长度差多了.用 VERDANA 来看程序,有些本应该对齐的就歪了。解放方法是使用等宽的字体,但肯定比较丑。比较推荐的是用 Courier New。3、 解决 TAB 键缩进问题Options- Document Options 里面的右下角 Editing Options 栏里,把 Expand tabs 勾起来
12、,然后确定。OK,现在 TAB 键的缩进和四个空格的缩进在 SIS 里面看起来就对齐咯。4、 SI 中的自动对齐设置:在 C 程序里, 如果遇到行末没有分号的语句,如 IF, WHILE, SWITCH 等, 写到该行末按回车,则新行自动相对上一行缩进两列。Option-Document option 下的 Auto Indient 中 Auto Indient Type 有三种类型 None,Simple,Smart。个人推荐选用 Simple 类型。5、 向项目中添加文件时,只添加特定类型的文件(文件类型过滤器)编辑汇编代码时,在 SIS 里建立 PROJECT 并 ADD TREE 的时
13、候,根据默认设置并不会把该 TREE 里面所有汇编文件都包含进来。只加了.inc 和.asm 后缀的,.s 后缀的没有。而且用 SIS 打开.s 的文件,一片黑白没有色彩,感觉回到 DOS 的 EDIT 时代了 解决方法是在 Options-Document Options 里面,点左上的 Document Type 下拉菜单,选择 x86 Asm Source File,然后在右边的 File filter 里*.asm;*.inc;的后面加上*.s;接着 CLOSE 就可以了。上面问题解决了,但注意加入*.s 后还需要重新 ADD TREE 一遍才能把这些汇编加到PROJECT 里面。6、
14、 添加文件类型用户可以定义自己的类型,Options-Document Options-add type,定义文件类型名以及文件名后缀。勾选 include when adding to projects 在添加目录下文件到工程是该类文件就会添加进 SI 的工程。如果需要将所有文件添加进 SI 的工程,可以定义一种文件类型*.*。 7、 恢复 ctrl+a 的全选功能通过关键词 save 找到 save all,更改为 ctrl+shift+a,通过关键词 select 找到select all,更改为 ctrl +aSource Insight 常用的快捷键:Ctrl+= :Jump to
15、definitionAlt+/ :Look up reference F3 : search backwardF4 : search forward嵌入式 Linux 内核编程与驱动开发实验8F5: go to LineF7 :Look up symbolsF8 :Look up local symbolsF9 :Ident leftF10 :Ident rightAlt+, :Jump backwordAlt+. : Jump forwardShift+F3 : search the word under cusor backwardShift+F4 : search the word un
16、der cusor forwardF12 : incremental searchShift+Ctrl+f: search in projectshift+F8 : hilight word【思考题】1.内核中的链表是如何实现的。请查阅资料分析链表的实现细节,给出分析报告。嵌入式 Linux 内核编程与驱动开发实验9实验 1.2、内核编译实验【实验内容】尝试编译内核、新增内核代码加入到 Linux 内核结构。【实验目的】1、了解 Linux 内核各配置选项内容和作用2、掌握 Linux 内核配置文件.config 的作用3、掌握 Linux 内核的编译过程4、掌握将新增内核代码加入到 Linu
17、x 内核结构中的方法【实验平台】Ubantu10.10【实验步骤】1. 内核源码下载解压。2. 配置内核3、内核编译过程(1)make mrproper:删除所有以前在构核过程所产生的所有文件(2)make menuconfig:内核配置(3)make dep :寻找依存关系 (2.4 内核需要)(4)make zImage :产生压缩的核心映像文件内核编译完毕之后,生成 zImage 内核映象文件保存在源代码的 arch/arm/boot/目录下时间很长,建议熟悉过程。【实验练习】:(课本 P67)对于一个开发者来说,将自己开发的内核代码添加到 Linux 内核中,需要有三个步骤。(1)确定
18、把自己的开发代码放入到内核的位置;(2)把自己开发的功能增加到 Linux 内核的配置选项中,使用户能够选择此功能(3)构建子目录 Makefile,根据用户的选择,将相应的代码编译 Linux 内核中。DIY:向内核添加自己的程序A.在 Linux 内核中增加自己的程序步骤(注意这里只是程序文件): 1.将编写的源代码复制到 Linux 内核源代码的相应目录中。2.在目录的 Kconfig 文件中增加新源代码对应项目的编译配置选项3.在目录的 Makefile 文件中增加对新源代码的编译条目。B.在 Linux 内核 drivers/目录中增加目录和子目录步骤:1.所加目录为 daiq,文件
19、如下 :daiqlocalhost daiq$ tree|- Kconfig|- Makefile|- led嵌入式 Linux 内核编程与驱动开发实验10| |- Kconfig| |- Makefile| - led.c- test.c#注意此时各个目录中的 Makefile 和 Kconfig 文件是空的2.在新增的相应目录添加 Kconfig 和 Makefile 文件,上面的目录中已经添加。3.修改新增目录的 父目录的 Kconfig 和 Makefile 文件,以便新增的 Kconfig 和 Makefile能被引用。向父目录中的 Makefile 添加:obj-y += daiq
20、/表示在编译过程中包含子目录 daiq 目录。然后修改 Kconfig 文件,添加:source “drivers/daiq/Kconfig”表示在配置时引用子目录 daiq 中的配置文件 Kconfig。4.实际上,要让 drivers/daiq/Kconfig 有效,要在 arch/arm/Kconfig 文件中添加:source “drivers/daiq/Kconfig”父目录 drivers/Kconfig 的修改可以不要。5.经过上面一步,内核就可以找到所加的目录 daiq 了,然后就是编辑各个目录中的Makefile 和 Kconfig 文件,在你添加的目录 daiq 中的 Ma
21、kefile 加入:obj-$(CONFIG_TEST) += test.o #因为在 daiq 目录中要编译 test.c 文件#所以会根据 CONFIG_TEST 来决定编译选项obj-y += led/#编译 daiq 目录中的子目录 led然后 Kconfig 文件是:menu “DaiQ device support“ #在 make menuconfig 时要显示的菜单入口config DAIQ_TESTbool “Test“helpDaiQ device supportsource “drivers/daiq/led/Kconfig“endmenu注意:menu 和 endmen
22、u 的前后要加回车,不然 make menuconfig 的时候会出错。再看 led 目录下的 Makefile 和 Kconfig:Makefile 为文件:嵌入式 Linux 内核编程与驱动开发实验11obj-$(CONFIG_LED)+=led.o Kconfig 文件:config LEDtristate “led support”5.现在可以 make menuconfig 来配置添加自己目录 daiq 的驱动了!【附录】:编译内核的常用命令精简 Linux 内核常用命令包括:Make Config,dep, clean,mrproper ,zImage ,bzImage,Modul
23、es,Modules_Install(1) 、Make config:内核配置,调用./scripts/Configure 按照 arch/i386/config.in 来进行配置。命令执行后产生文件.config,其中保存着配置信息。下次在做 make config 时将产生新的.config 文件,原文件 config 更名为 config.old(2)、 make dep:寻找依存关系。产生两个文件 .depend 和.hdepend ,其中.hdepend 表示每个.h 文件都包含其他哪些嵌入文件。而.depend 文件有多个,在每个会产生目标文件(.o)文件的目录下均有,它表示每个目
24、标文件都依赖于哪些嵌入文件(.h)(3) 、make clean:清除以前构核所产生的所有的目标文件,模块文件,核心以及一些临时文件等,不产生任何文件(4)、 make rmproper:删除所有以前在构核过程所产生的所有文件,及除了做 make clean外,还要删除.config,.depend 等文件,把核心源码恢复到最原始的状态。下次构核时必须进行重新配置;(5)、make,make zImage, make bzImage :(a)make :构核。通过各目录的 Makefile 文件进行,会在各个目录下产生一大堆目标文件,如核心代码没有错误,将产生文件 vmlinux,这就是所构的
25、核心。并产生映像文件 system.map 通过各目录的 makefile 文件进行。.version 文件中的数加 1,表示版本号的变化。(b)make zImage:在 make 的基础上产生压缩的核心映像文件./arch/$(ARCH)/boot/zImage 以及 ./arch/$(ARCH)/boot/compressed 目录下产生一些临时文件。(c) make bzImage : 在 make 的 基 础 上 产 生 压 缩 比 例 更 大 的 的 核 心 映 像 文件./arch/$(ARCH)/boot/bzImage 以及./arch/$(ARCH)/boot/compre
26、ssed 目录下产生一些临时文件。在核心太大时进行【思考题】1 内核内核编译的流程是怎样的?内核代码中的 KCONFIG 和 Makefile 文件起到什么样的作用?2 .Config 文件起到什么作用?如何在内核中添加新的驱动模块?3 Linux 内核编译完成结果有有哪些?各有什么作用?4 内核目录的结构是怎样的,关键目录的含义是什么?嵌入式 Linux 内核编程与驱动开发实验12实验 2.1 简单模块实验(1)【实验内容】编写一个最基本的模块,加载模块,观察结果【实验目的】掌握模块的基本要素及加载、卸载、查看工具的使用。【实验平台】Ubantu10.10【实验步骤】1.将文件夹 ex1-h
27、ello-world 复制到 Linux 环境中,如:/home/linux/test$su root$cp ex1-hello-world /home/linux/test a2.$cd /home/linux/test/ex1-hello-world3.$make4.通过 insmod 命令将模块加入内核$insmod hello.ko5.通过 lsmod 查看内核模块$lsmod | grep hello6.通过 rmmod 删除内核中的模块$rmmod hello7.查看源码,适当修改,掌握实验内容【思考题】1 内核模块的组成部分有哪些组成部分?那些是必须的?那些是可选的?2 内核模块
28、代码中 Pintk 函数打印的消息存放在什么位置?需要使用什么命令查看内核打印消息?3 模块加载和卸载时分别执行的函数是哪个?为什么?4嵌入式 Linux 内核编程与驱动开发实验13实验 2.2、简单模块实验(2)【实验内容】在实验一的基础上,加入 module_init,module_exit 的支持加载模块,观察结果。【实验目的】掌握 module_init,module_exit 的使用。【实验平台】Ubantu10.10【实验步骤】1.将文件夹 ex2-init-exit 复制到 Linux 环境中,如:/home/linux/test$su root$cp ex2-init-exit
29、 /home/linux/test a2.$cd /home/linux/test/ex2-init-exit3.$make4.通过 insmod 命令将模块加入内核$insmod hello.ko5.通过 lsmod 查看内核模块$lsmod | grep hello6.通过 rmmod 删除内核中的模块$rmmod hello7.查看源码,适当修改,掌握实验内容嵌入式 Linux 内核编程与驱动开发实验14实验 2.3、简单模块实验(3)【实验内容】在实验二的基础上,加入模块描述信息的支持【实验目的】掌握 MODULE_LICENSEMODULE_AUTHOR 等宏的使用。【实验平台】Ub
30、antu10.10【实验步骤】1.将文件夹 ex3-doc-license 复制到 Linux 环境中,如:/home/linux/test$su root$cp ex3-doc-license /home/linux/test a2.$cd /home/linux/test/ex3-doc-license3.$make4.通过 insmod 命令将模块加入内核$insmod hello.ko5.通过 lsmod 查看内核模块$lsmod | grep hello6.通过 rmmod 删除内核中的模块$rmmod hello7.查看源码,适当修改,掌握实验内容8.通过 modinfo 查看模块
31、信息$modinfo hell.ko嵌入式 Linux 内核编程与驱动开发实验15实验 2.4、简单模块实验(4)【实验内容】在实验三的基础上,加入模块参数的传递功能【实验目的】掌握模块的模块参数的传递功能的使用。【实验平台】Ubantu10.10【实验步骤】1.将文件夹 ex4-param 复制到 Linux 环境中,如:/home/linux/test$su root$cp ex4-param /home/linux/test a2.$cd /home/linux/test/ex4-param3.$make4.通过 insmod 命令将模块加入内核$insmod hello.ko mysh
32、ort=55 myint=456 mylong=4567 mystring=”foobar”array=2,35.通过 lsmod 查看内核模块$lsmod | grep hello6.通过 demsg 查看内核模块$dmesg7.通过 rmmod 删除内核中的模块$rmmod hello8.查看源码,适当修改,掌握实验内容嵌入式 Linux 内核编程与驱动开发实验16实验 2.5、简单模块实验(5)【实验内容】多文件模块的编译【实验目的】掌握由多个文件组成的模块编译方法。【实验平台】Ubantu10.10【实验步骤】1.将文件夹 ex5-multi-file 复制到 Linux 环境中,如:
33、/home/linux/test$su root$cp ex5-multi-file /home/linux/test a2.$cd /home/linux/test/ex5-multi-file3.$make4.通过 insmod 命令将模块加入内核$insmod final.ko 5.通过 lsmod 查看内核模块$lsmod | grep final6.通过 demsg 查看内核模块$dmesg7.通过 rmmod 删除内核中的模块$rmmod final8.查看 Makefile,掌握多文件模块编译的方法。嵌入式 Linux 内核编程与驱动开发实验17实验 3.1、简单字符设备实验(1
34、)【实验内容】添加设备号的注册【实验目的】掌握字符设备设备号的注册方法。【实验平台】Ubantu10.10【实验步骤】1.将文件夹 ex6-char-register 复制到 Linux 环境中,如:/home/linux/test$su root$cp ex6-char-register /home/linux/test a2.$cd /home/linux/ex6-char-register3.$make4.通过 insmod 命令将模块加入内核$insmod char-reg.ko 5.通过 lsmod 查看内核模块$lsmod | grep char6.通过 demsg 查看内核模块$
35、dmesg7.通过 rmmod 删除内核中的模块$rmmod char-reg8. 查看源码,适当修改,掌握实验内容。嵌入式 Linux 内核编程与驱动开发实验18实验 3.2、简单字符设备实验(2)【实验内容】添加设备的注册【实验目的】掌握字符设备的注册方法。【实验平台】Ubantu10.10【实验步骤】1.将文件夹 ex7-char-dev-register 复制到 Linux 环境中,如:/home/linux/test$su root$cp ex7-char-dev-register /home/linux/test a2.$cd /home/linux/ex7-char-dev-re
36、gister3.$make4.通过 insmod 命令将模块加入内核$insmod char-dev-reg.ko 5.通过 lsmod 查看内核模块$lsmod | grep char6.通过 demsg 查看内核模块$dmesg7.通过 rmmod 删除内核中的模块$rmmod char-dev-reg8. 查看源码,适当修改,掌握实验内容。嵌入式 Linux 内核编程与驱动开发实验19实验 3.3、简单字符设备实验(3)【实验内容】添加 open、release 功能,并编写应用程序操作驱动【实验目的】掌握字符设备设备号的 open、release 方法。【实验平台】Ubantu10.1
37、0【实验步骤】1.将文件夹 ex8-char-dev-register-dynamic 复制到 Linux 环境中,如:/home/linux/test$su root$cp ex8-char-dev-register-dynamic /home/linux/test a2.$cd /home/linux/ex8-char-dev-register-dynamic3.$make/编译设备驱动4.$gcc test.c o test/编译应用程序5.通过 insmod 命令将模块加入内核$insmod char-dev-reg.ko 6.通过 lsmod 查看内核模块$lsmod | grep
38、char7.通过 demsg 查看内核模块$dmesg8.创建设备结点$mknod /dev/hello c 250 09.运行应用程序$./test10.通过 rmmod 删除内核中的模块$rmmod char-dev-reg11. 查看源码,适当修改,掌握实验内容。嵌入式 Linux 内核编程与驱动开发实验20实验 3.4、简单字符设备实验(4)【实验内容】添加 write 功能,并编写应用程序操作驱动,并编写应用程序操作驱动【实验目的】掌握字符添加 write 功能,并编写应用程序操作驱动。【实验平台】Ubantu10.10【实验步骤】1.将文件夹 ex9-write 复制到 Linux
39、 环境中,如:/home/linux/test$su root$cp ex9-write /home/linux/test a2.$cd /home/linux/ex9-write3.$make/编译设备驱动4.$gcc test.c o test/编译应用程序5.通过 insmod 命令将模块加入内核$insmod char-write.ko 6.通过 lsmod 查看内核模块$lsmod | grep char7.通过 demsg 查看内核模块$dmesg8.创建设备结点$mknod /dev/hello c 250 09.运行应用程序$./test10.通过 rmmod 删除内核中的模块
40、$rmmod char-write11. 查看源码,适当修改,掌握实验内容。嵌入式 Linux 内核编程与驱动开发实验21实验 3.5、简单字符设备实验(5)【实验内容】添加 read 功能,并编写应用程序操作驱动【实验目的】掌握字符设备设备号的 read 方法。【实验平台】Ubantu10.10【实验步骤】1.将文件夹 ex10-read 复制到 Linux 环境中,如:/home/linux/test$su root$cp ex10-rea /home/linux/test a2.$cd /home/linux/ex10-rea3.$make/编译设备驱动4.$gcc test.c o t
41、est/编译应用程序5.通过 insmod 命令将模块加入内核$insmod char-read.ko 6.通过 lsmod 查看内核模块$lsmod | grep char7.通过 demsg 查看内核模块$dmesg8.创建设备结点$mknod /dev/hello c 250 09.运行应用程序$./test10.通过 rmmod 删除内核中的模块$rmmod char-read11. 查看源码,适当修改,掌握实验内容。嵌入式 Linux 内核编程与驱动开发实验22实验 3.6、简单字符设备实验(6)【实验内容】在模块代码中添加 DEBUG 控制。【实验目的】掌握字符设备模块代码中添加
42、DEBUG 控制。【实验平台】Ubantu10.10【实验步骤】1.将文件夹 ex11-debug 复制到 Linux 环境中,如:/home/linux/test$su root$cp ex11-debug /home/linux/test a2.$cd /home/linux/ex11-debug3.$make/编译设备驱动4.$gcc test.c o test/编译应用程序5.通过 insmod 命令将模块加入内核$insmod hello.ko 6.通过 lsmod 查看内核模块$lsmod | grep hello7.通过 demsg 查看内核模块$dmesg8.通过 rmmod
43、删除内核中的模块$rmmod hello8. 查看源码及 Makefile,适当修改,改变 debug 输出,掌握实验内容。嵌入式 Linux 内核编程与驱动开发实验23实验 3.7、简单字符设备实验(7)【实验内容】在模块代码中添加创建 PROC 结点的内容【实验目的】在模块代码中添加创建 PROC 结点的内容。【实验平台】Ubantu10.10【实验步骤】1.将文件夹 ex12-proc 复制到 Linux 环境中,如:/home/linux/test$su root$cp ex12-proc /home/linux/test a2.$cd /home/linux/ex12-proc3.$
44、make/编译设备驱动4.通过 insmod 命令将模块加入内核$insmod proc.ko 5.通过 lsmod 查看内核模块$lsmod | grep proc6.通过 proc 查看内核模块$cat /proc/hello7.通过 rmmod 删除内核中的模块$rmmod proc8. 查看源码及 Makefile,适当修改,改变 debug 输出,掌握实验内容。嵌入式 Linux 内核编程与驱动开发实验24实验 3.8、简单字符设备实验(8)【实验内容】添加 ioctl 功能,并编写应用程序操作驱动【实验目的】掌握字符设备的 ioctl 方法【实验平台】Ubantu10.10【实验步
45、骤】1.将文件夹 ex13-ioctl 复制到 Linux 环境中,如:/home/linux/test$su root$cp ex13-ioctl /home/linux/test a2.$cd /home/linux/ex13-ioctl3.$make/编译设备驱动4.$gcc test.c o test/编译应用程序5.通过 insmod 命令将模块加入内核$insmod hello-ioctl.ko 6.通过 lsmod 查看内核模块$lsmod | grep hello7.通过 demsg 查看内核模块$dmesg8.创建设备结点$mknod /dev/hello c 250 09.
46、运行应用程序10.通过 rmmod 删除内核中的模块$rmmod hell-ioctl8. 查看源码,加入自己的控制命令,测试结果。嵌入式 Linux 内核编程与驱动开发实验25实验 4.1、PIPE 实验【实验内容】编写一个字符设备驱动,包含等待队列、信号量、FIFO 等功能【实验目的】掌握字符设备的等待队列、信号量、FIFO 等功能的实现方法【实验平台】Ubantu10.10【实验步骤】1.将文件夹 pipe 复制到 Linux 环境中,如:/home/linux/test$su root$cp pipe /home/linux/test a2.$cd /home/linux/pipe3.
47、$make/编译设备驱动4.通过 insmod 命令将模块加入内核$insmod pipe.ko 5.创建设备结点$mknod /dev/pipe p6.$cat /dev/pipe7.打开新的终端,输入$echo “hello”/dev/pipe,可以在前一个终端看到打印出的“hello”8. 查看源码,适当修改,掌握实验内容。嵌入式 Linux 内核编程与驱动开发实验26实验 4.2、Poll 实验【实验内容】编写一个字符设备驱动,包含等待队列、信号量、FIFO、Poll 等功能【实验目的】掌握 Poll 等功能的实现方法【实验平台】Ubantu10.10【实验步骤】1.将文件夹 poll
48、 复制到 Linux 环境中,如:/home/linux/test$su root$cp poll /home/linux/test a2.$cd /home/linux/poll3.$make/编译设备驱动4.通过 insmod 命令将模块加入内核5.创建设备结点$mknod /dev/globalfifo c 250 06.$cat /dev/globalfifo7.打开新的终端,输入$echo “hello”/dev/gloabalfifo8.比较读写及 fifo 部分和实验一的不同9.编译应用程序 pollmonitor.c$gcc o pollmonitor pollmonitor.
49、c10.$./pollmonitor程序会不断的输出“poll monitor:can be written”,当通过 echo 向/dev/globalfifo 写入数据后,将输出“poll monitor:can be read”和“poll monitor:can be written”;如果不断的通过 ECHO 向/dev/globalfifo 写入数据直到写满 FIFO,发现 pollmonitor 程序将只输出“poll monitor:can be read”。对于 globalfifo 而言,不会出现既不能读,又不能写的情况。如何修改应用程序,才会出现阻塞等待现象?11. 查看源码,加入自己的控制命令,测试结果。嵌入式 Linux 内核编程与驱动开发实验27实验 4.3、异步通知实验【实验内容】编写一个字符设备驱动,包含等待队列、信号量、FIFO、fasync 等功能【实验目的】掌握异步通知功能的实现方法【实验平台】Ubantu10.10【实验步骤】1.将文件夹 globalfifo_async 复制到 Linux 环境中,如:/home/linux/test$su root$cp globalfifo_async/hom