课程4-内核驱动进阶班

更新时间:2023-04-28 07:35:01 阅读量: 实用文档 文档下载

说明:文章内容仅供预览,部分内容可能不全。下载后的文档,内容与下面显示的完全一致。下载之前请确认下面内容是否您想要的,是否完整无缺。

嵌入式LINUX

内核驱动进阶班实验手册

实验目录

实验1.1:x86平台内核配臵、编译和安装 (6)

实验1.2:内核模块 (15)

实验1.3:内核模块参数 (21)

实验1.4:内核符号导出 (25)

实验2.1:交叉工具链的安装与使用 (36)

实验2.2:smdk2410-uboot编译 (42)

实验2.3:mini2440开发板内核下载 (47)

实验2.4:mini2440开发板u-boot移植 (61)

实验2.5:u-boot-网卡驱动移植 (92)

实验2.6:uboot-nor flash驱动移植 (101)

实验3.1:mini2440开发板内核制作 (122)

实验3.3:nfs起根文件系统 (142)

实验3.4:ramdisk起根文件系统 (153)

实验3.5:initramfs起根文件系统 (163)

实验3.6:自启动linux内核 (172)

实验4.1:内存的分配与使用 (195)

实验4.2:内核链表 (203)

实验4.3:内核定时器 (207)

实验5.1:系统调用 (213)

实验5.2:proc文件系统 (221)

实验5.3:oops异常分析 (229)

实验6.1:简单字符设备驱动程序设计 (235)

实验6.2:并发控制 (243)

实验7.1:ioctl设备方法 (250)

实验7.2:阻塞型字符设备驱动 (257)

实验7.3:poll设备方法 (265)

实验7.4:自动创建设备文件 (273)

公司地址:成都市牛王庙东恒国际1栋2期701 5技术咨询QQ:550491596 技术交流QQ群:65212116 电话:028-******** 网址:f2db524acfc789eb162dc839

实验1.1:x86平台内核配臵、编译和安装

●实验目的:

掌握X86平台下,内核的配臵、编译与安装。

●实验要求:

1.配臵、编译Linux

2.6.29内核

2.在vmware安装编译好的内核

●实验器材:

软件:

1.安装了RHEL5的vmware虚拟机

2.Linux 2.6.29内核(见实验代码光盘4-1-1)

3.关于实验中的IP地址

虚拟机IP:172.18.20.24

开发板IP:172.18.20.55

硬件:

PC机一台

●实验步骤:

1. 创建实验目录

#mkdir /home/guoqian/4-1-1

#cd /home/guoqian/

公司地址:成都市牛王庙东恒国际1栋2期701 6技术咨询QQ:550491596 技术交流QQ群:65212116 电话:028-******** 网址:f2db524acfc789eb162dc839

2. 通过SMB服务将提供的Linux 2.6.29内核拷贝到实验目

录下

3. 解压内核到当前目录

#cd /home/guoqian/4-1-1

#tar jxvf linux.2.6.29.tar.bz2

解压完毕后,Linux内核源代码结构如下图所示:

4. 清理内核中间文件,配臵文件

公司地址:成都市牛王庙东恒国际1栋2期701 7

技术咨询QQ:550491596 技术交流QQ群:65212116 电话:028-******** 网址:f2db524acfc789eb162dc839

#cd linux-2.6.29

#make distclean

5. 选择参考配臵文件

使用正在运行的RHEL5的内核配臵作为参考

#cp /boot/config-2.6.18-53.el5 .config

6. 配臵内核

#make menuconfig

注:这里使用默认的配臵即可

公司地址:成都市牛王庙东恒国际1栋2期701 8技术咨询QQ:550491596 技术交流QQ群:65212116 电话:028-******** 网址:f2db524acfc789eb162dc839

公司地址:成都市牛王庙东恒国际1栋2期701 9 技术咨询QQ :550491596 技术交流QQ 群:65212116 电话:028-******** 网址:f2db524acfc789eb162dc839

保存,退出

7. 编译内核

#make bzImage

注:内核编译大概需要几分钟时间,完成后,生成的内核

映像bzImage位于arch/x86/boot/目录下

8. 编译内核模块

#make modules

9. 安装内核模块

#make modules_install

注:完成安装后,编译好的内核模块会从内核源代码目录

拷贝至/lib/modules下,本实验会拷贝到

/lib/modules/2.6.29目录下。

公司地址:成都市牛王庙东恒国际1栋2期701 10技术咨询QQ:550491596 技术交流QQ群:65212116 电话:028-******** 网址:f2db524acfc789eb162dc839

公司地址:成都市牛王庙东恒国际1栋2期701 11 技术咨询QQ :550491596 技术交流QQ 群:65212116 电话:028-******** 网址:f2db524acfc789eb162dc839

10. 制作init ramdisk

initramdik 的作用: 提供一种让内核可以简单使用ramdisk 的能力。这些能力包括:格式化一个 ramdisk ;加载文件系统内容到ramdisk ;将ramdisk 作为根文件系统。

# cd /home/guoqian/4-1-1

#mkinitrd initrd-2.6.29 2.6.29

注:完成操作后,在当前目录下会生成

initrd-2.6.29

11. 安装内核

11.1 由于Linux 系统启动时,会从/boot 目录下来寻找内核文件与init ramdisk ,所以需将内核和init ramdisk 拷贝至/boot 目录

#cp /home/guoqian/4-1-1/

linux-2.6.29/arch/x86/boot/bzImage /boot/vmlinuz-2.6.29

注: vmlinuz-2.6.29可以任意取名

#cp /home/guoqian/4-1-1/initrd-2.6.29 /boot/

说明:上图/boot目录下,vmlinuz-2.6.29为内核,

initrd-2.6.29为init ramdisk。

11.2 为了让grub在启动时能提供一项我们自己制作的

linux内核的选择项,需修改grub的配臵文件

在原有内容的基础上,添加如下代码:

/***************************************************************/

title my linux(2.6.29) /*选择项名字*/

root (hd0,0)

kernel /vmlinuz-2.6.29 ro root=LABEL=/ rhgb quiet

initrd /initrd-2.6.29

/***************************************************************/

#vi /etc/grub.config

公司地址:成都市牛王庙东恒国际1栋2期701 12技术咨询QQ:550491596 技术交流QQ群:65212116 电话:028-******** 网址:f2db524acfc789eb162dc839

公司地址:成都市牛王庙东恒国际1栋2期701 13 技术咨询QQ :550491596 技术交流QQ 群:65212116 电话:028-******** 网址:f2db524acfc789eb162dc839

说明:18-21行为添加代码。

12. 测试新安装的内核是否能使用

重新启动虚拟机,在grub 的选择菜单中选择启动我们刚制作的内核

总结:本实验通过X86平台内核的制作,目地是让大家熟悉内核的配臵、编译安装流程

公司地址:成都市牛王庙东恒国际1栋2期701 14技术咨询QQ:550491596 技术交流QQ群:65212116 电话:028-******** 网址:f2db524acfc789eb162dc839

实验1.2:内核模块

●实验目的:

通过本实验掌握内核模块的编写、编译、加载、卸载;Makefile

的编写。

●实验要求:

1.编写hello world内核模块

2.编写Makefile,编译内核模块

3.安装,卸载该内核模块

●实验器材:

软件:安装了RHEL5的vmware虚拟机

硬件:PC机一台

●实验步骤:

1. 创建实验目录

#mkdir /home/guoqian/4-1-2

#cd /home/guoqian/

公司地址:成都市牛王庙东恒国际1栋2期701 15技术咨询QQ:550491596 技术交流QQ群:65212116 电话:028-******** 网址:f2db524acfc789eb162dc839

2. 根据实验要求编写内核模块hello.c、Makefile(见实验

代码光盘4-1-2)

特别强调Makefile中KDIR指的是虚拟机所使用的linux系

统内核源代码所在的路径

#vim Makefile

说明:上图第6行变量KDIR表示虚拟机所使用的linux系统

内核源代码路径。

3. 编译内核模块

#make

公司地址:成都市牛王庙东恒国际1栋2期701 16技术咨询QQ:550491596 技术交流QQ群:65212116 电话:028-******** 网址:f2db524acfc789eb162dc839

说明:上图hello.ko为编译得到的内核模块。

4. 加载内核模块

#insmod hello.ko

注:注意观察输出打印语句

说明:在安装内核模块的时,内核模块初始化函数hello_init

得到调用,应该打印输出语句‖Hello World!‖;但并没有在

终端上看到相应的信息,这是因为prink输出权限不够,在

图形化界面中prink权限要求KERN_EMERG,而初始化函

数中prink语句权限为KERN_ERR;所有打印输出信息都会

保存在文件/var/log/message中,大家可以通过该文件来查

看输出信息。

#vi /var/log/message

公司地址:成都市牛王庙东恒国际1栋2期701 17技术咨询QQ:550491596 技术交流QQ群:65212116 电话:028-******** 网址:f2db524acfc789eb162dc839

说明:打印输出信息位于/var/log/message文件末;上图

619行为打印输出信息。

5. 查看内核模块

#lsmod

说明:从lsmod的运行结果(hello 5632 0)大家可以清晰地

发现,我们的hello内核模块已经成功地安装到了系统中。

6. 卸载内核模块

#rmmod hello

公司地址:成都市牛王庙东恒国际1栋2期701 18技术咨询QQ:550491596 技术交流QQ群:65212116 电话:028-******** 网址:f2db524acfc789eb162dc839

说明:大家可以发现在卸载内核模块的时候,内核模块卸

载函数hello_exit得到调用,打印出了‖hello exit‖语句;或

者从文件/var/log/message也可查看到打印输出信息。

#vi /var/log/message

说明:上图620行即为打印输出语句。

7. 再次查看内核模块

#lsmod | grep hello

公司地址:成都市牛王庙东恒国际1栋2期701 19技术咨询QQ:550491596 技术交流QQ群:65212116 电话:028-******** 网址:f2db524acfc789eb162dc839

说明:从lsmod的运行结果大家可以清晰地发现,我们的

hello内核模块已经成功从系统中卸载了。

总结:通过一个简单的hello world模块编写,我们应该学习到模块加载函数、卸载函数调用时机,在以后的内核编程中我们会遇到很多函数,从这里开始我们应该主动的去思考这些函数的调用时机;为以后的内核驱动开发打下基础。

公司地址:成都市牛王庙东恒国际1栋2期701 20

技术咨询QQ:550491596 技术交流QQ群:65212116 电话:028-******** 网址:f2db524acfc789eb162dc839

实验1.3:内核模块参数

●实验目的:

通过本实验掌握内核模块参数的使用方法。

●实验要求:

1.编写内核模块,分别实现一个整形,一个字符串型模块参数

2.编写Makefile,编译内核模块

3.安装,卸载该内核模块

●实验器材:

软件:安装了RHEL5的vmware虚拟机

硬件:PC机一台

●实验步骤:

1. 创建实验目录

#mkdir /home/guoqian/4-1-3

#cd /home/guoqian/4-1-3

公司地址:成都市牛王庙东恒国际1栋2期701 21技术咨询QQ:550491596 技术交流QQ群:65212116 电话:028-******** 网址:f2db524acfc789eb162dc839

2. 根据实验要求编写内核模块代码param.c、Makefile(见

实验代码光盘4-1-3)

3. 编译内核模块

#make

说明:param.ko为编译生成的内核模块。

4. 加载内核模块

4.1 不加内核参数,使用其默认值

#insmod param.ko

说明:大家可以发现在加载内核模块的时候,内核模块初

公司地址:成都市牛王庙东恒国际1栋2期701 22技术咨询QQ:550491596 技术交流QQ群:65212116 电话:028-******** 网址:f2db524acfc789eb162dc839

本文来源:https://www.bwwdw.com/article/ok7q.html

Top