动态加载驱动和Linux内核移植.pdf
项目三:项目三:LinuxLinux 内核移植内核移植1. 1. 能力培养目标能力培养目标了解嵌入式 Linux 内核的构成掌握内核裁减定制的方法掌握内核编译的方法掌握内核烧写的方法2. 2. 项目任务要求项目任务要求(1 1)项目任务)项目任务Linux 内核的裁剪、编译和烧写。(2 2)项目来源及应用)项目来源及应用对于较复杂的嵌入式系统项目,当硬件平台制作好之后,就需要向其移植操作系统,如果移植的是嵌入式 Linux 且为 GUI 应用,那么移植过程一般包含:第一步,移植引导程序(Vivi、BLOB、uBoot 等);第二步,移植内核 kernel;(本次实验内容)第三步,移植根文件系统;第四步,移植库文件,如 QT 库;第五步,运行项目程序。(3 3)功能需求)功能需求裁减一个可用的 Linux 内核选择正确的处理器类型使其支持网卡、小键盘、USB 鼠标、声卡等设备成功编译后烧写到目标机上内核能正确加载运行键盘驱动可用(4 4)项目开发环境需求)项目开发环境需求硬件软件宿主机目标机宿主机PC 机、USB 转串口线、网线ARM 目标机windows 系统:WinXPXin7其他:Linux系统:RedHat 9RHEL4其他:VMWare 虚拟机:VMWare Workstation9其他:串口调试工具:WinXP 自带的超级终端Linux 自带的 minicom第三方串口工具:嵌入式 Linux目标机3. 3. 项目预习项目预习(1)了解项目目标、项目任务要求、项目设计和项目实施步骤。(2)下载本次实验所需要的软件和代码。将3_kbd_test 目录放到 linux 虚拟机的 up-techpxa270cl 目录下。(3)完成内核裁剪及编译好内核映像,即完成第5 大项中的步骤(4)-(5)。(4)回答以下问题如何能够在目标机上访问宿主机上的文件?说明使用 mount 命令进行文件挂载的方法。说明 mount 命令执行不成功可能的原因和解决方法。说明本实验所使用的 Linux 内核版本。说明 Linux 内核裁减定制的方法。4. 4. 项目设计项目设计4.1 选择 Linux 内核裁减方法Linux 内核的裁减配置的三种命令:1、make config:命令行模式,一行一行的配置,不推荐使用。2、make menuconfig:大多人熟悉的 menuconfig 菜单。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 1)将 3_kbd_test 目录放到 linux 虚拟机的 up-techpxa270cl 目录下。3_kbd_test 目录中的内容如下:其中:getkey 为交叉编译生成的可执行程序,用于测试键盘设备;mega8.ko 为键盘等控制芯片的驱动程序,i2c-pxa.ko 为 i2c 接口驱动;install_driver.sh为动态加载 mega.ko 和 i2c-pxa.ko 的脚本;zImage 为裁剪、编译后的内核。(2 2)查看)查看 ARMARM 目标机自带内核对键盘的支持情况(通过超级终端)目标机自带内核对键盘的支持情况(通过超级终端)查看键盘设备节点/dev/Mega8Kbd是否已经存在?No such file or directory 表示不存在。rootIntel /#ls/dev/Mega8Kbdls: /dev/Mega8Kbd: No such file or directory查看键盘驱动是否以模块形式动态加载?以下结果表示没有动态加载。rootIntel /#lsmodModuleSizeUsed byNot taintedrootIntel /#查看当前系统设备中是否有 Mega8Kbd 设备?rootIntel /#cat/proc/devicesCharacter devices:1 mem2 pty3 ttyp4 /dev/vc/04 tty4 ttyS5 /dev/tty5 /dev/console5 /dev/ptmx7 vcs10 misc13 input14 sound21 sg29 fb81 video4linux89 i2c90 mtd108 ppp128 ptm136 pts161 ircomm180 usb254 pcmcia使用 mount 命令挂载,运行键盘测试程序 getkey。查看 getkey 是否可以运行?Cant open keyboard!表 示 不 能 打 开 键 盘 设 备 。 为 防 止 大 文 件 传 输 失 败 , 在mount中 加 入 参 数 ointr,nolock,rsize=4096,wsize=4096rootIntel /#ifconfig eth0 192.168.0.10(些处为了后面烧写内核方便,虚拟机为服务器)rootIntel /#service nfs restartrootIntel /# mountt nfs o intr,nolock,rsize=4096,wsize=4096 192.168.0.10:/up-techpxa270cl /mnt/nfsrootIntel /#cd /mnt/nfs/3_kbd_testrootIntel 3_kbd_test#./getkeyKBD_Open - Cant open keyboard!Cant open keyboard!KBD KEY: Bad file descriptor(3 3)在自带内核的基础上,动态加载键盘驱动,并测试)在自带内核的基础上,动态加载键盘驱动,并测试使用install_driver.sh 脚本加载驱动程序:rootIntel 3_kbd_test#./install_driver.shi2c_pxa: module license unspecified taints kernel.I2C: Slave address 1I2C: Enabling slave modeI2C: i2c-0: PXA I2C adapterI2C: Slave address 1I2C: Enabling slave modeno PS/2 device found on PS/2 Port 0!no PS/2 device found on PS/2 Port 1!rootIntel 3_kbd_test#注:如果install_driver.sh不能运行,分析原因,若是权限问题可执行命令chmod 777 将该目录下的文件执行权限放开,并再次执行 install 命令。也可以不执行 install 命令而是直接输入以下两条命令(install_driver.sh文件中的内容) 。insmodi2c-pxa.koinsmodmega8.ko如果提示已经存在,可以使用rmmod i2c-pxa.ko和rmmod mega8.ko卸载,然后重新加载。再次查看键盘设备节点是否已经存在?看到/dev/Mega8Kbd 表明已经存在。rootIntel 3_kbd_test#ls/dev/Mega8Kbd/dev/Mega8Kbd如果看不到设备结点,创建设备结点的命令是mkmod设备名 设备类型 主设备号 从设备号如:mkmod /dev/Mega8kbd c 253 0mkmod /dev/Mega8kbd c 253 0再次查看键盘驱动是否以模块形式动态加载?结果表明动态加载了驱动。rootIntel 3_kbd_test#lsmodModuleSizeUsed byTainted: Pmega8172440i2c_pxa67241 mega8rootIntel kbd_test#再次查看当前系统设备情况,结果表明有 Mega8Kbd 键盘设备。rootIntel 3_ kbd_test#cat /proc/devicesCharacter devices:1 mem2 pty3 ttyp4 /dev/vc/04 tty4 ttyS5 /dev/tty5 /dev/console5 /dev/ptmx7 vcs10 misc13 input14 sound21 sg29 fb81 video4linux89 i2c90 mtd108 ppp128 ptm136 pts161 ircomm180 usb252 Mega8ICcard253 Mega8Kbd254 pcmcia再次运行键盘测试程序:按 ARM 目标机上的小键盘,可以正确读取到按键值。rootIntel 3_kbd_test#./getkeywhich key you press is1which key you press is2which key you press is3课堂实验部分(4 4)检查)检查修改内核源代码目录下的 Makefile 文件。命令:rootvm-dev # cd /up-techpxa270cl/kernel/linux-2.6.9-uptechpxa270cl打开 Makefile 文件,找到以下几行:如果不是下面的结果,则按下面内容修改。其中:ARCH := arm 表示编译支持 ARM 体系结构CROSS_COMPILE = 您的交叉编译工具中 arm-Linux 所在目录/arm-Linux-例如:CROSS_COMPILE = /up-techpxa270/arm-linux-tools/gcc-3.4.6-glibc-2.3.6/arm-linux/bin/arm-linux-(5 5)裁剪新内核)裁剪新内核在内核源代码目录(up-techpxa270cl/kernel/linux-2.6.9-up-techpxa270cl/)中,拷贝一个已有的默认配置文件更名为.config (如果询问是否覆盖, 输入 y) , 然后在默认配置基础上, 使用 make menuconfig对内核进行裁减。rootvm-dev # cp up-techpxa270-cl-2008-05-26.config .configrootvm-dev # make menuconfig如果出现“at least 80 columns” ,说明屏幕不够大,全屏即可。思考:.config 配置文件作用?按照以下步骤和提示,选中目标机所需的模块支持(使用“上下箭头”移动,使用“ Enter”进入,使用“Esc”返回上级) 。1、选择处理器类型(默认已经选上)(默认已经选上)System Type-ARM system type (PXA2xx-based)-(X) PXA2xx-based2、网卡设备(默认已经选上)(默认已经选上)Networking support-* Network device supportEthernet (10 or 100Mbit)-* Ethernet (10 or 100Mbit) DM9000 support3、矩阵键盘设备(使用空格键切换选择,选中Atmel 项,按下空格键,可以在* *,MM 和空空之间变换,*表示编译到内核,M 表示动态模块方式加载,空表示不支持)I2C support- I2C supportI2C Hardware Bus support- Intel PXA2XX I2C adapterOther I2C Chip support- Atmel Mega8 MCU on UPTechPXA270-classic platform*Matrix Keyboard4、USB 鼠标支持Input device support- Mouse interfaceUSB support-(位置在下方,默认已经选上)USB Human Interface Device (full HID) support* HID input layer support* /dev/hiddev raw HID device support5、声卡支持(默认已经选上)Sound- Sound card supportOpen Sound System- PXA AudioPXA AC97 audio supportUCB1X00 core supportUCB1X00 touchscreen plugin退出并保存配置信息。思考:上面配置选项应该在哪个目录下的哪个文件里( KConfig)?通过make menuconfig 裁剪完后,.config 文件会有哪些变化?若内核中没有你想要的功能模块选项将怎么办(拷贝驱动程序,修改KConfig 等)?(6 6)编译新内核)编译新内核在内核目录下(up-techpxa270cl/kernel/linux-2.6.9-up-techpxa270cl/) ,执行 make 命令,进行内核的编译。rootvm-dev #make编译成功后,会在/up-techpxa270cl/kernel/linux-2.6.9-up-techpxa270cl/arch/arm/boot 目录下生成新内核文件 zImage。rootvm-dev# cd/up-techpxa270cl/kernel/linux-2.6.9-up-techpxa270cl/arch/arm/bootrootvm-dev# ls(7 7)烧写新内核)烧写新内核0 0)将已经生成的)将已经生成的 zImagezImage 拷贝到拷贝到/tftpboot/tftpboot 目录下目录下(如果询问是否覆盖,输入 y) 。rootvm-dev #cp rf zImage /tftpboot1 1)配置)配置 tftptftp 服务服务首先请确保 Linux 虚拟机的 tftp 服务已经正确配置,并运行。在虚拟机虚拟机上用 vi 打开“/etc/xinetd.d/tftp” ,做相应的修改。(大部分网络服务都是由它启动的)rootvm-dev #vi /etc/xinetd.d/tftp找到 disable = nodisable = no 这一项,看看是不是此状态(默认是) ,若不是,则改成此状态,保存退出。重启 tftp 服务,命令如下:rootvm-dev #service xinetd restart查看 tftp 服务是否启动:rootvm-dev #service xinetd status2 2)烧写新内核)烧写新内核给目标机加电后,进入 blob 模式下(按回车之外的任意键按回车之外的任意键) ,首先配置 tftp 服务器的 IP。blob ifconfig server 192.168.0.10(因为虚拟机IP前面已经配置为192.168.0.10了, 所以此步可不做)注意:tftp server 的 IP 是 Linux 虚拟机的 IP。重启 ARM 目标机后可能需要重新配置 tftp server 的 IP。如果在 blob 下修改 IP 失败或者超时等,可以将 Linux 虚拟机的 IP 修改为 192.168.0.10(默认的 server IP 是192.168.0.10)。然后将内核 zImage 烧写到 Ram。blob tdownload kernel出现下面状态表示正确:file: zImage, part kerneldownloading zImage to 0 xa0200000done如果出现 ARP timeout 错误,可能是网络原因,可以尝试将 windows 网卡禁用并启用,改 IP,检查网线等。再将内核 zImage 烧写到 Flash。blob flash kernel出现下面状态表示正确:Saving kernel to flashfwrite 0 xa0200000 0 x100000 1597152Erasing 13 blocks at 0 x00100000:.doneFlashing 0 x00185ee0 bytes at 0 x00100000:.done(8 8)测试新内核)测试新内核重启 ARM 目标机,按回车键,看是否能正常进入 Linux 系统。无需手动加载驱动,直接通过:lsls/dev/Mega8Kbd/dev/Mega8Kbd命令查看键盘设备节点,会显示:通过 cat /proc/devices 查看设备信息,以及运行键盘测试程序 getkey。看看是否键盘驱动已经直接加入了内核,并且已经自动创建好设备节点,键盘测试程序能够正确获得按键信息。再次查看当前系统设备情况,结果表明有 Mega8Kbd 键盘设备。rootIntel kbd_test#cat /proc/devicesCharacter devices:1 mem2 pty3 ttyp4 /dev/vc/04 tty4 ttyS5 /dev/tty5 /dev/console5 /dev/ptmx7 vcs10 misc13 input14 sound21 sg29 fb81 video4linux89 i2c90 mtd108 ppp128 ptm136 pts161 ircomm180 usb252 Mega8ICcard253 Mega8Kbd254 pcmcia(9 9)还原系统自带内核)还原系统自带内核将 3_kbd_test 目录下的 zImage 拷贝到/tftpboot/目录下。重新执行(7) ,并重启ARM 目标机,按回车键,看是否能正常进入 Linux 系统。6. 6. 项目运行项目运行运行结果要求:1、正确启动 ARM 目标机的系统2、键盘测试程序正确读取键值信息7. 7. 项目问题项目问题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、说明 Makefile 文件与.config 的关系?12、如何编译内核 kernel?13、内核 kernel 如何烧写到目标机中?8. 8. 项目考核项目考核考核项目实验预习(个人)实验过程及结果(个人)权重20%40%主要考核点实验要求的预习项动手执行能力解决问题的能力项目完成程度实验总结(个人)40%实验报告检查提问