第十七章  设备与模块

一、四种内核成分


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

二、设备类型


Linux系统中,设备被分为以下三种类型

  • 块设备——是可寻址的,寻址以块为单位,块大小随设备不同而不同;支持重定位(seeking )操作,也就是对数据的随机访问 块设备的例子有硬盘、蓝光光牒,还有如 Flash 这样的存储设备;通过称为“块设备节点”的特殊文件来访问的.
  • 字符设备——是不可寻址的,仅提供数据的流式访问;例子有键盘、鼠标、打印机,还有大部分伪设备。通过称为“字符设备节点”的特殊文件来访问的。与块设备不同,应用程序通过直接访问设备节点与字符设备交互。
  • 网络设备——网络设备打破了 Unix 的“所有东西都是文件”的设计原则,它不 是通过设备节点来访问,而是通过套接字 API 这样的特殊接口来访问。

三、模块


1.模块的概念:

  Linux 内核是模块化组成的,它允许内核在运行时动态地向其中插入或从中删除代码。这些代码(包括相关的子例程、数据、函数人口和函数出口〉被一并组合在 个单独的二进制镜像中,即所谓的可装载内核模块中,或简称为模块

2.支持模块的好处:

  基本内核镜像可以尽可能地小,因为可选的功能和驱动程序可以利用模块形式再提供。模块允许我们方便地删除和重新载入内核代码,也方便了调试工作。而且当热插拔新设备时,可通过命令载入新的驱动程序。

3.调用 module_init()实际上不是真正的函数调用,而是一个宏调用,它唯一的参数便是模块的初始化函数。模块的所有初始化函数必须符合下面的形式:int my _ init (void) ;

4.构建模块:

  构建过程的第一步是决定在哪里管理模块源码。 
  构建方式:

  • 放在内核派代码树中,把模块源码加入到内核源代码树中,作为一个补丁或者是最终把你的代码合并到正式的内核代码树中。
  • 放在内核代码外.

5.安装模块:

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

6.产生模块依赖性:

  产生内核依赖关系的信息, root用户可运行命令

7.载入模块:

  • 载入模块最简单的方法是通过 insmod 命令——insmod module.ko
  • 卸载模块使用 rmmod 命令,以 root 身份运——rmmod module
  • via modprobe中插入模块,需要以 root 身份运行——modprobe module [ module parameters ]

  其中,参数 module 指定了需要载入的模块各称,后面的参数将在模块加载时传入内核。

8.模块参数:

  所有宏需要包含<linux/module.h>头文件。

9.导出符号表:

  在内核中,导出内核函数需要使用特殊的指令:EXPORT_ SYMBOL()和 EXPORTSYMBOLGPL()

四、设备模型


1.统一设备模型 :

  设备模型提供了一个独立的机制专门来表示设备,并描述其在系统中的拓扑结构。

2.kobject:

  设备模型的核心部分就是 kobject,它自 struct kobject 结构体表示,定义于头文件<linux/kobject.b>中。

3.ktype:

  ktype 的存在是为了描述一族kobject 所具有的普遍特性.

4.kset:

  kset 是 kobject 对象的集合体。把它看成是一个容器,可将所有相关的 kobject 对象,比如“全部的块设备”置于同一位置。

5.kobject、ktype和kset的相互关系:

  kobject,由 struct koject 表示。 kobject 为我们引入了诸如引用计数、父子关系和对象名称等基本对象道具,并且是以一个统一的方式提供这些功能。

6.管理和操作kobject:

  使用 kobjcet 的第一步需要先来声明和初始化。 kobject 通过函数ko均ect_init 进行初始化,该函数定义在文件 <linux/kobject.h>中 :

  void kobjectinit(struct kobject •kobj, struct kobjtype •ktype);

  第一个参数就是需要初始化的 kobject 对象,在调用初始化函数前, kobject 必须清空。
  这个工作往往会在 kobject 所在的上层结构体初始化时完成。
  如果 kobject 未被清空,那么只需要调用 memset().
7.引用计数:

  增加引用计数称为获得对象的引用,减少引用计数称为释放对象的引用。
  当引用计数跌到零时,对象便可以被撤销,同时相关内存也都被释放。

五、sysfs


  sysfs文件系统是个处于内存中的虚拟文件系统,它为我们提供了 kobject 对象层次结构的视图,帮助用户能以一个简单文件系统的方式来观察系统中各种设备的拓扑结构。

1.sysfs中添加和删除kobject:

  函数都定义于文件 lib/kobject.c 中,声明于头文件<linux/kobject.b>中。

2.向sysfs中添加文件:

(1)默认属性:默认的文件集合是通过 kobject 和 kset 中的 ktype 字段提供的。因此所有具有相同类型的 kobject 在它们对应的 sysfs 目录下都拥有相同的默认文件集合.

(2)创建新属性:在sysfs 中创建一个符号连接:int sysfscreatelink(struct kobject kobj, struct kobject target, char name);

(3)删除新属性 - 删除一个属性需通过函数sysfsremove file() 完成:void sysfsremovefile (struct kobject kobj, const struct attribute attr);由sysfs_ creat_ link()创建的符号连接可通过删除:void sysfsremovelink(struct kobject kobj , char name);

3.内核事件层:

(1)内核事件由内核空间传递到用户空间需要经过 netlink. netlink 一个用于传送网络信息的多点传送套接字。

(2)在内核代码中向用户空间发送信号使用函数 kobject uevent():

  int kobject_uevent(struct kobject *kobj,enum kobject_ action action);

  • 第一个参数指定发送该信号的 koject 对象。实际的内核事件将包含该 koject 映射到 sysfs路径。
  • 第二个参数指定了描述该信号的“动作”或“动词”

《Linux内核设计与实现》第17章读书笔记的更多相关文章

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

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

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

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

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

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

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

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

  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内核设计与实现第十周读书笔记

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

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

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

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

    第三章 进程管理 3.1 进程 进程是处于执行期的代码.通常进程还要包含其他资源,像打开的文件.挂起的信号.内核的内部数据.处理器状态.一个或多个具有内存映射的内存地址空间及一个或多个执行线程,当然还 ...

随机推荐

  1. 基于神念TGAM的脑波小车(4)

    我使用的是HC05和BT06俩个蓝牙模块 1.[AT模式]HC05蓝牙模块的PIO11接VCC,上电后即进入HC05AT指令模式,对于BT06蓝牙直接上电进入AT模式,用USBT06转TTL模块连接到 ...

  2. Java中的==符号与equals()的使用(测试两个变量是否相等)

    Java 程序中测试两个变量是否相等有两种方式:一种是利用 == 运算符,另一种是利用equals()方法. 当使用 == 来判断两个变量是否相等时,如果两个变量是基本类型变量,且都是数值类型(不一定 ...

  3. 多线程分段下载研究的python实现(一)

    我一直对下载文件比较感兴趣.现在我下载文件大部分是用迅雷,但迅雷也有一些不如意的地方,内存占用大,一些不必要的功能太多,不可定制.尤其是最后一点.现在有些下载对useragent,cookie,aut ...

  4. linux 其他知识目录

    博客目录总纲首页 为博客园添加目录的方法总结 linux 命令自动补全包 手动配置网卡 nginx日志统计 Linux 深入理解inode/block/superblock /proc/sys目录下各 ...

  5. C++ 类 复制构造函数 The Copy Constructor

    一.复制构造函数的定义 复制构造函数是一种特殊的构造函数,具有一般构造函数的所有特性.复制构造函数创建一个新的对象,作为另一个对象的拷贝.复制构造函数只含有一个形参,而且其形参为本类对象的引用.复制构 ...

  6. 团队项目-北航MOOC系统Android客户端 NABC

    北航MOOC系统Android客户端 NABC (N) Need 需求 MOOC的全名是Massive Open Online Course,被称作大型开放式网络课程.2012年,美国的顶尖大学陆续设 ...

  7. Daily Scrumming 2015.10.21(Day 2)

    今明两天任务表 Member Today’s Task Tomorrow’s Task 江昊 配置ruby与rails环境 配置mysql与数据库用户管理 配置apache2环境 学习rails Ac ...

  8. Code128

    条形码 条形码(barcode)是将宽度不等的多个黑条和空白,按照一定的编码规则排列,用以表达一组信息的图形标识符.常见的条形码是由反射率相差很大的黑条(简称条)和白条(简称空)排成的平行线图案.条形 ...

  9. Beat(2/7)

    目录 摘要 团队部分 个人部分 摘要 队名:小白吃 组长博客:hjj 作业博客:beta冲刺(2/7) 团队部分 后敬甲(组长) 过去两天完成了哪些任务 整理博客 做了点商家数据表格 接下来的计划 做 ...

  10. 谷歌地图api 开发 (转载)

    https://www.cnblogs.com/520lin/p/5800024.html