实验室实验2Linux内核移植.docx
《实验室实验2Linux内核移植.docx》由会员分享,可在线阅读,更多相关《实验室实验2Linux内核移植.docx(19页珍藏版)》请在冰豆网上搜索。
实验室实验2Linux内核移植
项目二:
Linux内核移植
1.能力培养目标
●了解嵌入式Linux内核的构成
●掌握内核裁减定制的方法
●掌握内核编译的方法
●掌握内核烧写的方法
2.项目任务要求
(1)项目任务
Linux内核的裁剪、编译和烧写。
(2)项目来源及应用
对于较复杂的嵌入式系统项目,当硬件平台制作好之后,就需要向其移植操作系统,如果移植的是嵌入式Linux且为GUI应用,那么移植过程一般包含:
第一步,移植引导程序(Vivi、Blob、U-Boot等);
第二步,移植内核kernel;(本次实验内容)
第三步,移植根文件系统;
第四步,移植库文件,如QT库;
第五步,运行项目程序。
(3)功能需求
裁剪一个可用的Linux内核
●选择正确的处理器类型
●使其支持网卡、小键盘、USB鼠标、声卡等设备
●成功编译后烧写到目标机上
●内核能正确加载运行
●键盘驱动可用
(4)项目开发环境需求
硬件
宿主机
PC机、USB转串口线、网线
目标机
ARM目标机
软件
宿主机
windows系统:
□WinXP□Xin7其他:
Linux系统:
□RedHat9□RHEL4其他:
VMWare虚拟机:
□VMWareWorkstation9其他:
串口调试工具:
□WinXP自带的超级终端
□Linux自带的minicom
□第三方串口工具:
目标机
嵌入式Linux
3.项目预习
(1)了解项目目标、项目任务要求、项目设计和项目实施步骤。
(2)下载本次实验所需要的软件和代码。
将kbd_test目录放到Linux虚拟机的up-techpxa270cl目录下。
(3)完成内核裁剪及编译好内核映像。
(4)回答以下问题
如何能够在目标机上访问宿主机上的文件?
说明使用mount命令进行文件挂载的方法。
说明mount命令执行不成功可能的原因和解决方法。
说明本实验所使用的Linux内核版本。
说明Linux内核裁减定制的方法。
4.项目设计
4.1选择Linux内核裁剪方法
Linux内核的裁减配置的三种命令:
1、makeconfig:
命令行模式,一行一行的配置,不推荐使用。
2、makemenuconfig:
大多人熟悉的menuconfig菜单。
3、makexconfig:
基于QT图形化配置,菜单结构清晰。
所有内核裁减配置过程,都是通过Config.in(2.4内核)或Kconfig(2.6内核)经由不同脚本解释器产生.config配置文件。
makemenuconfig配置菜单
makexconfig配置菜单
在配置时,通常有三种选择方式:
●Y:
将该功能编译进内核;
●N:
不将该功能编译进内核;
●M:
以模块方式编译,需要时可以动态插入到内核中。
在makemenuconfig界面中,用空格键来切换各种选择状态;在makexconfig界面中,可以用空格键,也可以使用鼠标来选择。
注意:
对于陌生选项,请不要修改,保留默认即可。
5.项目实施
=======================================
课堂实验部分
=======================================
第一部分:
将键盘功能直接编译进内核
(1)检查修改内核源代码目录下的Makefile文件。
命令:
[root@localhost/]#cd/up-techpxa270cl/kernel/
[root@localhostkernel]#ls
[root@localhostkernel]#tar-jxvflinux-2.6.9-uptechpxa270cl.tar.bz2
[root@vm-dev]#cd/up-techpxa270cl/kernel/linux-2.6.9-uptechpxa270cl
#geditMakefile打开Makefile文件,找到以下几行:
如果不是下面的结果,则按下面内容修改。
其中:
ARCH:
=arm表示编译支持ARM体系结构
CROSS_COMPILE=您的交叉编译工具中arm-Linux所在目录/arm-Linux-
例如:
CROSS_COMPILE=arm-linux-
(2)裁剪新内核
在内核源代码目录(/up-techpxa270cl/kernel/linux-2.6.9-up-techpxa270cl/)中,拷贝一个已有的默认配置文件更名为.config(如果询问是否覆盖,输入y),然后在默认配置基础上,使用makemenuconfig对内核进行裁减。
[root@linux-2.6.9-uptechpxa270cl]#cpup-techpxa270-cl-2008-05-26.config.config
[root@linux-2.6.9-uptechpxa270cl]#makemenuconfig
如果出现“atleast80columns”,说明屏幕不够大,全屏即可。
思考:
.config配置文件作用?
按照以下步骤和提示,选中目标机所需的模块支持(使用“上下箭头”移动,使用“Enter”进入,使用“Esc”返回上级)。
a、选择处理器类型(默认已经选上)
SystemType--->
ARMsystemtype(PXA2xx-based)--->
(X)PXA2xx-based
b、网卡设备(默认已经选上)
Networkingsupport--->
[*]Networkdevicesupport
Ethernet(10or100Mbit)--->
[*]Ethernet(10or100Mbit)
<*>DM9000support
c、矩阵键盘设备(使用空格键切换选择,选中Atmel项,按下空格键,可以在*,M和空之间变换,*表示编译到内核,M表示动态模块方式加载,空表示不支持)
I2Csupport--->
<*>I2Csupport
I2CHardwareBussupport--->
<*>IntelPXA2XXI2Cadapter
OtherI2CChipsupport--->
<*>AtmelMega8MCUonUPTechPXA270-classicplatform
[*]MatrixKeyboard
d、USB鼠标支持
Inputdevicesupport--->
<*>Mouseinterface
USBsupport--->(位置在下方,默认已经选上)
<*>USBHumanInterfaceDevice(fullHID)support
[*]HIDinputlayersupport
[*]/dev/hiddevrawHIDdevicesupport
e、声卡支持(默认已经选上)
Sound--->
<*>Soundcardsupport
OpenSoundSystem--->
<*>PXAAudio
<*>PXAAC97audiosupport
<*>UCB1X00coresupport
<*>UCB1X00touchscreenplugin
退出并保存配置信息。
思考:
上面配置选项应该在哪个目录下的哪个文件里(KConfig)?
通过makemenuconfig裁剪完后,.config文件会有哪些变化?
若内核中没有你想要的功能模块选项将怎么办(拷贝驱动程序,修改KConfig等)?
(3)编译新内核
在内核目录下(up-techpxa270cl/kernel/linux-2.6.9-up-techpxa270cl/),执行make命令,进行内核的编译。
[root@linux-2.6.9-uptechpxa270cl]#make
编译成功后,会在/up-techpxa270cl/kernel/linux-2.6.9-up-techpxa270cl/arch/arm/boot目录下生成新内核文件zImage。
[root@linux-2.6.9-uptechpxa270cl]#cd/up-techpxa270cl/kernel/linux-2.6.9-up-techpxa270cl/arch/arm/boot
[root@boot]#ls
(4)烧写新内核
0)将已经生成的zImage拷贝到/tftpboot目录下(如果询问是否覆盖,输入y)。
[root@boot]#cp–rfzImage/tftpboot
1)配置tftp服务
首先请确保Linux虚拟机的tftp服务已经正确配置,并运行。
①在虚拟机上用vi打开“/etc/xinetd.d/tftp”,做相应的修改。
(大部分网络服务都是由它启动的)
[root@vm-dev]#vi/etc/xinetd.d/tftp
②找到disable=no这一项,看看是不是此状态(默认是),若不是,则改成此状态,保存退出。
③重启tftp服务,命令如下:
[root@vm-dev]#servicexinetdrestart
④查看tftp服务是否启动:
[root@vm-dev]#servicexinetdstatus
=======================================
实验室实验部分
=======================================
2)烧写新内核
首先检查虚拟机IP是不是192.168.0.10,若不是,则用ifconfigeth0192.168.0.10改过来。
启动目标机,进入blob模式下(按回车之外的任意键)。
然后将内核zImage烧写到Ram。
blob>tdownloadkernel
出现下面状态表示正确:
file:
zImage,partkernel
downloadingzImageto0xa0200000
done
如果出现ARPtimeout错误,可能是网络原因,可以尝试将windows网卡禁用并启用,改IP,检查网线等。
接着,将内核zImage烧写到Flash。
blob>flashkernel
出现下面状态表示正确:
Savingkerneltoflash
fwrite0xa02000000x1000001597152
Erasing13blocksat0x00100000:
.............done
Flashing0x00185ee0bytesat0x00100000:
.............done
说明:
启动目标机后,应该首先配置tftp服务器的IP,配置命令如下:
blob>ifconfigserver192.168.0.10。
因为虚拟机IP前面已经配置为192.168.0.10了,所以此步就不用做了。
其中,tftpserver的IP是Linux虚拟机的IP。
重启ARM目标机后可能需要重新配置tftpserver的IP。
如果在blob下修改IP失败或者超时等,可以将Linux虚拟机的IP修改为192.168.0.10(默认的serverIP是192.168.0.10)。
(5)测试新内核
重启ARM目标机,按回车键,看是否能正常进入Linux系统。
然后,查看键盘驱动是否好用。
[root@Intel/]#ls/dev/Mega8Kbd命令查看键盘设备节点
会显示:
如果看不到设备结点,创建设备结点的命令是
mknod设备名设备类型主设备号从设备号
如:
mknod/dev/Mega8kbdc2530
通过cat/proc/devices查看设备信息,以及运行键盘测试程序getkey。
看看是否键盘驱动已经直接加入了内核,并且已经自动创建好设备节点,键盘测试程序能够正确获得按键信息。
再次查看当前系统设备情况,结果表明有Mega8Kbd键盘设备。
[root@Intelkbd_test]#cat/proc/devices
Characterdevices:
1mem
2pty
3ttyp
4/dev/vc/0
4tty
4ttyS
5/dev/tty
5/dev/console
5/dev/ptmx
7vcs
10misc
13input
14sound
21sg
29fb
81video4linux
89i2c
90mtd
108ppp
128ptm
136pts
161ircomm
180usb
252Mega8ICcard
253Mega8Kbd
254pcmcia
(6)将kbd_test目录放到Linux虚拟机的up-techpxa270cl目录下,命令如下:
[root@vm-dev~]#cp-rf/mnt/hgfs/share/kbd_test/up-techpxa270cl/
kbd_test目录中的内容如下:
我们只用到了getkey。
其中:
●getkey为交叉编译生成的可执行程序,用于测试键盘设备;
●mega8.ko为键盘等控制芯片的驱动程序,i2c-pxa.ko为i2c接口驱动;
●install_driver.sh为动态加载mega.ko和i2c-pxa.ko的脚本;
●zImage为裁剪、编译后的内核。
在Putty上(目标机)上,使用mount命令挂载,运行键盘测试程序getkey。
查看getkey是否可以运行?
Can'topenkeyboard!
表示不能打开键盘设备。
为防止大文件传输失败,在mount中加入参数–ointr,nolock,rsize=4096,wsize=4096
[root@Intel/]#mount–tnfs–ointr,nolock,rsize=4096,wsize=4096192.168.0.10:
/up-techpxa270cl/mnt/nfs
[root@Intel/]#cd/mnt/nfs/kbd_test
运行键盘测试程序:
按ARM目标机上的小键盘,可以正确读取到按键值。
[root@Intelkbd_test]#./getkey
=======================================
扩展发辉部分
=======================================
第二部分:
将键盘功能以模块化方式编译
(1)在虚拟机上,重新裁剪内核,命令:
[root@vm-dev]#cd/up-techpxa270cl/kernel/linux-2.6.9-uptechpxa270cl
[root@vm-dev]#makemenuconfig
按照以下步骤和提示,选中目标机所需的模块支持(使用“上下箭头”移动,使用“Enter”进入,使用“Esc”返回上级)。
矩阵键盘设备(使用空格键切换选择,选中Atmel项,按下空格键,可以在*,M和空之间变换,*表示编译到内核,M表示动态模块方式加载,空表示不支持)
I2Csupport--->
<*>I2Csupport
I2CHardwareBussupport--->
IntelPXA2XXI2Cadapter
OtherI2CChipsupport--->
AtmelMega8MCUonUPTechPXA270-classicplatform
[*]MatrixKeyboard
退出并保存配置信息。
(2)编译新内核
在内核目录下(up-techpxa270cl/kernel/linux-2.6.9-up-techpxa270cl/),执行make命令,进行内核的编译。
[root@vm-dev]#make
将已经生成的zImage拷贝到/tftpboot目录下(如果询问是否覆盖,输入y)。
[root@vm-dev]#cp–rfzImage/tftpboot
(3)重新烧写新内核,见第一部分的2)
(4)启动ARM目标机,查看内核对键盘的支持情况(通过超级终端)
查看键盘设备节点/dev/Mega8Kbd是否已经存在?
Nosuchfileordirectory表示不存在。
[root@Intel/]#ls/dev/Mega8Kbd
ls:
/dev/Mega8Kbd:
Nosuchfileordirectory
查看键盘驱动是否以模块形式动态加载?
以下结果表示没有动态加载。
[root@Intel/]#lsmod
ModuleSizeUsedbyNottainted
[root@Intel/]#
查看当前系统设备中是否有Mega8Kbd设备?
[root@Intel/]#cat/proc/devices
Characterdevices:
1mem
2pty
3ttyp
4/dev/vc/0
4tty
4ttyS
5/dev/tty
5/dev/console
5/dev/ptmx
7vcs
10misc
13input
14sound
21sg
29fb
81video4linux
89i2c
90mtd
108ppp
128ptm
136pts
161ircomm
180usb
254pcmcia
(5)动态加载键盘驱动,并测试
1)在虚拟机上,找到我们要加载的驱动模块,命令:
[root@vm-dev~]#cddrivers/i2c
[root@vm-dev~]#cdbusses/
[root@vm-dev~]#cp-rfi2c-pxa.ko/up-techpxa270cl/
[root@vm-dev~]#cd..
[root@vm-dev~]#cdchips/
[root@vm-dev~]#cp-rfmega8.ko/up-techpxa270cl/
2)在目标机上,重新mount
[root@Intel/]#mount–tnfs–ointr,nolock,rsize=4096,wsize=4096192.168.0.10:
/up-techpxa270cl/mnt/nfs
[root@Intel/]#cd/mnt/nfs/
[root@Intelnfs/]#ls
[root@Intelnfs/]#insmodi2c-pxa.ko
[root@Intelnfs/]#insmodmega8.ko
再次查看键盘设备节点是否已经存在?
看到/dev/Mega8Kbd表明已经存在。
如果看不到设备结点,创建设备结点的命令是
mkmod设备名设备类型主设备号从设备号
如:
mkmod/dev/Mega8kbdc2530
再次查看键盘驱动是否以模块形式动态加载?
结果表明动态加载了驱动。
再次查看当前系统设备情况,结果表明有Mega8Kbd键盘设备。
[root@Intelnfs]#cat/proc/devices
Characterdevices:
1mem
2pty
3ttyp
4/dev/vc/0
4tty
4ttyS
5/dev/tty
5/dev/console
5/dev/ptmx
7vcs
10misc
13input
14sound
21sg
29fb
81video4linux
89i2c
90mtd
108ppp
128ptm
136pts
161ircomm
180usb
252Mega8ICcard
253Mega8Kbd
254pcmcia
再次运行键盘测试程序:
按ARM目标机上的小键盘,可以正确读取到按键值。
[root@Intelnfs]#cd/mnt/nfs/kbd_test
[root@Intelkbd_test]#./getkey
whichkeyyoupressis1
whichkeyyoupressis2
whichkeyyoupressis3
6.项目问题
1、说明本次实验中的硬件系统。
2、嵌入式Linux内核的代码构成?
主要的设备驱动程序放在什么目录下?
3、说明动态加载模块的命令,卸载模块的命令,创建设备节点的命令。
4、说明内核裁剪定制的方法。
5、在配置内核时,通常有三种选择方式:
●Y:
将该功能编译进内核;
●N:
不将该功能编译进内核;
●M:
以模块方式编译,需要时可以动态插入到内核中。
试问,选择M和不进行内核配置、编译直接使用insmod动态加载模块(第5大项步骤3)有何不同?
6、如何对内核kernel进行裁减定制,例如增加一个模块?
7、配置文件主要有哪些?
8、.config文件作用?
内核中有几个.config文件?
9、Kconfig文件作用?
内核中有几个Kconfig文件?
10、Makefile文件作用?
内核中有几个Makefile文件?
11、如何编译内核kernel?
12、内核kernel如何烧写到目标机中?
7.项目考核
考核项目
权重
主要考核点
实验预习(个人)
20%
实验要求的预习项
实验过程及结果(个人)
40%
动手执行能力
解决问题的能力
项目完成程度
实验总结(个人)
40%
实验报告检查
提问