一、概念简述

在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驱动的两种载入方式过程分析的更多相关文章

  1. Linux驱动的两种加载方式过程分析

    一.概念简述 在Linux下可以通过两种方式加载驱动程序:静态加载和动态加载. 静态加载就是把驱动程序直接编译进内核,系统启动后可以直接调用.静态加载的缺点是调试起来比较麻烦,每次修改一个地方都要重新 ...

  2. TQ2440学习笔记——Linux上I2C驱动的两种实现方法(1)

    作者:彭东林 邮箱:pengdonglin137@163.com 内核版本:Linux-3.14 u-boot版本:U-Boot 2015.04 硬件:TQ2440 (NorFlash:2M   Na ...

  3. Linux中的两种守护进程stand alone和xinetd

    Linux中的两种守护进程stand alone和xinetd --http://www.cnblogs.com/itech/archive/2010/12/27/1914846.html#top 一 ...

  4. Linux共享库两种加载方式简述

      Linux共享库两种加载方式简述  动态库技术通常能减少程序的大小,节省空间,提高效率,具有很高的灵活性,对于升级软件版本也更加容易.与静态库不同,动态库里面的函数不是执行程序本身 的一部分,而是 ...

  5. Linux 服务管理两种方式service和systemctl

    Linux 服务管理两种方式service和systemctl 1.service命令 service命令其实是去/etc/init.d目录下,去执行相关程序 # service命令启动redis脚本 ...

  6. python执行linux命令的两种方法

    python执行linux命令有两种方法: 在此以Linux常用的ls命令为例: 方法一:使用os模块 1 2 3 shell# python >> import os >> ...

  7. Mac Item2 SSH免密登录Linux 服务器的两种方式

    转自http://blog.csdn.net/jobschen/article/details/52823980 mac ssh登录linux服务器 的两种方式: 个人推荐第二种,zsh方式,只需要把 ...

  8. Linux以下的两种文件锁

    文件锁是一种文件读写机制.在不论什么特定的时间仅仅同意一个进程訪问一个文件. 利用这样的机制可以使读写单个文件的过程变得更安全. 在这篇文章中.我们将探讨Linux中不同类型的文件锁,并通过演示样例程 ...

  9. Linux 下的两种分层存储方案

    背景介绍 随着固态存储技术 (SSD),SAS 技术的不断进步和普及,存储介质的种类更加多样,采用不同存储介质和接口的存储设备的性能出现了很大差异.SSD 相较于传统的机械硬盘,由于没有磁盘的机械转动 ...

随机推荐

  1. linux 双网卡桥接,实现网卡流量镜像与转发

    确认本地是否存在brctl,如果不存在请先安装: 1.确定你的镜像端口,比如eth1: 2.将实际数据通过的端口,比如eth0和镜像端口绑成一个bridge: brctl addbr br0 brct ...

  2. JavaWeb学习 (十三)————JSP

    一.什么是JSP? JSP全称是Java Server Pages,它和servle技术一样,都是SUN公司定义的一种用于开发动态web资源的技术. JSP这门技术的最大的特点在于,写jsp就像在写h ...

  3. MyBatis从入门到放弃二:传参

    前言 我们在mapper.xml写sql,如果都是一个参数,则直接配置parameterType,那实际业务开发过程中多个参数如何处理呢? 从MyBatis API中发现selectOne和selec ...

  4. WebApi接口传参

    目前接口统一使用 [FromBody]Dictionary<string,string> req 来接收. 有时候,需要把从req字典提取多个字段赋值给 model,几个还好,几十个赋值就 ...

  5. C-指针,二级指针,二维数组作为函数参数使用,C语言链表(详解)

    一级指针 int *p;            //表示定义一个int型(4字节)的指针p &p                 //表示p自身的地址位置 p                  ...

  6. Java框架之Struts2(四)

    一.ComboGrid 扩展自$.fn.combo.defaults和$.fn.datagrid.defaults.使用$.fn.combogrid.defaults重写默认值对象.数据表格下拉框结合 ...

  7. 在C#中的构造函数和解析函数

    构造函数 class A() { A() {Console.write("构造函数");} } 当你在程序种出现 A a=new A();的时候 程序自动执行 构造函数 A() { ...

  8. blfs(systemv版本)学习笔记-编译安装配置dhcpcd

    我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! dhcpcd项目地址:http://www.linuxfromscratch.org/blfs/view/8.3/basicne ...

  9. 图的遍历(bfs+dfs)模板

    bfs #include<iostream> #include<queue> #include<cstdio> using namespace std; queue ...

  10. 【代码笔记】Web--使用Chrome来查看网页源代码

    一,用Chrome打开百度页面,如图所示. 二,鼠标右键--->显示网页源代码--->如图所示. 三,鼠标右键--->检查---->如图所示.此时可以通过Device来看不同设 ...