Linux驱动的两种载入方式过程分析
一、概念简述
在Linux下能够通过两种方式载入驱动程序:静态载入和动态载入。
静态载入就是把驱动程序直接编译进内核。系统启动后能够直接调用。静态载入的缺点是调试起来比較麻烦,每次改动一个地方都要又一次编译和下载内核,效率较低。
若採用静态载入的驱动较多,会导致内核容量非常大,浪费存储空间。
动态载入利用了Linux的module特性,能够在系统启动后用insmod命令加入模块(.ko),在不须要的时候用rmmod命令卸载模块,採用这样的动态载入的方式便于驱动程序的调试,同一时候能够针对产品的功能需求。进行内核的裁剪,将不须要的驱动去除。大大减小了内核的存储容量。
在台式机上,一般採用动态载入的方式;在嵌入式产品里。能够先採用动态载入的方式进行调试,调试成功后再编译进内核。
二、实例分析
以下以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文件里定义了依赖关系,也能够查找到问题的解决办法。
2014年6月21日星期六11时25分
Linux驱动的两种载入方式过程分析的更多相关文章
- Linux驱动的两种加载方式过程分析
一.概念简述 在Linux下可以通过两种方式加载驱动程序:静态加载和动态加载. 静态加载就是把驱动程序直接编译进内核,系统启动后可以直接调用.静态加载的缺点是调试起来比较麻烦,每次修改一个地方都要重新 ...
- TQ2440学习笔记——Linux上I2C驱动的两种实现方法(1)
作者:彭东林 邮箱:pengdonglin137@163.com 内核版本:Linux-3.14 u-boot版本:U-Boot 2015.04 硬件:TQ2440 (NorFlash:2M Na ...
- Linux中的两种守护进程stand alone和xinetd
Linux中的两种守护进程stand alone和xinetd --http://www.cnblogs.com/itech/archive/2010/12/27/1914846.html#top 一 ...
- Linux共享库两种加载方式简述
Linux共享库两种加载方式简述 动态库技术通常能减少程序的大小,节省空间,提高效率,具有很高的灵活性,对于升级软件版本也更加容易.与静态库不同,动态库里面的函数不是执行程序本身 的一部分,而是 ...
- Linux 服务管理两种方式service和systemctl
Linux 服务管理两种方式service和systemctl 1.service命令 service命令其实是去/etc/init.d目录下,去执行相关程序 # service命令启动redis脚本 ...
- python执行linux命令的两种方法
python执行linux命令有两种方法: 在此以Linux常用的ls命令为例: 方法一:使用os模块 1 2 3 shell# python >> import os >> ...
- Mac Item2 SSH免密登录Linux 服务器的两种方式
转自http://blog.csdn.net/jobschen/article/details/52823980 mac ssh登录linux服务器 的两种方式: 个人推荐第二种,zsh方式,只需要把 ...
- Linux以下的两种文件锁
文件锁是一种文件读写机制.在不论什么特定的时间仅仅同意一个进程訪问一个文件. 利用这样的机制可以使读写单个文件的过程变得更安全. 在这篇文章中.我们将探讨Linux中不同类型的文件锁,并通过演示样例程 ...
- Linux 下的两种分层存储方案
背景介绍 随着固态存储技术 (SSD),SAS 技术的不断进步和普及,存储介质的种类更加多样,采用不同存储介质和接口的存储设备的性能出现了很大差异.SSD 相较于传统的机械硬盘,由于没有磁盘的机械转动 ...
随机推荐
- IdentityServer4-客户端定义-翻译
客户端定义(Defining Client) 客户端可以从你的IDS服务器请求tokens. 通常,客户端需要遵循下面的通用设置: 一个唯一的Client ID 如果需要还可以提供密码 允许与toke ...
- 如何把string转换char*类型
需要调用string头文件 ( #include<string> ) 用string里的函数c_str()可以把string转换为char* 例如 char * c_str2=str1. ...
- int**a = new int[5][6] 怎么delete
int **a = new int[5][6],这个根本编译不过去吧. 如果你想new一个二维数组出来,应该这样: int** a= new int*[5]; for (int i = 0; i &l ...
- 【作业三】结队任务二-----CourseManagement
031302517 031302319 ps:共同完成一篇随笔,文章中的第一人称我(517),队友(319) 一.功能分析+实现思路+结队讨论 这里我将功能分析和实现思路还有结对过程中的一些讨论结合在 ...
- python之socketserver ftp功能简单讲解
TCP协议中的socket一次只能和一个客户端通信,然而socketserver可以实现和多个客户端通信. 它是在socket的基础上进行了一层封装,底层还是调用的socket # 服务端 impor ...
- 长文本溢出显示省略号(…) text-overflow: ellipsis
text-overflow 属性规定当文本溢出包含元素时发生的事情. 默认值: clip 继承性: no 版本: CSS3 JavaScript 语法: object .style.textOverf ...
- PostgreSQL 10 如何使用 PgAdmin3
自从 PgAdmin4 出来以后,PgAdmin3 就停止开发了,PgAdmin 官网下载的 PgAdmin3 无法支持 PostgreSQL 10 或者更高版本的数据库服务器端. 但是 PgAdmi ...
- 安卓开发_浅谈Fragment之事务添加Fragment对象
我们都知道给一个activity动态添加fragment的时候 有下面几种添加方式 看一下布局文件 <LinearLayout xmlns:android="http://schema ...
- .Net Core(一)环境搭建与基本使用
.Net Core(一)环境搭建与基本使用 一.系统配置 a) Linux下如果想要打开类似任务管理器,可以使用top命令,在控制台会动态刷新CPU和内存占用.进程等信息.vmstat和free命令可 ...
- Kotlin入门(12)类的概貌与构造
上一篇文章提到泛型函数appendString是在类外面定义,这不免使人疑惑,类里面又该怎样定义成员函数呢?为解答这个疑问,接下来的几篇文章将好好描述一下Kotlin如何操作类及其对象,本篇文章先对类 ...