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 和 endmenu 的前后要加回车,不然 make menuconfig 的时候会出错。再看 led 目录下的 Makefile 和 Kconfig:Makefile 为文件:
Copyright © 2018-2021 Wenke99.com All rights reserved
工信部备案号:浙ICP备20026746号-2
公安局备案号:浙公网安备33038302330469号
本站为C2C交文档易平台,即用户上传的文档直接卖给下载用户,本站只是网络服务中间平台,所有原创文档下载所得归上传人所有,若您发现上传作品侵犯了您的权利,请立刻联系网站客服并提供证据,平台将在3个工作日内予以改正。