1、 目录一、实验目的- 2 -二、实验任务- 2 -三、实验步骤- 2 -3.1在虚拟机下安装linux系统- 2 -3.2重新编译内核- 2 -3.3编写驱动程序并进行测试- 8 -1.编译驱动程序- 8 -2.装载模块- 8 -3.分配次设备号- 9 -4.测试驱动程序- 9 -5.删除设备、模块- 11 -四、遇到的问题以及解决的方法- 11 -五、实验心得体会- 11 -一、实验目的1. 掌握linux安装的方法2. 掌握Kernel的升级3. 掌握系统引导管理器Grub的使用4. 学会编写简单的模块化的字符设备驱动程序。二、实验任务1.在虚拟机下安装某一Linux的发行版(推荐Cent
2、OS)2.从内核官网忽略此处.Kernel.org下载某一新的内核版本,并进行编译3.设置系统引导管理器(推荐Grub),使得系统可以从新内核启动4.编写一个简单的模块化字符设备驱动程序,动态地装载和卸载以模块形式存在的字符设备驱动程序。同时,学会对所编写的字符设备驱动程序进行测试,最终了解Linux操作系统是如何管理字符设备的。基本要求:(1)编写初始化和注销函数:scull_init() 和 scull_exit();(2)编写5个基本的设备接口函数,包括scull_open(),scull_write(),scull_read(),scull_ioctl()(3)和scull_relea
3、se();(4)一个测试程序来测试所编写的字符设备驱动程序。三、实验步骤3.1在虚拟机下安装linux系统1.安装虚拟机软件:vmware workstation2.安装CentOS 6.43.2重新编译内核1.重新编译内核2.安装vsftp服务器,samba服务器,3.安装好rh之后,首先查看ip,运行:service network start,如果出现提示:Determining IP information for eth0. failed; no link present. Check cable4.编辑文件/etc/sysconfig/network-scripts/ifcfg-e
4、th0在该文件末尾加上:check_link_down() return 1;再运行:service network up再运行:ifconfig 即可看到ip5.为了方便操作,采用putty连接到虚拟机的方式(如果putty老是连接不上,可能就是因为linux的防火墙的原因,所以要把防火墙关掉:service iptables stop)(注意,每次重启之后都要关闭防火墙)6.运行命令uname r,得到内核版本:2.6.32.87.到网站忽略此处.kernel.org,下载一个比较新的稳定版本(下载方法:wget 忽略:/忽略此处.kernel.org/.8. 用命令解压缩到目录/usr/
5、src下面: tar jxvf linux-3.11.6.tar.bz2 C /usr/src9.注意解压缩之后,会同时生成一个文件pax_global_header10.仔细阅读README文件(最好要求交课程设计报告的时候有翻译,因为仔细研读这些文件就是一种最好的学习)11.cd /usr/src/linux./12.make mrproper 目的是建立一个清洁的内核树13.make menuconfig 设置内核编译的配置文件14.选好各个需要的选项之后推出保存15.make dep16.make clean 删除一些stale的文件17.make bzImage 制作核心文件,这个过
6、程比较花时间18.make modules 编译模块19.make modules_install 安装模块20.make install21.下面制作新旧内核的多重开机移动新内核到/boot下面去cp /usr/src/linux-2./arch/i386/boot/bzImage /boot/vmlinuz-2.6.38.8cp /usr/src/linux-2.6.38.8/System.map /boot/System.map-2.6.38.8修改grub配置文件.22.注意在vmware下面以内核和直接在PC机上编译内核有些不同,在vmware上编译内核有些选项必须要选上3.3编写驱
7、动程序并进行测试1.编译驱动程序在控制台下进入文件所在目录,输入命令make。没有错误提示,说明make成功,进入文件夹下可以看到多了一些.k,.ko之类的文件。这就是编译好的模块。2. 装载模块同样,必须要是root下才能进行。装载前,我们可以先看看系统中的模块:lsmod装载,输入命令: insmod chardev.ko完成后,再看看系统中的模块,发现多了一个模块“chardev”,表示我们成功加载3.分配次设备号每个文件都有两个设备号,第一个是主设备号,标识驱动程序,第二个是从设备号,标识使用同一个设备驱动程序的不同的硬件设备,比如有两个软盘,就可以用从设备号来区分他们.设备文件的的主
8、设备号必须与设备驱动程序在登记时申请的主设备号一致,否则用户进程将无法访问到驱动程序.。分配前,我们必须要知道主设备号(其实在上一步中我们从dmesg中已经看到主设备好为248): cat /proc/devices可见到这一行:248 chardev,是了,主设备号为248.现在我们分配从设备号:mknod /dev/chardev c 248 0实际上就是在虚拟文件夹/dev/中加一个设备(在系统看来是文件)chardev ,注意,这个是设备名,在测试文件中真是要利用这个设备名打开设备。最后的0表示从设备号。可以随便分配(只要不冲突)。此后便可以在/dev/目录下看到新建的设备charde
9、v了:ls /dev/一切成功的话,就可以测试我们的驱动程序了4.测试驱动程序首先要编译测试程序:gcc main.c得到sb可执行程序,再执行 :./sb测试程序首先列出所有的设备名,让我们选中一个,当然输入devices啦: 正确读出之前存放在设备中的字符串!然后提示让我们输入一个字符串,实践证明是正确保存、读出5.删除设备、模块首先删除设备。就像删除普通文件一样:rm /dev/chardev删除后,看看/dev/目录下是否已经没有chardev了?:ls /dev/接着删除模块:rmmod chardev.看看模块列表中是否已经没有chardev模块了?:lsmod四、遇到的问题以及解
10、决的方法1、主机上面的文件与虚拟机无法共享,下载在主机上的内核文件无法拷贝到在虚拟机中解决方法:运用虚拟机上面的浏览器下载内核文件到Download文件夹,解压并编译。2、编译内核的过程很慢,没有完全发挥cpu的应有性能解决方法:上网查阅资料发现在编译过程中输入指令make j*(其中*为编译过程最多可调用的cpu线程数)可以充分调用cpu各线程性能,编译速度提升明显。五、实验心得体会通过此次实验,首先我学会了Linux操作系统的安装过程,同时了解并熟悉了一些常用的操作指令,对Linux的内核有了新的认识与了解,学习并掌握了内核的更新编译方法。并且通过上网学习与查阅,了解并实践编写了一个简单的模块化字符设备驱动程序,动态地装载和卸载以模块形式存在的字符设备驱动程序,同时,学会对所编写的字符设备驱动程序进行测试,最终了解Linux操作系统是如何管理字符设备的。实验的难度适中,但是需要格外的耐心与细致,因为有时候不知道哪里出现一点问题就需要重头再来一遍。总之通过此次实验不仅掌握了相关知识,也锻炼了细致耐心的态度。- 9 -