1. 驱动章节实验环境搭建 |
您所在的位置:网站首页 › 虚拟机编译程序 › 1. 驱动章节实验环境搭建 |
1.4. 如何编译和加载内核驱动模块¶
1.4.1. 编译内核驱动模块¶
内核模块加载到内核,可以将内核模块编译成单独的模块,在内核启动后由用户手动动态加载, 也可以将模块直接编译进内核,在内核启动时就自动加载。测试一般是单独编译成内核模块,然后手动加载,方便调试,同时也节省时间。 野火提供了驱动教程的源码,可以执行以下命令获取: # 从github获取 git clone https://github.com/LubanCat/lubancat_rk_code_storage # 或者从gitee获取 git clone https://gitee.com/LubanCat/lubancat_rk_code_storage获取到源码后,源码目录下的linux_driver文件夹就是存放驱动教程的例程文件,将其配套驱动程序代码放置到 内核代码同级目录 ,原因是编译内核模块时, 驱动程序需要依赖编译好的Linux内核,驱动模块中的Makefile中指定了内核的路径,为方便使用例程,请放至同一目录结构下。 内核驱动模块对象所需的构建步骤和编译很复杂,它利用了linux内核构建系统的强大功能, 目前我们还不需要深入了解这部分知识,利用简单的Make工具就能编译出我们想要的内核驱动模块。 这里以编译hellomodule内核模块为例,使用命令进入hellomodule目录,然后使用make: cd linux_driver/module/hellomodule/ make重要 Makefile中指定的目录 “KERNEL_DIR=../../../kernel/”要和实际编译内核时指定的输出目录一致,如果编译内核时没有指定特定输出目录,那么就将这个变量指定到内核源码的根目录,可以用绝对路径或者相对路径。 这里的环境是在PC上,使用交叉编译工具编译内核模块,在板卡上编译内核模块类似,使用板卡系统的gcc工具,Makefile不指定CROSS_COMPILE 、ARCH也可以。 切换到module/hellomodule目录下,直接执行make命令,即可编译程序。 Makefile(module/hellomodule/Makefile)¶ 1 2 3 4 5 6 7 8 9 10 11 12 13 14KERNEL_DIR=../../../kernel/ ARCH=arm64 CROSS_COMPILE=aarch64-linux-gnu- export ARCH CROSS_COMPILE obj-m := hellomodule.o all: $(MAKE) -C $(KERNEL_DIR) M=$(CURDIR) modules .PHONE:clean clean: $(MAKE) -C $(KERNEL_DIR) M=$(CURDIR) clean第1行: 指定内核目录,根据自己编译内核时指定的输出目录,可以相对路径或者绝对路径,如果编译内核时没有指定特定输出目录,那么就将这个变量指定到内核源码的根目录。 第2行: arm64体系结构. 第3行: 指定交叉编译工具链,可以使用Lubancat-SDK的交叉编译工具gcc-linaro-6.3.1-2017.05-x86_64_aarch64-linux-gnu。 第4行: 导出环境变量。 第6行: 表示以模块进行编译。 第8行: all只是个标号,可以自行定义,是make的默认执行目标。 第9行: $(MAKE)的MAKE是Makefile中的宏变量,要引用宏变量要使用符号。这里实际上就是指向make程序,所以这里也可以把$(MAKE)换成make。 make -C是make命令的一个选项,-C作用是changedirectory, -C dir 就是转到dir目录。M=$(CURDIR):返回当前目录。这句话的意思是:当make执行默认的目标all时,-C(KVDIR)指明跳转到内核源码目录下去执行那里的Makefile,-C $(KERNEL_DIR)指明跳转到内核源码目录下去执行那里的Makefile,M=(CURDIR)表示又返回到当前目录来执行当前的Makefile。 第11行: clean 就是删除后面这些由make生成的文件。 在module/hellomodule/下,新增hellomodule.ko文件,这就是编译生成的内核驱动模块。 1.4.2. 加载内核驱动模块¶编译好内核驱动模块,可以通过多种方式将hellomodule.ko拷贝到开发板,我们可以使用 NFS网络文件系统 、 scp命令 、 sftp命令 等。 其中NFS环境请搭建请参考Linux系列章节之 挂载NFS网络文件系统 章节。 scp 命令用于 Linux 之间复制文件和目录,该命令基于ssh,需要搭建好ssh环境,scp命令格式如下: scp local_file remote_username@remote_ip:remote_folder例如: scp hellomodule.ko [email protected]:/home/cat/将hellomodule.ko发送到192.168.103.129的/home/cat/目录下,192.168.103.129是开发板ip,需根据实际而定,开发板用户名为cat, 输入yes,然后输入密码进行验证,等待传输完成,这个时候我们开发板就有了hellomodule.ko 这个文件。如果是在开发板进行本地编译则不需要再进行传输。 安装卸载内核驱动模块使用insmod和rmmod命令: #进入家目录 cd /home/cat/ # 加载内核模块 sudo insmod hellomodule.ko #查看当前加载的内核模块 lsmod # 卸载内核模块 sudo rmmod hellomodule.ko查看加载的内核模块,可以使用命令lsmod,其他信息也可以到/sys/module目录下查看,例如:加载成功hellomodule.ko模块后, 可以到/sys/module/hellomodule下查看。 |
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |