设备与模块

关于设备驱动和设备管理,四种内核成分。

  • 设备类型:在所有Unix 系统中为了统一普通设备的操作所采用的分类.
  • 模块: Linux 内核中用于按需加载和卸载目标码的机制.
  • 内核对象:内核数据结构中支持面向对象的简单操作,还支持维护对象之间的父子关系。
  • sysfs :表示系统中设备树的一个文件系统。

17 .1 设备类型

在Linux 以及所有Unix 系统中,设备被分为以下三种类型

  • 块设备
  • 字符设备
  • 网络设备
  1. 块设备通常缩写为blkdev,它是可寻址的,寻址以块为单位,块大小随设备不同而不同;
  2.  
  3. 块设备通常支持重定位( seeking )操作,也就是对数据的随机访问。
  4.  
  5. 块设备是通过称为“块设备节点”的特殊文件来访问的,井且通常被挂载为文件系统。

  

  1. 字符设备通常缩写为cdev,它是不可寻址的,仅提供数据的流式访问,就是一个个字符,或者一个个字节。
  2.  
  3. 字符设备是通过称为“字符设备节点”的特殊文件来访问的。
  4.  
  5. 与块设备不同,应用程序通过直接访问设备节点与字符设备交互。

  

  1. 网络设备最常见的类型:以太网设备(ethemet devices
  2. 它提供了对网络的访问,
  3.  
  4. 通过-个物理适配器和一种特定的协议(如IP 协议)进行的。
  5.  
  6. 网络设备打破了Unix 的“所有东西都是文件”的设计原则,
  7. 它不是通过设备节点来访问,
  8. 而是通过套接字API 这样的特殊接口来访问。

  

  1. 有些设备驱动是虚拟的,仅提供访问内核功能而已.我们称为“伪设备”(pseudo device

  

17.2 模块

  1. 尽管Linux 是“单块内核”( monolithic )的操作系统
  2. 整个系统内核都运行于一个单独的保护域中,
  3. 但是Linux 内核是模块化组成的,
  4. 它允许内核在运行时动态地向其中插入或从中删除代码。
  5. 这些代码(包括相关的子例程、数据、函数人口和函数出口〉被一并组合在一个单独的二进制镜像中,
  6. 即所谓的可装载内核模块中,或简称为模块。
  7.  
  8. 支持模块的好处是基本内核镜像可以尽可能地小,
  9. 因为可选的功能和驱动程序可以利用模块形式再提供。
  10.  
  11. 模块允许我们方便地删除和重新载入内核代码,也方便了调试工作。
  12.  
  13. 而且当热插拔新设备时,可通过命令载入新的驱动程序。

  

17.2.1 Hello, World

hel lo_init -初始化函散, 当模块装载时被调用,如果成功装载返回零,否则返回非零值

hello_exit -退出函数,当模块卸载时披调用

  1. module init(hello init);
  2. module exit(hello exit);
  1. hello_init的函数是模块的入口点,
  2. 它通过module_ init()例程注册到系统中,在内核装载时被调用。
  3.  
  4. 调用module_initO 实际上不是真正的函数调用,而是一个宏调用,它唯一的参数便是模块的初始化函数。
  5.  
  6. 模块的所有初始化函数必须符合下面的形式:
  7. int my _ init (void) ;
  8.  
  9. 因为init 函数通常不会被外部函数直接调用,所以你不必导出该函数,故它可标记为static
  10. 类型.

  

  1. hello_ exit()函数是模块的出口函数,
  2. 它由module_exit()例程应册到系统.在模块从内存卸载时,内核便会调用hello_exit
  3.  
  4. 退出函数可能会在返回前负责清理资源,以保证硬件处于一致状态:或者做其他的一些操作。
  5.  
  6. exit 函数负责对init 函数以及在模块生命周期过程中所做的一切事情进行撤销工作,
  7. 在退出函数返回后, 模块就被卸载了。
  8. 退出函数必须符合以下形式:
  9. void my_exit (void);
  10. init 函数一样,你也可以标记其为static.

  

  1. 如果上述文件被静态地编译到内核映像中,那么退出函数将不被包含,而且永远都不会被调
  2.  
  3. MODULE_LICENSE()宏用于指定模块的版权。
  4.  
  5. MODULE_AUTHOR()宏和MODULE_DESCRIPTION()宏指定了代码作者
  6. 和模块的简要描述,它们完全是用作信息记录目的。

  

17.2.2 构建模块

1. 放在内核派代码树中

当你决定了把你的模块放入内核源代码树中,下一步要清楚你的模块应在内核源代码树中
处于何处。

设备驱动程序存放在内核源码树根目录下/drivers 的子目录下,在其内部,设备驱动
文件被进一步按照类别、类型或特殊驱动程序等更有序地组织起来。

2. 放在内核代码外

17.2.3 安装模块

编译后的模块将被装入到目录/li~/modules/version/kemel/ 下,

在kernel/ 目录下的每一个目录都对应着内核源码树中的模块位置。

如果使用的是2 .6.34 内核,而且将你的模块源代码直接
放在drivers/char/下,那么编译后的钓鱼竿驱动程序的存放路径将是:

/lib/modules/2.6.34/kemel/drivers/chai/fisbing.ko.

下面的构建命令用来安装编译的模块到合适的目录下
make modules install
通常需要以root 权限运行。

17.2.4 产生模块依赖性
Linux 模块之间存在依赖性

  • 若想产生内核依赖关系的信息, root 用户可运行

        depmod

  • 为了执行更快的更新操作,那么可以只为新模块生成依赖信息,而不是生成所有的依赖关

系,这时root 用户可运行命令
       depmod -A

  模块依赖关系信息存放在/lib/modules/version/modules.dep 文件中.

17.2.5 戴入模块

  1. 载入模块最简单的方法是通过insmod 命令,请求内核载入指定的模块。
  2.  
  3. insmod 程序不执行任何依赖性分析或进一步的错误检查。
  4.  
  5. root 身份运行命令:
  6. insmod module .ko
  7. 这里, module.ko 是要载入的模块名称。
  8.  
  9. 执行命令
  10. insmod fishing.ko
  11.  
  12. 卸载一个模块,你可使用rmmod 命令,它同样需要以root 身份运行
  13. rmmod module
  14.  
  15. 先进工具modprobe 提供了模块依赖性分析、错误智能检查、错误报告以及许多其他功能和选项。
  16. 为了在内核via modprobe 中插入模块,需要以root 身份运行
  17. modprobe module [ module parameters ]
  18. 其中,参数module 指定了需要载入的模块各称,后面的参数将在模块加载时传入内核。

  

  1. modprobe 命令不但会加载指定的模块,而且会自动加载任何它所依赖的有关模块.所以说
  2. 它是加载模块的最佳机制。
  3. modprobe 命令也可用来从内核中卸载模块,当然这也需要以root 身份运行:
  4. modprobe -r modules
  5. 参数modules 指定一个或多个需要卸载的模块.与rmmod 命令不同, modprobe 也会装载给
  6. 定模块所依赖的相关模块,但其前提是这些相关模块没有被使用.

  

17.2.6 管理配置选项

17.2. 7 模块参数

17.2.8 导出符号表

模块被载入后,就会被动态地连接到内核。注意,它与用户空间中的动态链接库类似,只有
当被显式导出后的外部函数,才可以被动态库调用。在内核中,导出内核函数需要使用特殊的指
令: EXPORT_ SYMBOL()和EXPORT_SYMBOL_GPL()。
导出的内核函数可以被模块调用,而来导出的函数模块则无陆被调用。

《Linux内核设计与分析》第十七章读书笔记的更多相关文章

  1. 《Linux内核设计与实现》第四周读书笔记——第五章

    <Linux内核设计与实现>第四周读书笔记--第五章 20135301张忻 估算学习时间:共1.5小时 读书:1.0 代码:0 作业:0 博客:0.5 实际学习时间:共2.0小时 读书:1 ...

  2. 《Linux内核设计与实现》Chapter 1 读书笔记

    <Linux内核设计与实现>Chapter 1 读书笔记 一.Unix的特点 Unix从Multics中产生,是一个强大.健壮和稳定的操作系统. 特点 1.很简洁 2.在Unix系统中,所 ...

  3. LINUX内核设计与实现第三周读书笔记

    LINUX内核设计与实现第三周读书笔记 第一章 LINUX内核简介 1.1 Unix的历史 1969年的夏天,贝尔实验室的程序员们在一台PDR-7型机上实现了Unix这个全新的操作系统. 1973年, ...

  4. 《Linux内核设计与实现》Chapter 3 读书笔记

    <Linux内核设计与实现>Chapter 3 读书笔记 进程管理是所有操作系统的心脏所在. 一.进程 1.进程就是处于执行期的程序以及它所包含的资源的总称. 2.线程是在进程中活动的对象 ...

  5. 《Linux内核设计与实现》Chapter 2 读书笔记

    <Linux内核设计与实现>Chapter 2 读书笔记 一.获取内核源码 1.使用Git 我们曾经在以前的学习中使用过Git方法 $ git clone git://git.kernel ...

  6. 《Linux内核设计与实现》Chapter 5 读书笔记

    <Linux内核设计与实现>Chapter 5 读书笔记 在现代操作系统中,内核提供了用户进程与内核进行交互的一组接口,这些接口的作用是: 使应用程序受限地访问硬件设备 提供创建新进程与已 ...

  7. 《Linux内核设计与实现》Chapter 18 读书笔记

    <Linux内核设计与实现>Chapter 18 读书笔记 一.准备开始 一个bug 一个藏匿bug的内核版本 知道这个bug最早出现在哪个内核版本中. 相关内核代码的知识和运气 想要成功 ...

  8. Linux内核设计与实现 第十七章

    1. 设备类型 linux中主要由3种类型的设备,分别是: 设备类型 代表设备 特点 访问方式 块设备 硬盘,光盘 随机访问设备中的内容 一般都是把设备挂载为文件系统后再访问 字符设备 键盘,打印机 ...

  9. Linux内核设计与实现第十周读书笔记

    第十七章 设备与模块 关于设备驱动与设备管理,我们讨论四种内核成分. 设备类型 模块 内核对象 sysfs 17.1设备类型 在Linux以及所有Unix系统中,设备被分为以下三种类型: 块设备,块设 ...

  10. Linux内核设计与实现第八周读书笔记

    第四章 进程调度 进程在操作系统看来是程序的运行态表现形式. 4.1多任务 多任务操作系统就是能同时并发地交互执行多个进程的操作系统. 多任务操作系统会使多个进程处于堵塞或者睡眠状态.这些任务尽管位于 ...

随机推荐

  1. 创建随机的9x9数独游戏终盘并打印

    创建随机的9x9数独游戏终盘并打印 项目github地址 1. 项目相关要求 1.1 要求 利用程序随机构造出N个已解答的9x9数独棋盘 . 输入 数独棋盘题目个数N(0<N<=10000 ...

  2. Java基本数据类型转换

    一:Java的基本数据类型和引用数据类型 1:基本数据类型 2:引用数据类型 二:基本数据的类型转换 基本数据类型中,布尔类型boolean占有一个字节,由于其本身所代码的特殊含义,boolean类型 ...

  3. golang中的init函数以及main函数

    首先我们看一个例子:init函数: init 函数可在package main中,可在其他package中,可在同一个package中出现多次. main函数 main 函数只能在package ma ...

  4. 详解JavaScript中void语句的使用

    void是在JavaScript中的一个重要的关键字可被用作其单操作数之前出现一元运算符,其可以是任何类型. 此运算符指定不需要返回值,进行计算的表达式.它的语法可能是下列之一: <script ...

  5. CSS3系列教程:HSL 和HSL

    使用CSS3 HSL声明同样是用来设置颜色的.下一个呢? HSLA? 是的,这个和RGBA的效果是一样的. HSL声明使用色调Hue(H).饱和度Saturation(s)和亮度Lightness(L ...

  6. excel中mid函数的用法

    函数名称:MID主要功能:从一个文本字符串的指定位置开始,截取指定数目的字符.使用格式:MID(text,start_num,num_chars)参数说明:text代表一个文本字符串:start_nu ...

  7. JS面向对象之工厂模式

    js面向对象 什么是对象 "无序属性的集合,其属性可以包括基本值.对象或者函数",对象是一组没有特定顺序的的值.对象的没个属性或方法都有一个俄名字,每个名字都映射到一个值. 简单来 ...

  8. 从头到尾使用Geth的说明-1-安装

    Geth 1.安装https://github.com/ethereum/go-ethereum/wiki/Installation-Instructions-for-Mac 1.首先先安装Homeb ...

  9. OPTIMIZER_INDEX_COST_ADJ 与OPTIMIZER_INDEX_CACHING 参数说明

    [部分转载]http://www.xifenfei.com/2012/06/optimizer_index_caching和optimizer_index_cost_adj参数说明.html 1. O ...

  10. day03---基本数据类型、运算符、与用户交互

    day03 基本数据类型: 数据类型指的是变量值的类型,变量值之所以区分类型,是因为变量值是用来记录一种事物的状态,而不同的事物有不同的事物状态,对应着也必须必须用不同的变量类型去衡量. 分类: 数字 ...