内核模块在虚拟机和开发板上运行的区别

来源:互联网 发布:塑料卫生间门 淘宝 编辑:程序博客网 时间:2024/06/03 21:32

最近在看宋宝华老师的<linux驱动开发详解> ,按照书写第一个字符设备驱动globalmem ~!

驱动源码参考书中,编译内核模块的关键问题就是Makefile 。运行在虚拟机的linux的Makefile 和 在开发板上的Makefile是不一样的。

通过查资料了解到其中的区别,在此写下笔记,方便自己复习,也方便他人。

Makefile如下:

ifneq ($(KERNELRELEASE),)


obj-m := globalmem.o


else
#KDIR :=/lib/modules/3.2.0-48-generic-pae/build   // 这个是在虚拟机ubuntu上运行模块的KDIR,如果编译在虚拟机上的module ,把注释打开,下面的KDIR注释掉即可。
KDIR :=/home/mykernel/linux-3.0.1                      // 开发板的KDIR  (kernel directory),/home/mykernel/linux-3.0.1是开发板的内核源码在虚拟机ubuntu上的路径。


all:
        make -C $(KDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-linux-   //指定ARCH 和 CROSS_COMPILE 。如果Makefile里不指定在make时就必须指定
clean:
        rm -f *.ko *.o *.mod.o *.mod.c *.symvers
endif


编辑好Makefile之后make生成 globalmem.ko 并拷贝到开发板上。

在开发板上运行命令 mknod  /dev/globalmem  c  254  0  创建设备节点(也叫设备文件)

echo “hello world”  > /dev/globalmem

cat  /dev/globalmem

打印 hello world


书中是静态申请的设备号254,但是我的ubuntu254的主设备好已经被用了,所以换个主设备好就ok了。我是直接用alloc_chrdev_region()动态申请。

如何 查看系统中都是用了哪些主设备号?

cat  /proc/devices 命令