驱动模块的编译与安装

模块可以被选择“模块化编译”或“静态编译”
1. 分离式模块化编译:需要在内核运行时动态加载(也能实现开机加载 );非常适合驱动的开发与调试
2. 静态编译:链接入内核镜像,默认被加载;适合开发完成后在产品中使用
3. 统一式模块化编译:和内核一起编译,并统一输出到文件系统,在内核启动时统一开机加载 ;有利于实现开机加速

1.分离式模块化编译与安装

  • 所谓分离式模块化编译,就是不和内核一起编译的意思,非常适合驱动的开发与调试
  • 首先必须要获得开发板上内核的“该次编译源码目录”,因为模块化编译依赖于开发板上内核的“那一次编译”,如果内核与模块化编译不是“同一次编译”的,那么模块安装时将发生错误
  • 进入“该次编译源码目录”,可以在drivers目录下创建一个文件夹,以后可以在此文件夹下工作;文件夹内需要有模块源码(假设名字为module_test.c)与Makefile
  • 这是一个典型的驱动模块Makefile,它是非常模式化的,要改动的地方很少
#指定“该次编译源码目录”
KERN_DIR = xxxx/kernel#obj-m表示将module_test.o编译成单独的模块
obj-m   += module_test.o#下面这句真正开始编译
all:make -C $(KERN_DIR) M=`pwd` modules #提供复制功能,将.ko文件复制到nfs根文件系统中
cp:cp -f *.ko /xxxx.PHONY: clean
clean:make -C $(KERN_DIR) M=`pwd` modules clean
  • 这个Makefile只是一个索引,真正的编译是在内核源码树中完成的;make -C $(KERN_DIR) M=‘pwd’ modules 这句代码的本质其实是 make modules,中间的都是参数,-C代表进入到指定的源码目录下进行编译,M=’pwd’代表将编译完的.ko文件放回到当前目录下,得到的这个.ko文件即是模块
  • 如果我们的驱动文件包含多个.c文件呢?只需要将Makefile中的obj-m += module_test.o 改为如下即可,得到的还是一个module_test.ko
obj-m := module_test.o
modulename-objs := file1.o file2.o
  • 得到了module_test.ko之后,先通过modinfo module_test.ko 来查看模块的信息,尤其要检查vermagic这个参数,确保和kernel版本要一致vermagic: 2.6.35.7 preempt mod_unload ARMv7,然后将module_test.ko放到开发板的rootfs中
  • 开启开发板,然后在控制台中使用以下命令即可操作驱动模块
    • insmod:安装模块,如insmod module_test.ko
    • lsmod:显示当前系统已经安装的模块
    • rmmod:卸载模块,如rmmod module_test
    • demsg:显示内核所有的打印信息,当看不到模块打印信息时可以使用
  • 设置开机自动加载模块,根据手动构建rootfs及文件功能分析可知,在rootfs的rcS最后添加insmod /home/module_test.ko 即可实现开机自动加载模块

2.静态编译

内核代码静态编译的原理详见:kernel配置阶段宏观分析。所以得出结论,我们要在内核中添加新东西必须在对应的子Kconfig中添加新选项、子Makefile中添加新目标,然后使用make menuconfig设置子Kconfig中添加新选项为Y(将该选项的变量导入.config),最后编译的时候子Makefile便会根据.config中的变量值来选择如何编译。我们这里以leds-s5pv210.c这个驱动为例

  • 首先要将驱动的源码放到合适的目录中去(drivers/leds目录下),何谓“合适的目录”?比如我们写了一个基于普通字符设备驱动的led驱动,那么就应把它放在drivers/char目录下;如果我们写了一个基于框架的led驱动,那么就应把它放在drivers/leds目录下。如此安放,就符合了内核的目录结构
  • 打开该目录下的字Kconfig,根据 kernel中的Kconfig详尽分析,同时仿照同类驱动的写法,把我们的驱动文件添加进去。其中,depends on可以去掉,不用依赖其他东西
#之前还有很多,这里省略掉了
...
config LEDS_88PM860Xtristate "LED Support for Marvell 88PM860x PMIC"depends on MFD_88PM860XhelpThis option enables support for on-chip LED drivers found on MarvellSemiconductor 88PM8606 PMIC.#我们依样画葫芦,添加一个
config LEDS_S5PV210tristate "LED Support for S5PV210(X210)"helpThis option enables support for on-chip LED drivers found on SM.
  • 打开该目录下的子Makefile,发现里面有很多的目标,我们仿照同类驱动写法,把我们的驱动文件也添加进去。值得注意的是,括号里的名称要和Kconfig中对应
#之前还有很多,这里省略掉了
...
obj-$(CONFIG_LEDS_INTEL_SS4200)        += leds-ss4200.o
obj-$(CONFIG_LEDS_LT3593)      += leds-lt3593.o
obj-$(CONFIG_LEDS_ADP5520)     += leds-adp5520.o
obj-$(CONFIG_LEDS_DELL_NETBOOKS)   += dell-led.o
obj-$(CONFIG_LEDS_MC13783)     += leds-mc13783.o#我们依样画葫芦,添加一个
obj-$(CONFIG_LEDS_S5PV210)     += leds-s5pv210.o
  • 如果我们的驱动文件包含多个.c文件呢?只需要将Makefile中的obj-$(CONFIG_LEDS_S5PV210) += 后面把需要的.o文件续上去即可
  • 进入配置阶段。先make distclean一下,接着make xxx_defconfig生成.config,然后使用make menuconfig 来设置子Kconfig中刚刚添加的新选项为Y
  • 最后编译即可得到含有驱动的zImage
  • 特别要注意的一点,有时候驱动和驱动是互相冲突的,如果发现驱动不工作或没反应,可能是开发板上本来就有相同功能的驱动。比如在这里发现led驱动完全没效果,打开menuconfig 一看,发现里面还使能了一个默认的开发板商写的led驱动,把它关掉再重新编译就好了

3.统一式模块化编译

统一式模块化编译的操作和静态编译极为类似,操作几乎相同,只是在make menuconfig 时来设置添加新选项为M即可

  • 当内核编译完时,我们可以使用make modules_install将所有的ko文件导出到_install文件夹内,然后我们可以将_install/lib/modules/xxxxx复制到文件系统的/lib/modules/xxxxx内,这样系统开机的时候便能统一加载所有的模块了
  • 那模块是如何被开机加载的呢?主要是通过开机启动的脚本/etc/init.d/modutils.sh来实现的,主要工作是去/lib/modules/xxxxx内加载所有的模块
  • 不难看出,统一式模块化编译可以提高系统的启动时间,将一部分不重要的工作挪到了开机后进行

4.设备及设备文件的查看

cat /proc/devices

可以查看已经安装的设备和设备号

ls /dev

可以查看已经生成的设备文件

驱动模块的编译与安装相关推荐

  1. linux内核单独安装,Linux内核编译与安装

    平台:虚拟机Ubuntu10.04 内核版本:3.0.80 ---------------------------------------------------------------------- ...

  2. Ubuntu下的Linux内核的编译及安装

    推荐群:C/C++大学技术协会:145655849 Linux中的模块(Modules) Linux的module其实可以看作是内核的插件. 在Linux系统中,可以通过文件 cat /proc/mo ...

  3. linux网卡驱动程序的编译与安装,linux网卡驱动程序的编译与安装

    安装实例 linux网卡驱动程序的编译与安装 powered by KindGeorge 一般来说,目前新版的 Linux 预设可以支持的网络卡芯片组数量已经很完备了,很多网络卡芯片都已经被支持, 例 ...

  4. 【Live555】liveMedia下载、配置、编译、安装、基本概念

    [Live555]live555源码详解系列笔记 一.下载.编译.安装 1.下载 官网地址:http://www.live555.com/ 下载地址:http://www.live555.com/li ...

  5. Linux下boost库的编译、安装详解

    1.下载源文件 去官网下载:http://www.boost.org/ 这里下载最新版本 wget https://dl.bintray.com/boostorg/release/1.64.0/sou ...

  6. golang go get命令 一键获取代码、编译并安装

    go get 命令可以借助代码管理工具通过远程拉取或更新代码包及其依赖包,并自动完成编译和安装.整个过程就像安装一个 App 一样简单. 这个命令可以动态获取远程代码包,目前支持的有 BitBucke ...

  7. CentOS6.9下手动编译并安装Python3.7.0

    CentOS6.9默认安装的python版本为2.6.6,若想安装python3以上版本,只能手工编译安装 下面介绍Python-3.7.0版本的手动编译并安装的步骤 1.下载Python-3.7.0 ...

  8. Apache 2,4版本 编译与安装 RedHat enterprises 6.2

    只针对Apache 2,4版本 ,之前版本不存在这个问题 到http://httpd.apache.org/下载以源码方式安装,我下载的版本是Apache httpd 2.4.3 解压:[root@l ...

  9. linux怎么编译并安装busybox,linux下安装busybox

    1.获取busybox源码并解压,这里使用天嵌提供的"busybox-1.16.0.tar.bz2" #tar xvf busybox-1.16..tar.bz2 -C / 解压的 ...

最新文章

  1. Clipping input data to the valid range for imshow with RGB data ([0..1] for floats or [0..255] for i
  2. JMeter性能测试的基础知识和个人理解
  3. 数据结构与算法(C++版)
  4. Hibernate-级联操作
  5. HDU - 3065 病毒侵袭持续中(AC自动机)
  6. C和指针之数组之编程练习2
  7. 程序员都很老实?你错了,其实程序员真实的样子是这样的
  8. 移动端html头部meta标签的含义
  9. css中的clip:rect() 只能在绝对定位的元素上使用
  10. 库卡六轴机器人编程手册_工业机器人(ABB、库卡、安川)编程专业教材!
  11. 什么是JBPM工作流
  12. 外卖返利淘宝客小程序公众号淘宝客APP花卷云美团饿了么返利系统
  13. html动画3d背景图片,jQuery和CSS3全屏3D背景图片视觉差特效
  14. PPT不能编辑,如何取消PPT的只读模式?
  15. 罗技 android蓝牙键盘,用上罗技K380 Multi-Device蓝牙键盘 我1分钟内就学会了分身术...
  16. 关闭jupyter notebook报错
  17. [计算机组成原理,Cache总容量的计算方法]假设主存地址位数是32位,按字节编址,贮存和Cache采用全相联映射的方式,主存块大小为1个字,每字32位,采用回写法和随机替换的策略,则能存放32K字数
  18. php图片生成邀请函,活动邀请有新意,快速制作一份精美的邀请函h5
  19. Python简单详细使用教程
  20. MTP模式下恢复手机误删数据方法(MX2、MX3亲测可用)

热门文章

  1. jQuery基本操作--制作QQ简易聊天框
  2. 计算机毕业设计Java体检预约管理系统(源码+系统+mysql数据库+Lw文档)
  3. 对于应届生应聘软件测试岗,面试官会问什么?
  4. 真正统治世界的十大算法(转)
  5. 【JAVA】使用流进行树形数据构造
  6. 【小算法】二分图匹配之匈牙利算法详解(图例说明,代码亲测可用)
  7. 为什么程序员跳槽加薪会比内部调薪要高?
  8. 网络虚拟化技术(三) Cisco VDC
  9. 搜狗收录域名之搜狗自带蜘蛛
  10. 关于帆软软件的js和网页超链接实例