linux驱动部分:交叉编译驱动模块&模块驱动的相关操作&Makefile讲解


根据下面的提醒,在自己电脑是的情况是:
b1、模块整个操作流程
(1)加载模块:insmod globalfifo_zs_fzs.ko

(2)查看模块是否被加载:lsmod

(3)查看设备号:cat /proc/devices

(4)创建设备节点:mknod /dev/globalfifo_zs_fzs c 250 0    //c 代表字符型设备

(5)启动后台进程(主要是&放在最后即可):cat /dev/globalfifo_zs_fzs&

(6)向设备输入内容(主要是>):echo 'I love Mywife'> /dev/globalfifo_zs_fzs 

(7)读取设备内容:cat /dev/globalfifo_zs_fzs

(8)如果无后台,则删除设备模块:rmmod globalfifo_zs_fzs.ko

(9)删除设备节点:输入:rm -rf /dev/globalfifo_zs_fzs     删除 /dev/目录下的 globalfifo_zs_fzs

(10)如果这里启动了后台程序,那么直接删除会提示有程序in used,因此必须先把该后台进程关闭,ps -lax查看进程,kill -9 pid关闭该进程,rmmod globalfifo_zs_fzs.ko再删除设备模块即可,虽然rmmod可以删除设备,但是设备节点/dev/globalfifo_zs_fzs仍然存在,需要进一步删除设备节点。

(11)编译出自己更新的驱动模块
root@ubuntu:/home/xuyuefei/Linux学习资料/Linux内核移植/opt/EmbedSky/linux-2.6.30
.4# make SUBDIR=drivers/char/ modules

(12)编译模块安装内核模块
make modules编译内核模块;make modules_install安装内核模块;!!!将编译好的内核模块copy到/lib/modules下,如:
cp /lib/modules/2.6.30.4-EmbedSky -rf ./lib/modules/
你会发现,在make modules和modules_install后,会在你电脑上的/lib/modules多出了ARM对应的linux的版本号即2.6.30


//==================
Makefile的说明

ifneq ($(KERNELRELEASE),)    

obj-m :=Helloworld.o   #这一行决定了内核模块的名字,Helloworld.o修改为所需的内核模块名字
#如果有多个文件这里再加一行,如下,有两个.c文件:main.o和add.o
#Helloworld-objs :=main.o add.o  
 
else

#KDIR :=/lib/modules/2.6.32-38-generic/build      for computer
KDIR:=/lib/modules/2.6.30.4-EmbedSky/build    
#for TQ2440

all:
        make -C $(KDIR) M=$(PWD) modules 
;-C是使用KDIR中的makefile来编译;M表示内核模块代码和Makefile在哪里,PWD表示当前目录;

clean:
        rm -f *.ko *.o *.mod.o *.mod.c *.symvers
endif


代码部分:

MODULE_LICENSE("GPL");    //宏MODULE_LICENSE来指定遵守的协议GPL:开源的
MODULE_AUTHOR("David Xie"); //模块作者
MODULE_DESCRIPTION("Hello World Module");//模块描述
MODULE_ALIAS("a simplest module");//模块别名




以下是参考的原文:http://bbs.21ic.com/blog-517057-73809.html

首先分析一下hello模块在电脑上的makefile
ifneq ($(KERNELRELEASE),)
obj-m:=hello.o
else
KERNELDIR:=/lib/modules/$(shell uname -r)/build
PWD:=$(shell pwd)
default:
        $(MAKE) -C $(KERNELDIR)  M=$(PWD) modules
clean:
        rm -rf *.o *.mod.c *.mod.o *.ko
endif
如上篇日志所说,make的时候是要进入两个文件夹的,此makefile其实等效于下边一条指令:
make -C /lib/modules/2.6.27.5-41.fc9.i686/build  M=/home/work/driver/other modules(只适用于我这里)
前边一个目录具体是怎么回事我不清楚,反正要用到其下的Makefile,然后回到hello.c所在目录。
显然,这个目录是电脑内核的,肯定与硬件有关,我们要编译开发板上的模块,就得弄一个开发板内核一致的相关文件,查看/lib/modules目录下边,并无开发板内核2.6.12相关字样,看来得自己想办法弄一个,百度许久,发现果有其事,
你的KDIR也要修改,你系统要生成你arm内核的库文件,在内核原代码中使用make modules_install就会在lib/modules下生你arm版的内核文件
在把KDIR指向那个文件就可以了 ”,于是回到编译内核镜像那个文件夹,sudo make modules_install,结果就在/lib/modules里发现了2.6.12-h1940目录,cd一看,果然有build文件夹。
好了,回到hello文件目录,修改Makefile文件,
KERNELDIR:=/lib/modules/$(shell uname -r)/build修改为KERNELDIR=/lib/modules/2.6.12-h1940
/build.再make。生成了hello.ko文件,挂载到开发板上,insmod,在lsmod,发现有了hello.

还有个问题,既然在开发板上执行,就应该使用arm-linux-gcc啊,为什么不用设置呢?其实你打开/lib/modules/2.6.12-h1940/build
里的Makefile一看就知道了,里边有这么两行:
ARCH        := arm
CROSS_COMPILE    := /usr/local/arm/3.4.1/bin/arm-linux-
已经设置了。

你可能感兴趣的:(LINUX,Ubuntu)