1,介绍

源于对debian的爱,虚拟机我使用最新的debian9.8,而且内核也不是原装的4.9,而是比较新的4.19,详细安装方式请参阅我的博文(debian9.6更换内核(最简单的命令方式)),主机系统我用的是win10企业版的64位系统,虚拟机平台是最新的vmware player15。

交叉编译器是我用命令安装的,详细内容请参阅我的博文(debian9.6命令安装交叉编译器)。

由于换了内核的原因,我还换了4.19的linux-header,详细内容请参阅我的博文(嵌入式:内核驱动模块hello程序)。

系统版本信息:

gyz@debian:~$ uname -a
Linux debian 4.19.0-0.bpo.2-amd64 #1 SMP Debian 4.19.16-1~bpo9+1 (2019-02-07) x86_64 GNU/Linux
gyz@debian:~$ lsb_release -a
No LSB modules are available.
Distributor ID:	Debian
Description:	Debian GNU/Linux 9.8 (stretch)
Release:	9.8
Codename:	stretch

 交叉编译器信息内容:

gyz@debian:~$ dpkg -l gcc-arm-linux-gnueabi
ii  gcc-arm-linux-gnue 4:6.3.0-4      amd64          GNU C compiler for the armel architecture

2,准备工作

就是将光盘上提供的内核源码共享到debian系统上,共享文件的方法请参阅我的博文(嵌入式:windows10主机,vmware player15,debian9.8虚拟机,建立共享文件夹)。

共享的内容是: H:\iTOP-4412精英版光盘资料\06_源码_uboot和kernel\iTop4412_Kernel_3.0_20180508.tar

拷贝到debian系统上,然后解压就行(解压命令tar -zxvf iTop4412_Kernel_3.0_20180508.tar.gz),之后如下(uboot的内容不用管):

gyz@debian:~/tf$ ls
iTop4412_Kernel_3.0                  iTop4412_uboot
iTop4412_Kernel_3.0_20180508.tar.gz  iTop4412_uboot_20180320.tar.gz

 3,hello源码如下:

#include <linux/module.h>
#include <linux/init.h>

MODULE_LICENSE("Dual BSD/GPL");

static int initialization_function(void)
{
	printk(KERN_ALERT "hello world!\n");
	return 0;
}

static void cleanup_function(void)
{
	printk(KERN_ALERT "bye world!\n");
}

module_init(initialization_function);
module_exit(cleanup_function);

makefile(在目录下放的时候,一定要m大写)内容如下:

CC = arm-linux-gnueabi-gcc
obj-m += hello.o
KERNEL_DIR += /home/gyz/tf/iTop4412_Kernel_3.0/
PWD += $(shell pwd)
all:
	make -C $(KERNEL_DIR) M=$(PWD) modules
clean:
	rm *.o *.ko *.mod.c

.PHONY:clean

 4,编译前,需做的操作

a,修改源码的makefile内容,修改后如下:

gyz@debian:~/tf/iTop4412_Kernel_3.0$ vim Makefile
....
....
export KBUILD_BUILDHOST := $(SUBARCH)
ARCH		?= arm
CROSS_COMPILE   ?= arm-linux-gnueabi-
....
....

 b,编译时,可能会让做如下操作:

gyz@debian:~/tf/iTop4412_Kernel_3.0$ make oldconfig && make prepare

 原因是,之前的.config不能用。

c,关于编译过程中“/bin/sh: scripts/mod/modpost: No such file or directory”的问题解决:

gyz@debian:~/tf/iTop4412_Kernel_3.0$ make scripts

d,关于编译过程中“fatal error: linux/compiler-gcc6.h: 没有那个文件或目录”的问题解决:

gyz@debian:~/tf/iTop4412_Kernel_3.0$ cp include/linux/compiler-gcc4.h include/linux/compiler-gcc6.h 

 就是拷贝一个gcc4.h当gcc6.h。

5,编译

gyz@debian:~/der$ make
这里不再演示
gyz@debian:~/der$ ls
built-in.o  hello.ko     hello.mod.o  m2        modules.order
hello.c     hello.mod.c  hello.o      Makefile  Module.symvers

 6,将hello.ko文件拷贝到tf卡上,我放到tf卡的第2分区了

命令这里就不写了,cp -r拷贝就是了。

7,挂载tf卡到烧写好qte系统的开发板

为什么要挂载呢?原因是qte系统没有主动挂载tf的机制,不像wins系统,自己就识别了。挂载命令:

[root@iTOP-4412]# mount /dev/mmcblk1p2 /mnt/                                    
[   38.778131] EXT2-fs (mmcblk1p2): warning: mounting ext3 filesystem as ext2
[   38.784084] EXT2-fs (mmcblk1p2): warning: checktime reached, running e2fsck is recommended

注意,这里的tf卡就采用迅为提供的ext3fortmat那几个命令格式化就是了,不要弄成ext4,否则挂载不了。

解释:mmcblk1是tf卡名,mmcblk1p2就是它的第2分区,刚刚说了,我将hello.ko放到它的第2分区了。p1234就是它的四个分区。这些内容,可以在板子已经上电的情况下插入,会在超级终端上显示的。

8,拷贝到/下,安装模块

[root@iTOP-4412]# exit
~ # su -
[root@iTOP-4412]# ls                                                            
a.txt     dev       home      mnt       root      system    topeet    version
b.txt     etc       lib       opt       sbin      tf        usr
bin       hello.ko  linuxrc   proc      sys       tmp       var
[root@iTOP-4412]# pwd
/
[root@iTOP-4412]# insmod hello.ko                                               
[ 6316.764505] hello world!
[root@iTOP-4412]# lsmod hello.ko                                                
hello 707 0 - Live 0xbf010000
[root@iTOP-4412]# rm hello.ko                                                   
[root@iTOP-4412]# lsmod hello.ko                                                
hello 707 0 - Live 0xbf010000
[root@iTOP-4412]# rmmod hello                                                   
[ 6357.510961] bye world!

 可以看到,安装模块的时候,用的hello.ko,卸载的时候,却是hello,这是因为较新版本的busybox 1.13.1+ 要卸载模块必须要 “完全匹配模块名”才行,原来在老版本的使用模块文件名就能卸载,现在不可以了。

关于“rmmod: can't change directory to '3.0.15': No such file or directory”的问题解决方法:

[root@iTOP-4412]# rmmod hello.ko                                                
rmmod: can't change directory to '3.0.15': No such file or directory

解决方法:

[root@iTOP-4412]# uname -r                                                      
3.0.15
[root@iTOP-4412]# mkdir /lib/modules/3.0.15

 说明,这个问题,其实不是经典的,经典的是rmmod: can't change directory to '/lib/modules/': No such file or directory的问题,解决办法也是一样的,mkdir新建文件夹就是了。

 

参考1:https://www.eefocus.com/spencer/blog/13-12/300967_833aa.html

参考2:https://www.cnblogs.com/mouou/p/6738343.html

参考3:http://blog.chinaunix.net/uid-21222282-id-1829218.html

参考4:https://blog.csdn.net/zmlovelx/article/details/80263003

Logo

华为开发者空间,是为全球开发者打造的专属开发空间,汇聚了华为优质开发资源及工具,致力于让每一位开发者拥有一台云主机,基于华为根生态开发、创新。

更多推荐