Linux驱动的两种加载方式过程分析
一、概念简述
在Linux下可以通过两种方式加载驱动程序:静态加载和动态加载。
静态加载就是把驱动程序直接编译进内核,系统启动后可以直接调用。静态加载的缺点是调试起来比较麻烦,每次修改一个地方都要重新编译和下载内核,效率较低。若采用静态加载的驱动较多,会导致内核容量很大,浪费存储空间。
动态加载利用了Linux的module特性,可以在系统启动后用insmod命令添加模块(.ko),在不需要的时候用rmmod命令卸载模块,采用这种动态加载的方式便于驱动程序的调试,同时可以针对产品的功能需求,进行内核的裁剪,将不需要的驱动去除,大大减小了内核的存储容量。
在台式机上,一般采用动态加载的方式;在嵌入式产品里,可以先采用动态加载的方式进行调试,调试成功后再编译进内核。
Linux下PCI设备驱动程序之注册详解 http://www.linuxidc.com/Linux/2014-02/97074.htm
裸机驱动与Linux设备驱动的区别 http://www.linuxidc.com/Linux/2013-08/88799.htm
Linux设备驱动开发详解(第2版)源代码 下载 http://www.linuxidc.com/Linux/2013-07/86977.htm
Linux设备驱动开发详解(第2版)高清PDF http://www.linuxidc.com/Linux/2013-07/86976.htm
二、实例分析
下面以Linux下音频驱动的加载为例,分析两种方式的加载过程。
1、静态加载
1)解压内核,修改硬件架构和编译器;
将内核压缩文件linux-2.6.8.1-zzm.tar.bz2解压到/home/sxy/目录下,命令是
,解压后得到内核源码目录文件linux-2.6.8.1-zzm,进入该目录,编辑Makefile文件,将ARCH改为arm,CROSS_CPMPILE改为arm-linux-,如下图所示:

保存后退出。
2)配置内核;
在内核源码树目录下,输入make menuconfig命令,进入内核配置界面,进入“Load an Alternate Configuration File”选项,载入配置文件kernel_2410.cfg,保存退出,过程如下图所示:



再次输入make menuconfig命令,编辑sound选项,将其编译进内核(*),结果如下图所示,最后保存配置,退出。

3)编译内核;
在源码树目录下输入make zImage命令,编译完成后可以在/arch/arm/boot/目录下生成zImage镜像文件。
4)下载内核
将内核镜像文件zImage下载到开发板上,当串口终端显示如下信息时,表示驱动加载成功。

2、动态加载
1)解压内核,过程与静态编译时一样,略;
2) 配置内核,前面过程与静态编译时一样,再次输入命令make menuconfig,配置sound选项时,将其编译成模块(M),结果如下图所示,最后保存配置,退出;

这样就将声卡驱动编译成模块,可以动态选择是否加载到内核中。
3)下载内核
将内核镜像文件zImage下载到开发板上,验证能否驱动声卡的过程如下:

说明:首先,将虚拟机下的/home/目录挂载到开发板上的/tmp/目录下,然后先后加载soundcore.ko和s3c2410-oss.ko两个模块,最后通过lsmod命令查看是否加载上声卡驱动,结果显示加载成功,这样就可以在应用空间编程,实现音频的录放等操作。
PS:①采用make menuconfig命令时,选项*代表Y,表示将驱动编译进内核;M表示将驱动编译成模块;空代表N,表示不编译;
②内核文件与模块两者有很多东西必须匹配,编译器版本、源码版本、编译时的配置等,所以当内核文件修改了,譬如修改了驱动的编译选项(Y、M、N),那么就必须重新编译和下载内核,否则会出错。
三、遇到的问题
问题:动态加载过程中,出现下面错误:

错误:注册和注销设备的符号未知。
解决方法:寻找依赖关系,查看几个符号的定义,发现在soundcore.c文件中定义了以上几个函数,同时导出了符号,以register_sound_dsp为例,如下图所示:

所以应该先加载soundcore.ko,后加载s3c2410-oss.ko。
注意:在Kconfig和Makefile文件中定义了依赖关系,也可以查找到问题的原因。
本文永久更新链接地址:http://www.linuxidc.com/Linux/2014-06/103569.htm
Linux驱动的两种加载方式过程分析的更多相关文章
- Linux共享库两种加载方式简述
Linux共享库两种加载方式简述 动态库技术通常能减少程序的大小,节省空间,提高效率,具有很高的灵活性,对于升级软件版本也更加容易.与静态库不同,动态库里面的函数不是执行程序本身 的一部分,而是 ...
- Xamarin Android Fragment的两种加载方式
android Fragment的重点: 3.0版本后引入,即minSdk要大于11 Fragment需要嵌套在Activity中使用,当然也可以嵌套到另外一个Fragment中,但这个被嵌套的Fra ...
- ios 图片的两种加载方式
控件加载图片,plist,懒加载,序列帧动画,添加动画效果. IOS中有2种加载图片的方式. 方式一:有缓存(图片所占用的内存会一直停留在程序中) + (UIImage *)imageNamed:(N ...
- 渐进式jpeg(progressive jpeg)图片及其相关 --图片的两种加载方式
渐进式jpeg(progressive jpeg)图片及其相关 一.基本JPEG(baseline jpeg)和渐进JPEG 网络上那些色色的照片都是.jpg格式的("色色"指 ...
- dll的两种加载方式(pend)+ delayload
看过关于动态库的调用例子,于是决定动手做一做:dll的对外接口声明头文件,Mydll.h: //Mydll.h #include <stdio.h> #include <stdlib ...
- Qml文件的两种加载方式
一种是QQmlApplicationEngine搭配Window,例如: #include <QGuiApplication> #include <QQmlApplicationEn ...
- Android Activity四种加载方式
Android之四种加载方式 (http://marshal.easymorse.com/archives/2950 图片) 在多Activity开发中,有可能是自己应用之间的Activity跳转,或 ...
- Android学习笔记_50_(转 四种加载方式详解(standard singleTop singleTask singleInstance)
Android之四种加载方式 (http://marshal.easymorse.com/archives/2950 图片) 在多Activity开发中,有可能是自己应用之间的Activity跳转,或 ...
- Android 四种加载方式详解(standard singleTop singleTask singleInstance) .
Android之四种加载方式 (http://marshal.easymorse.com/archives/2950 图片) 在多Activity开发中,有可能是自己应用之间的Activity跳转,或 ...
随机推荐
- fiddler接口测试
浏览器中,可直接进行get接口测试:调用post方法的接口测试可用fiddler测试(当然,fiddler也支持get),如下图 [Execute]后双击左侧请求记录记录即可查看响应结果
- oracle插入数据报错ORA-26026
今天进行数据清理时发现报错ORA-26026,主要是把从交易库提取数据并插入到归档库中. 检查一下发现是归档库的索引问题. 当时为了提高插入速度,所以删除了归档库的索引,可能对主键索引产生了影响. 解 ...
- Eclipse 经验之谈(一):快速打war包
如何快速打一个war包: 具体步骤: 单击右键[在项目名称上]——>Export -->War File . 完成war包的导出了.嘻嘻
- /etc目录深入理解
/etc This is the nerve center of your system, it contains all system related configuration files in ...
- jQuery AJAX load() 方法
jQuery load() 方法 jQuery load() 方法是简单但强大的 AJAX 方法. load() 方法从服务器加载数据,并把返回的数据放入被选元素中. 语法: $(selector). ...
- [学习笔记]设计模式之Command
为方便读者,本文已添加至索引: 设计模式 学习笔记索引 写在前面 在上篇Chain of Responsibility(职责链)模式笔记中,我们学习了一种行为型设计模式.今天,我们继续这一主题,来学习 ...
- kaptcha小案例(转)
使用kaptcha生成验证码 kaptcha是一个简单好用的验证码生成工具,通过配置,可以自己定义验证码大小.颜色.显示的字符等等.下面就来讲一下如何使用kaptcha生成验证码以及在服务器端取出验证 ...
- linux vim 基本操作
(一定要在英文输入法的状态下才有效)vi:实际上linux 上的 vi 不是真正的 vi,而是 vim;纯的 vi只在某些 unix 系统上还存在纯 的vi里面不支持退格键盘了,当按退格键盘以后,不是 ...
- winform程序开机自动启动代码
几天前头儿要我实现程序能开机自动启动,搞好了,整理起来写下来. private void checkBox1_CheckedChanged(object sender, EventArgs e) { ...
- 帝国cms7.0设置标题图片(缺失状态下)
有时候因为我们没有设置标题图片,程序就会是使用自己的标题图片,这就是问题所在,现在有2个办法解决这个问题, [1]直接替换调程序的标签图片,但是这样的方法虽然简单,但是图片大小固定,要是每个模版的图片 ...