1、实验室实验2Linux内核移植项目二:Linux内核移植 1. 能力培养目标 了解嵌入式Linux内核的构成 掌握内核裁减定制的方法 掌握内核编译的方法 掌握内核烧写的方法2. 项目任务要求(1)项目任务 Linux内核的裁剪、编译和烧写。(2)项目来源及应用对于较复杂的嵌入式系统项目,当硬件平台制作好之后,就需要向其移植操作系统,如果移植的是嵌入式Linux且为GUI应用,那么移植过程一般包含:第一步,移植引导程序(Vivi、Blob、U-Boot等);第二步,移植内核kernel;(本次实验内容)第三步,移植根文件系统;第四步,移植库文件,如QT库;第五步,运行项目程序。(3)功能需求裁剪
2、一个可用的Linux内核 选择正确的处理器类型 使其支持网卡、小键盘、USB鼠标、声卡等设备 成功编译后烧写到目标机上 内核能正确加载运行 键盘驱动可用(4)项目开发环境需求硬件宿主机PC机、USB转串口线、网线目标机ARM目标机软件宿主机windows系统:WinXP Xin7 其他: Linux 系统:RedHat 9 RHEL4 其他: VMWare虚拟机:VMWare Workstation9 其他: 串口调试工具:WinXP自带的超级终端Linux自带的minicom第三方串口工具: 目标机嵌入式Linux 3. 项目预习(1)了解项目目标、项目任务要求、项目设计和项目实施步骤。(2
3、)下载本次实验所需要的软件和代码。将kbd_test目录放到Linux虚拟机的up-techpxa270cl目录下。(3)完成内核裁剪及编译好内核映像。(4)回答以下问题 如何能够在目标机上访问宿主机上的文件? 说明使用mount命令进行文件挂载的方法。 说明mount命令执行不成功可能的原因和解决方法。 说明本实验所使用的Linux内核版本。 说明Linux内核裁减定制的方法。4. 项目设计4.1选择Linux内核裁剪方法Linux内核的裁减配置的三种命令:1、make config:命令行模式,一行一行的配置,不推荐使用。2、make menuconfig:大多人熟悉的menuconfig
4、菜单。3、make xconfig:基于QT图形化配置,菜单结构清晰。所有内核裁减配置过程,都是通过Config.in(2.4内核)或Kconfig(2.6内核)经由不同脚本解释器产生.config配置文件。make menuconfig配置菜单make xconfig配置菜单在配置时,通常有三种选择方式: Y:将该功能编译进内核; N:不将该功能编译进内核; M:以模块方式编译,需要时可以动态插入到内核中。在make menuconfig界面中,用空格键来切换各种选择状态;在make xconfig界面中,可以用空格键,也可以使用鼠标来选择。注意:对于陌生选项,请不要修改,保留默认即可。5.
5、 项目实施课堂实验部分第一部分:将键盘功能直接编译进内核(1)检查修改内核源代码目录下的Makefile文件。命令:rootlocalhost /#cd /up-techpxa270cl/kernel/rootlocalhost kernel# lsrootlocalhost kernel# tar -jxvf linux-2.6.9-uptechpxa270cl.tar.bz2rootvm-dev # cd /up-techpxa270cl/kernel/linux-2.6.9-uptechpxa270cl#gedit Makefile打开Makefile文件,找到以下几行:如果不是下面的结
6、果,则按下面内容修改。其中: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),然后在默认配置基础上,使用make menuconfig对内核进行裁减。root linux-2.6.9-uptechpxa270cl # cp
7、up-techpxa270-cl-2008-05-26.config .configroot linux-2.6.9-uptechpxa270cl # make menuconfig如果出现“at least 80 columns”,说明屏幕不够大,全屏即可。思考:.config配置文件作用?按照以下步骤和提示,选中目标机所需的模块支持(使用“上下箭头”移动,使用“Enter”进入,使用“Esc”返回上级)。a、选择处理器类型(默认已经选上)System Type - ARM system type (PXA2xx-based) - (X) PXA2xx-basedb、网卡设备(默认已经选上)
8、Networking support - * Network device supportEthernet (10 or 100Mbit) -* Ethernet (10 or 100Mbit) DM9000 supportc、矩阵键盘设备(使用空格键切换选择,选中Atmel项,按下空格键,可以在*,M和空之间变换,*表示编译到内核,M表示动态模块方式加载,空表示不支持)I2C support - I2C supportI2C Hardware Bus support - Intel PXA2XX I2C adapterOther I2C Chip support - Atmel Mega8
9、MCU on UPTechPXA270-classic platform* Matrix Keyboard d、USB鼠标支持Input device support - Mouse interface USB support - (位置在下方,默认已经选上) USB Human Interface Device (full HID) support* HID input layer support* /dev/hiddev raw HID device supporte、声卡支持(默认已经选上)Sound - Sound card supportOpen Sound System - PXA
10、 Audio PXA AC97 audio support UCB1X00 core support UCB1X00 touchscreen plugin 退出并保存配置信息。思考:上面配置选项应该在哪个目录下的哪个文件里(KConfig)?通过make menuconfig裁剪完后,.config文件会有哪些变化?若内核中没有你想要的功能模块选项将怎么办(拷贝驱动程序,修改KConfig等)?(3)编译新内核在内核目录下(up-techpxa270cl/kernel/linux-2.6.9-up-techpxa270cl/),执行make命令,进行内核的编译。root linux-2.6.9
11、-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/bootrootboot# ls(4)烧写新内核0)将已经生成的zImage拷贝到/tftpboot目录下(如果询问是否覆盖,输入y)。rootboot #cp rf zImage
12、/tftpboot1)配置tftp服务首先请确保Linux虚拟机的tftp服务已经正确配置,并运行。在虚拟机上用vi打开“/etc/xinetd.d/tftp”,做相应的修改。(大部分网络服务都是由它启动的)rootvm-dev #vi /etc/xinetd.d/tftp找到disable = no这一项,看看是不是此状态(默认是),若不是,则改成此状态,保存退出。重启tftp服务,命令如下:rootvm-dev #service xinetd restart查看tftp服务是否启动:rootvm-dev #service xinetd status实验室实验部分2)烧写新内核首先检查虚拟机
13、IP是不是192.168.0.10,若不是,则用ifconfig eth0 192.168.0.10改过来。 启动目标机,进入blob模式下(按回车之外的任意键)。然后将内核zImage烧写到Ram。blob tdownload kernel出现下面状态表示正确:file: zImage, part kerneldownloading zImage to 0xa0200000done如果出现ARP timeout错误,可能是网络原因,可以尝试将windows网卡禁用并启用,改IP,检查网线等。接着,将内核zImage烧写到Flash。blob flash kernel出现下面状态表示正确:Sa
14、ving kernel to flashfwrite 0xa0200000 0x100000 1597152Erasing 13 blocks at 0x00100000:.doneFlashing 0x00185ee0 bytes at 0x00100000:.done说明:启动目标机后,应该首先配置tftp服务器的IP,配置命令如下:blob ifconfig server 192.168.0.10。因为虚拟机IP前面已经配置为192.168.0.10了,所以此步就不用做了。 其中,tftp server的IP是Linux虚拟机的IP。重启ARM目标机后可能需要重新配置tftp serve
15、r的IP。如果在blob下修改IP失败或者超时等,可以将Linux虚拟机的IP修改为192.168.0.10(默认的server IP是192.168.0.10)。(5)测试新内核重启ARM目标机,按回车键,看是否能正常进入Linux系统。然后,查看键盘驱动是否好用。rootIntel /# ls /dev/Mega8Kbd 命令查看键盘设备节点会显示:如果看不到设备结点,创建设备结点的命令是mknod 设备名 设备类型 主设备号 从设备号如:mknod /dev/Mega8kbd c 253 0通过cat /proc/devices查看设备信息,以及运行键盘测试程序getkey。看看是否键盘
16、驱动已经直接加入了内核,并且已经自动创建好设备节点,键盘测试程序能够正确获得按键信息。再次查看当前系统设备情况,结果表明有Mega8Kbd键盘设备。rootIntel kbd_test#cat /proc/devicesCharacter devices: 1 mem 2 pty 3 ttyp 4 /dev/vc/0 4 tty 4 ttyS 5 /dev/tty 5 /dev/console 5 /dev/ptmx 7 vcs 10 misc 13 input 14 sound 21 sg 29 fb 81 video4linux 89 i2c 90 mtd108 ppp128 ptm136
17、 pts161 ircomm180 usb252 Mega8ICcard253 Mega8Kbd254 pcmcia(6)将kbd_test目录放到Linux虚拟机的up-techpxa270cl目录下,命令如下:rootvm-dev #cp -rf /mnt/hgfs/share/kbd_test /up-techpxa270cl/kbd_test目录中的内容如下:我们只用到了getkey。其中: getkey为交叉编译生成的可执行程序,用于测试键盘设备; mega8.ko为键盘等控制芯片的驱动程序,i2c-pxa.ko为i2c接口驱动; install_driver.sh为动态加载mega
18、.ko和i2c-pxa.ko的脚本; zImage为裁剪、编译后的内核。在Putty上(目标机)上,使用mount命令挂载,运行键盘测试程序getkey。查看getkey是否可以运行?Cant open keyboard!表示不能打开键盘设备。为防止大文件传输失败,在mount中加入参数o intr,nolock,rsize=4096,wsize=4096rootIntel /# mount t nfs o intr,nolock,rsize=4096,wsize=4096 192.168.0.10:/up-techpxa270cl /mnt/nfsrootIntel /#cd /mnt/nf
19、s/kbd_test运行键盘测试程序:按ARM目标机上的小键盘,可以正确读取到按键值。rootIntel kbd_test#./getkey扩展发辉部分第二部分:将键盘功能以模块化方式编译(1)在虚拟机上,重新裁剪内核,命令:rootvm-dev # cd /up-techpxa270cl/kernel/linux-2.6.9-uptechpxa270clrootvm-dev # make menuconfig按照以下步骤和提示,选中目标机所需的模块支持(使用“上下箭头”移动,使用“Enter”进入,使用“Esc”返回上级)。矩阵键盘设备(使用空格键切换选择,选中Atmel项,按下空格键,可以
20、在*,M和空之间变换,*表示编译到内核,M表示动态模块方式加载,空表示不支持)I2C support - I2C supportI2C Hardware Bus support - Intel PXA2XX I2C adapterOther I2C Chip support - Atmel Mega8 MCU on UPTechPXA270-classic platform* Matrix Keyboard 退出并保存配置信息。(2)编译新内核在内核目录下(up-techpxa270cl/kernel/linux-2.6.9-up-techpxa270cl/),执行make命令,进行内核的编译
21、。rootvm-dev #make将已经生成的zImage拷贝到/tftpboot目录下(如果询问是否覆盖,输入y)。rootvm-dev #cp rf zImage /tftpboot(3)重新烧写新内核,见第一部分的2)(4)启动ARM目标机,查看内核对键盘的支持情况(通过超级终端)查看键盘设备节点/dev/Mega8Kbd是否已经存在?No such file or directory表示不存在。rootIntel /#ls /dev/Mega8Kbdls: /dev/Mega8Kbd: No such file or directory查看键盘驱动是否以模块形式动态加载?以下结果表示没
22、有动态加载。rootIntel /#lsmodModule Size Used by Not taintedrootIntel /#查看当前系统设备中是否有Mega8Kbd设备?rootIntel /#cat /proc/devicesCharacter devices: 1 mem 2 pty 3 ttyp 4 /dev/vc/0 4 tty 4 ttyS 5 /dev/tty 5 /dev/console 5 /dev/ptmx 7 vcs 10 misc 13 input 14 sound 21 sg 29 fb 81 video4linux 89 i2c 90 mtd108 ppp12
23、8 ptm136 pts161 ircomm180 usb254 pcmcia(5)动态加载键盘驱动,并测试1)在虚拟机上,找到我们要加载的驱动模块,命令:rootvm-dev # cd drivers/i2crootvm-dev # cd busses/rootvm-dev # cp -rf i2c-pxa.ko /up-techpxa270cl/rootvm-dev # cd .rootvm-dev # cd chips/rootvm-dev # cp -rf mega8.ko /up-techpxa270cl/2)在目标机上,重新mountrootIntel /# mount t nfs
24、 o intr,nolock,rsize=4096,wsize=4096 192.168.0.10:/up-techpxa270cl /mnt/nfsrootIntel /#cd /mnt/nfs/rootIntel nfs/#lsrootIntel nfs/# insmod i2c-pxa.ko rootIntel nfs/# insmod mega8.ko再次查看键盘设备节点是否已经存在?看到/dev/Mega8Kbd表明已经存在。如果看不到设备结点,创建设备结点的命令是mkmod 设备名 设备类型 主设备号 从设备号如:mkmod /dev/Mega8kbd c 253 0再次查看键盘驱
25、动是否以模块形式动态加载?结果表明动态加载了驱动。再次查看当前系统设备情况,结果表明有Mega8Kbd键盘设备。rootIntel nfs#cat /proc/devicesCharacter devices: 1 mem 2 pty 3 ttyp 4 /dev/vc/0 4 tty 4 ttyS 5 /dev/tty 5 /dev/console 5 /dev/ptmx 7 vcs 10 misc 13 input 14 sound 21 sg 29 fb 81 video4linux 89 i2c 90 mtd108 ppp128 ptm136 pts161 ircomm180 usb25
26、2 Mega8ICcard253 Mega8Kbd254 pcmcia再次运行键盘测试程序:按ARM目标机上的小键盘,可以正确读取到按键值。rootIntelnfs#cd /mnt/nfs/kbd_testrootIntel kbd_test#./getkeywhich key you press is 1which key you press is 2which key you press is 36. 项目问题1、 说明本次实验中的硬件系统。2、 嵌入式Linux内核的代码构成?主要的设备驱动程序放在什么目录下?3、 说明动态加载模块的命令,卸载模块的命令,创建设备节点的命令。4、 说明内
27、核裁剪定制的方法。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%实验报告检查提问
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1