一、概念简述

在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. netty源码解解析(4.0)-10 ChannelPipleline的默认实现--事件传递及处理

    事件触发.传递.处理是DefaultChannelPipleline实现的另一个核心能力.在前面在章节中粗略地讲过了事件的处理流程,本章将会详细地分析其中的所有关键细节.这些关键点包括: 事件触发接口 ...

  2. 146. LRU缓存机制

    题目描述 运用你所掌握的数据结构,设计和实现一个LRU (最近最少使用) 缓存机制.它应该支持以下操作: 获取数据 get 和 写入数据 put . 获取数据 get(key) - 如果密钥 (key ...

  3. 《深入理解Java虚拟机》(二)Java虚拟机运行时数据区

    Java虚拟机运行时数据区 详解 2.1 概述 本文参考的是周志明的 <深入理解Java虚拟机>第二章 ,为了整理思路,简单记录一下,方便后期查阅. 2.2 运行时数据区域 Java虚拟机 ...

  4. c# 二进制序列化

    public static T Deserialize<T, S>(S stream) where S : Stream where T : class, new() { using (s ...

  5. Java--实现单点登录

    1 什么是单点登陆 单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一.SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用 ...

  6. jsp使用servlet实现用户登录 及动态验证码

    在进行表单设计中,验证码的增加恰恰可以实现是否为“人为”操作,增加验证码可以防止网站数据库信息的冗杂等... 现在,我将讲述通过servlet实现验证码: 验证码作为一个图片,在页面中为“画”出来的, ...

  7. 纯css3实现的动画导航菜单

    测试咯 css3 前端特效代码 网页模板 图片素材 css3 前端特效代码 网页模板 图片素材 css3 前端特效代码 网页模板 图片素材 css3 前端特效代码 网页模板 图片素材 css3 前端特 ...

  8. 【CSS学习】--- overflow属性

    一.前言 在网页布局中,未处理的溢出元素绝对算得上是个“毒瘤”.因为如果一个“盒子”周围还有其它元素,而从这个盒子中溢出的元素会和盒子周围的元素发生层叠,并脱离了整个HTML元素,所以我们应当合理使用 ...

  9. 泛化之美--C++11可变模版参数的妙用

    1概述 C++11的新特性--可变模版参数(variadic templates)是C++11新增的最强大的特性之一,它对参数进行了高度泛化,它能表示0到任意个数.任意类型的参数.相比C++98/03 ...

  10. html5手机移动端三级联动城市选择器

    //我的地址 var area1 = new LArea(); area1.init({ 'trigger': '#demo1', //触发选择控件的文本框,同时选择完毕后name属性输出到该位置 ' ...