学习笔记:内核编译测试自己编写的驱动
程序员文章站
2024-03-08 10:50:16
...
总结外传
获取内核源码树(内核文件)
先确认内核包里的Makefile文件
- 主要是检查交叉编译工具链位置有没有设置对。CROSS_COMPILE ?= /usr/local/arm/arm-2009q3/bin/arm-none-linux-gnueabi-
- 确认ARCH ?= arm。主要目的是为了编译时能找到arch/arm目录。
使用make x210ii_qt_defconfig 命令配置编译
- 最后只要出现:configuration written to .config这句话,就证明我们的操作是正确的。如果没有出现这句话,就有错误。
- 注意:如果这一步配置没有得到.config文件,是不能进行到下一步的。实际测试时没有.config也可以make menuconfig,但是这样做出来的内核编译和烧写运行应该是有问题的。
使用make menuconfig 命令配置编译,使能nfs服务
- 可能出现的错误1:ncurses库没装
错误信息:
*** Unable to find the ncurses libraries or the
*** required header files.
*** 'make menuconfig' requires the ncurses libraries.
***
*** Install ncurses (ncurses-devel) and try again.
解决方案: apt-get install libncurses5-dev
(参考了:http://blog.csdn.net/yao_qinwei/article/details/8805101)
- 可能出现的错误2:屏幕太小
错误信息:
Your display is too small to run Menuconfig!
It must be at least 19 lines by 80 columns.
解决方案:全屏,或者是把字体调小。
- 配置网络部分,主要是使能CONFIG_IP_PNP以在2中能够看到Root file system on NFS选项
Networking support
Networking options
TCP/IP networking
IP: kernel level autoconfiguration
[*] IP: DHCP support
[*] IP: BOOTP support
[*] IP: RARP support
- 配置开启nfs服务
File systems --->
Network File Systems --->
<*> NFS client support
[*] NFS client support for NFS version 3
[*] NFS client support for the NFSv3 ACL protocol extension
[*] NFS client support for NFS version 4 (EXPERIMENTAL)
[*] NFS client support for NFSv4.1 (DEVELOPER ONLY)
[*] Root file system on NFS
- 总结:make menuconfig是第二步配置,具体的用法和配置意义在后面课程讲。我们这里因为是九鼎已经移植过的,所以第二步配置是可以不做的,直接退出即可。
用键盘的向右方向键移动到EXIT,按回车退出。
使用make 编译内核得到zImage
- 可能出现的错误1:莫名其妙的错误,可以试试先make distclean
- 代码本身的错误:具体问题具体分析,下面只是其中一种情况:
Can't use 'defined(@array)' (Maybe you should just omit the defined()?) at kernel/timeconst.pl line 373.
/home/gec/Desktop/zhu_five/kernel/kernel/Makefile:138: recipe for target 'kernel/timeconst.h' failed
make[1]: *** [kernel/timeconst.h] Error 255
Makefile:883: recipe for target 'kernel' failed
make: *** [kernel] Error 2
解决方案:将kernel/timeconst.pl中第373行的defined()去掉只留下@val就可以正常编译了。
- 编译完成后得到的内核镜像不在源码树的根目录下,在arch/arm/boot这个目录下。得到的镜像名是zImage
虚拟机搭建tftp服务器(用于开发板下载内核,也可以直接用fastboot烧录)
- https://www.cnblogs.com/multimicro/p/9270547.html
- 把编译好的zImage 放到tftp服务器的目录下
虚拟机搭建nfs服务器(用来与开发板建立共享文件夹,方便传送编写的驱动.ko文件)
arm更改ip地址连接虚拟机 (set serverip xxx ,类似这样更改)
-
连接tftp服务器在开发板uboot中设置
set bootcmd 'tftp 0x30008000 zImage;bootm 0x30008000'
原本的是:set bootcmd 'movi read kernel 30008000;bootm 30008000
- 在uboot中挂载root(IP根据实际使用更改):
setenv bootargs root=/dev/nfs nfsroot=192.168.1.141:/home/gec/Desktop/zhu_five/nfsroot ip=192.168.1.41:192.168.1.141:192.168.1.1:255.255.255.0::eth0:off init=/linuxrc console=ttySAC2,115200
原本的是 :setenv bootargs console=ttySAC2,115200 root=/dev/mmcblk0p2 rw init=/linuxrc rootfstype=ext3
* 参数详解
* 192.168.1.141 虚拟机ip
* /home/gec/Desktop/zhu_five/nfsroot nfs服务器目录
* 192.168.1.10 开发板ip
* 192.168.1.141 虚拟机ip
* 192.168.1.1 网关
* 255.255.255.0 子网掩码
修改Makefile中的KERN_DIR使其指向自己建立(开发板zImage)的内核源码树,然后虚拟机编译出来的驱动的对应内核。
将自己编译好的驱动.ko文件放入nfs共享目录下去
开发板启动后使用insmod、rmmod、lsmod等去进行模块实验
。。。。我最后没有成功挂载nfs,所以我就把Linux上编写的驱动.ko文件通过共享文件夹放到了主机上,然后使用tftp32这个软件传到开发板去insmod。
上一篇: Linux模块解析
下一篇: Java Cache详解及简单实现