第17章 模块与设备

  • 设备类型:在所有 Unix 系统中为了统一普通设备的操作所采用的分类。

  • 模块: Linux 内核中用于按需加载和卸载目标码的机制。

  • 内核对象:内核数据结构中支持面向对象的简单操作,还支持维护对象之间的父子关系。

  • sysfs :表示系统中设备树的一个文件系统。

1. 设备类型

三种类型

块设备
字符设备
网络设备

2. 模块

1. Hello,World

  • 模块的所有初始化函数必须符合形式:int my _ init (void);
  • 退出函数必须符合形式:void my_exit (void);

2.构建

3. 安装

  • 安装编译的模块: make modules_install

4. 产生依赖性

  • 生这依赖关系信息,而且在每次启动时更新。
  • 若想产生内核依赖关系的信息, root 用户可运行命令:depmod
  • 只为新模块生成依赖信息,而不生成所有的依赖关系,这时root 用户可运行命令:depmod -A

5. 载入

  • root 身份运行命令:insmod module .ko
  • 在内核 via modprobe 中插入模块,需要以 root 身份运行 zmodprobe module [ module parameters ] (参数 module 指定了需要载入的模块各称)。
  • 从内核中卸载模块,以 root 身份运行:modprobe -r modules

6. 管理配置选项

  • 设置CONFIG_FISHING_POLE 配置选项。
  • 如果建立了一个新子目录,希望kconfig 文件(可能是drivers/char/Kconfig)存在子该目录中,在己存在的 kconfig 文件中将它引入:source "drivers/char/fishing/Kcor,lfig”

7. 参数

  • 定义一个模块参数可通过宏完成:module_param(name, type, perm)。
参数的类型可以是byte 、short 、ushort、int、uint、long 、ulong、charp、bool 或invbool。

8. 导出符号表

  • 导出内核函数需要使用特殊的指令: EXPORT_ SYMBOL()和EXPORT_SYMBOL_GPL()。
  • 导出的内核符号表:导出的内核接口,称为内核API。
  • 在声明函数后,紧跟上EXPORT_SYMBOL()。

3. 设备模型

  • 实现设备模型的最初动机:可以沿设备树的叶子向其根的方向依次遍历,以保证能以正确顺序关闭各设备的电源。

1. kobject

  • 设备模型的核心部分。
  • struct kobject 结构体表示,定义于头文件<linux/k,ρ1lij四t.b>中。
  • 通常是嵌入其他结构中的。

2. ktype

  • kobject 对象被关联到一种特殊的类型:ktype。
  • 由kobj_type 结构体表示,定义于头文件<linux/kobject.h>中。
  • 为了描述一族kobject 所具有的普遍特性。

3. kset

  • 可把kobject 集中到一个集合中,而ktype 描述相关类型ko均ect 所共有的特性,它们之间的重要区别在于2 具有相同ktype 的kobject 可以被分组到不同的kset。
  • 在Linux 内核中,只有少数一些的ktype,却有多个kset。
  • 由kset 结构体表示,定义于头文件<linux/kobject.h>中:

4. kobject、ktype、kset关系

  • kobject,让那些包含它的结构具有了kobject 的特性。
  • ktype 定义了一些kobject 相关的默认特性。
  • kset 提供了两个功能:第一,其中嵌入的kobj创作为kobject 组的基类。第二, kset 将相关的kobject 集合在一起。

5. 管理和操作kobject

  • kobject 通过函数koject_init 进行初始化,该函数定义在文件<linux/kobject.h>中:void kobject_init(struct kobject *kobj, struct kobj_type *ktype);
第一个参数就是需要初始化的kobject 对象;
调用初始化函数前, kobject 必须清空;
未被清空,调用memset() 即可:memset(kobj, 0, sizeof (*kobj ) );
  • 应该调用kobject_createO 创建koject。

6.计数

  • kobject的主要功能:提供了一个统一的引用计数系统。
  • 初始化后, kobject 的引用计数设置为1;引用计数不为零,该对象就会继续保留在内存中。
  • 引用计数跌到零时,对象可被撤销,相关内存也被释放。
  • koject 的引用计数是通过kref结构体实现,该结构体定义在头文件<linux/kref.h>中。

4. sysfs

  • 一个处于内存中的虚拟文件系统,它为我们提供了kobject 对象层次结构的视图。
  • 通过kobject 对象中的dentry 字段实现把kobject 对象与目录项紧密联系起来。

1. 添加或删除kobject

  • 把koject 导入sysfs,你需要用到函数kobject_add():int kobject_add (struct kobj ect *kobj , struct kobj ect *parent, const char *fmt , . .. ) ;

    -从sysfs 删除一个kobject 对应文件目录,需使用函数kobject_del() :void kobject _del(struct kobject *kobj );

2. 添加文件

l. 默认属性

  • 所有具有相同类型的kobject 在它们对应的sysfs 目录下都拥有相同的默认文件集合。

2. 创建新属性

  • 在sysfs 中创建一个符号连接:int sysfs_create_link(struct kobject *kobj, struct kobject target, char *name);

3. 删除新属性

  • 删除一个属性需通过函数sysfs_remove_ file() 完成:void sysfs_remove_file (struct kobject *kobj, const struct attribute *attr);
  • 由sysfs_ creat_ link()创建的符号连接可通过删除:void sysfs_remove_link(struct kobject *kobj , char *name);

4. sysfs 约定

  • 该保证每个文件只导出一个值。
  • 以一个清晰的层次组织数据。
  • 提供内核到用户空闹的服务。

3. 内核事件层

  • 实现了内核到用户的消息通知系统。
  • 内核事件由内核空间传递到用户空间需要经过netlink。
  • 用户空间实现一个系统后台服务用于监听套接字,处理任何读到的信息,并将事件传送到系统栈里。

20135337——Linux内核分析:第十七章 模块与设备的更多相关文章

  1. Linux内核分析第四章 读书笔记

    Linux内核分析第四章 读书笔记 第一部分--进程调度 进程调度:操作系统规定下的进程选取模式 面临问题:多任务选择问题 多任务操作系统就是能同时并发地交互执行多个进程的操作系统,在单处理器机器上这 ...

  2. linux内核分析第3章&第18章读书笔记

    linux内核分析第3章&第18章读书笔记 第三章 进程管理 进程:处于执行期的程序(目标码存放在某种存储介质上) 包含资源:可执行程序代码,打开的文件,挂起的信号,内核内部数据,处理器状态, ...

  3. Linux内核设计第十七章笔记

    第十七章 设备与模块 关于设备驱动和设备管理,四种内核成分 设备类型:在所有unix系统中为了统一普通设备的操作所采用的分类 模块:Linux内核中用于按需加载和卸载目标代码的机制 内核对象:内核数据 ...

  4. Linux内核分析——第五章 系统调用

    第五章 系统调用 5.1 与内核通信 1.系统调用在用户空间进程和硬件设备之间添加了一个中间层,该层主要作用有三个: (1)为用户空间提供了一种硬件的抽象接口 (2)系统调用保证了系统的稳定和安全 ( ...

  5. Linux内核分析第一二章读书笔记

    linux读书笔记(1,2章) 标签(空格分隔): 20135328陈都 第一章 Linux内核简介 Unix的历史 Unix 虽然已经使用了40年,但计算机科学家仍然认为它是现存操作系统中最强大和最 ...

  6. Linux内核分析——第三章 进程管理

    第三章 进程管理 3.1 进程 1.进程就是处于执行期的程序:进程就是正在执行的程序代码的实时结果:进程是处于执行期的程序以及相关的资源的总称:进程包括代码段和其他资源. 线程:是在进程中活动的对象. ...

  7. linux内核分析 第4章读书笔记

    第四章 进程调度 一.抢占与非抢占 1.非抢占式进程调度 进程会一直执行直到自己主动停止运行 2.抢占式进程调度 Linux/Unix使用的是抢占式的方式,强制的挂起进程的动作就叫做抢占. 二.进程优 ...

  8. Linux内核分析第四章读书笔记

    第四章 进程调度 进程调度程序:确保进程能有效工作的一个内核子程序 决定将哪个进程投入运行,何时运行已经运行多长时间 进程调度程序可看做在可运行态进程之间分配有限的处理器时间资源的内核子系统 原则:只 ...

  9. Linux内核分析——第四章 进程调度

    第四章 进程调度 4.1 多任务 1.多任务操作系统就是能同时并发的交互执行多个进程的操作系统. 2.多任务操作系统使多个进程处于堵塞或者睡眠状态,实际不被投入执行,这些任务尽管位于内存,但是并不处于 ...

随机推荐

  1. Linux 小知识翻译 - 「桌面环境」

    这次聊聊桌面环境. 上次聊了 X Window System 相关的内容,虽然令人意外,但X Window System 和桌面环境不是一回事.请大家稍微考虑一下. X Window System 是 ...

  2. January 15th, 2018 Week 03rd Monday

    We got things to do. Places to go. People to see. Futures to make. 我们有很多事情要做,有很多地方要去,有很多人要见,有很多美好的未来 ...

  3. January 08th, 2018 Week 02nd Monday

    To be yourself in a world that is constantly trying to make you something else is the greatest accom ...

  4. ping 127.0.0.1和ping本地ip分别测试什么?

    ping 127.0.0.1 是你本地的回环地址! 实际上只要是127.0.0.1到127.255.255.255都是回环地址!都是可以PING检查的! 它能ping通,说明你的TCP/IP协议栈没问 ...

  5. C#事件の事件处解

    C# 事件(Event) 事件(Event) 基本上说是一个用户操作,如按键.点击.鼠标移动等等,或者是一些出现,如系统生成的通知.应用程序需要在事件发生时响应事件.例如,中断.事件是用于进程间通信. ...

  6. MyCat读写分离、分库分表

    系统开发中,数据库是非常重要的一个点.除了程序的本身的优化,如:SQL语句优化.代码优化,数据库的处理本身优化也是非常重要的.主从.热备.分表分库等都是系统发展迟早会遇到的技术问题问题.Mycat是一 ...

  7. UVA1599-Ideal Path(BFS进阶)

    Problem UVA1599-Ideal Path Time Limit: 3000 mSec Problem Description New labyrinth attraction is ope ...

  8. (推荐)用C++来开发Skyline应用

    原文地址:http://www.hailongchang.org/index.php/archives/category/terraexplorer 供大家学习参考.

  9. Linux系列教程(六)——Linux常用命令之文件搜索命令

    前一篇博客我们讲解了Linux链接命令和权限管理命令, 通过 ln -s  链接名 表示创建软链接,不加-s表示创建硬链接:还有三个更改权限的命令,chmod命令可以更改文件或目录权限,chown命令 ...

  10. 在angularjs实现一个时钟

    想在网页上,显示当前系统时钟. <body ng-app="App2" ng-controller="Ctrl2"> <div ng-bind ...