加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

驱动的动态加载与静态加载

(2015-09-10 15:41:08)
标签:

it

分类: linux

摘要:LINUX下加载驱动程序可以采用动态和静态两种方式。动态加载利用了LINUXmodule特性,可以在系统启动后通过rmmodmodprobe命令对驱动模块进行加载,在不需要的时候可通过rmmod命令来卸载;静态加载则是直接把驱动程序编译进内核,系统启动后可直接调用。

 

关键词:驱动  动态加载  静态加载

 

1 . 定义

1.1 驱动的动态加载指的是利用了LINUXmodule特性,可以在系统启动后通过rmmodmodprobe命令挂载.ko内核目标文件,对模块进行加载,成功后可通过mknod指令进行挂载节点,在不需要的时候可通过rmmod命令来卸载模块。

2.2 驱动的静态加载指的是直接把驱动程序编译进内核,在系统启动后可直接调用,不需要任何加载卸载命令

 

2 . 优缺点

       2.1 动态加载的模块本身没有被编译进内核映像,控制内核的大小;同时,模块一旦被加载,它就和内核中的其他部分完全一样,使用灵活。可在每次调用时都需要通过命令进行加载与卸载,操作麻烦。

       2.2 静态加载驱动模块直接编译进内核映像,伴随系统的启动自动加载,使用方便,不需要任何加载卸载命令。可把模块编译进内核使得生成的内核很大,如果我们要在现有的内核中新增加或删除功能,将不得不重新编译内核,效率较低。

 

3. 具体操作步骤(以memdev程序为例)

       说明:memdev.cmemdev.hMakefileapp-mem.c文件放在/home/lizzy115/source/memdev文件夹下;内核代码在/home/lizzy115/workdir/lsp/ti-davinci/linux-2.6.18_pro500文件夹下;系统通过tftp进行启动,系统的文件系统在/opt/mv_pro_5.0/montavista/pro/devkit/arm/v5t_le/target下面通过nfs进行挂载。

3.1 模块与内核的关系如图 1

 

 

                                                              

                                                                1

3.2 模块的静态加载

3.2.1 /home/lizzy115/source/memdev文件夹下进行make得到memdev.ko文件,通过arm_v5t_le-gcc  app-mem.c  -o  app-mem 得到能够在dm365 EVM 开发板中运行的app-mem可执行文件。

3.2.2 memdev文件夹下,通过insmod  ./memdev.ko命令加载内核目标文件,不用时通过rmmod  memdev命令可以卸载它。此外,也可以通过modprobe  ./memdev 命令加载,通过modprobe –r memdev 进行卸载。其中modprobe命令比insmod命令要强大,它在加载某模块时会同时加载该模块所依赖的其他模块。

3.2.3 可通过lsmod命令获得系统中加载了的所有模块以及模块间的依赖关系。通过cat  /proc/dervices 进行查看模块的加载情况及获取主设备号。

3.2.4 通过mknod  /dev/memdev c 主设备号 次设备号 进行节点的挂载,通过ls /dev/可查看节点挂载情况。

3.2.5 当挂载成功后,

cp  app-mem  /opt/mv_pro_5.0/montavista/pro/devkit/arm/v5t_le/target/opt ;

最后通过超级终端在板子的/opt/下运行测试程序 ./app-mem .

3.3 驱动的静态加载

3.3.1 拷贝memdev.cmemdev.h /home/lizzy115/workdir/lsp/ti-davinci/linux-2.6.18_pro500/drivers/char 目录下,把memdev.c定义成模块的内容去掉。

3.3.2 char目录的Kconfig文件中添加新源代码对应项目的编译配置选项。添加代码如下:

Config  MEMDEV            ------对应驱动

             bool support for memdev   ----选项

             default  y                   -----定义开始为yes

3.3.3 char目录的Makefile文件中添加编译脚本

 obj-$(CONFIG_MEMDEV) += memdev.o

3.3.4 编译进内核,通过make ARCH=arm CROSS_COMPILE=arm_v5t_le- uImage(此为dm365开发板编译环境进行编译,其他开发环境可调用不一样的库跟编译工具)。

3.3.5 拷贝uImage镜像文件到/var/lin/tftpboot/文件夹下进行tftp启动开发板,测试网络通了之后,在超级终端中输入命令tftp 80700000 uImagebootm进行启动。

3.3.6 通过 cat /proc/drivers 进行查看,最后可以在/etc/init.d/rcS文件中添加/bin/mknod  /dev/memdev c 主设备号 次设备号 进行节点的挂载,当系统一启动就加载好模块设备跟节点。

3.3.7 运行app-mem可执行文件进行测试。

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有