第十七章  设备与模块

一、四种内核成分


  • 设备类型:在所有 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. 4. 为HelloWorld添加日志

    回顾 通过上篇内容,我们已经使用flask编写了我们的第一个接口或者说是html页面.我们可以看到,使用flask来编写接口/页面是十分简单的.那么接下来,我们丰富一下上面的例子. 需求 现在的需求来 ...

  2. 学习python,第五篇

    Python中%r和%s的详解及区别 %r用rper()方法处理对象%s用str()方法处理对象 有些情况下,两者处理的结果是一样的,比如说处理int型对象. 例一: print "I am ...

  3. Docker 私有仓库方案比较与搭建

    我们知道docker镜像可以托管到dockerhub中,跟代码库托管到github是一个道理.但如果我们不想把docker镜像公开放到dockerhub中,只想在部门或团队内部共享docker镜像,能 ...

  4. fetch上传文件

    通过简单的配置,实现form表单文件上传 var formData = new FormData(); var fileField = document.querySelector("inp ...

  5. Python20-Day05

    一.模块与包 1.模块 什么是模块? 在python中,模块可以分为四个通用类别: 1. 使用python编写的.py文件 2. 已经被编译为共享库或DLL的c或者c++扩展 3. 把一系列模块组织到 ...

  6. 测试效率 timeit cProfile

    timeit使用 def f1(lIn): l1 = sorted(lIn) # O(nlogn) C语言的 l2 = [i for i in l1 if i<0.5] # O(n) retur ...

  7. LeetCode 303. Range Sum Query - Immutable (C++)

    题目: Given an integer array nums, find the sum of the elements between indices iand j (i ≤ j), inclus ...

  8. 冲刺One之站立会议7 /2015-5-20

    2015-5-20 在登陆成功之后要实现的是聊天界面的交互过程,不同的IP进行信息和数据的传递,这方面我们上学期Java实验里面有过相关的内容,我们把它拿过来改了一下格式,试着看能不能成功,目前还没实 ...

  9. 凡事预则立|项目Beta冲刺准备

    1.讨论组长是否重选的议题和结论. 组员一致认为组长不需要重选,我们都很认可组长的表现,组长的付出我们都看在眼里,我们找不出更适合担任组长的人选. 2.下一阶段需要改进完善的功能. 财富值的布局优化以 ...

  10. roject ..\appcompat_v7 is missing. Needed by eclipse 转AS项目时遇到的问题

    参考的 http://www.cnblogs.com/vanezkw/p/4182917.html 去转换项目, 在第一步的时候就遇到问题 ,提示 missing 而那个又是兼容包 解决方法:项目右键 ...