20135302魏静静——课本第17章学习笔记

第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。
  • 用户空间实现一个系统后台服务用于监听套接字,处理任何读到的信息,并将事件传送到系统栈里。
时间: 2024-12-03 06:11:36

20135302魏静静——课本第17章学习笔记的相关文章

20135302魏静静——课本第4章学习笔记

第4章   进程调度 调度:调度是一个平衡的过程.一方面,它要保证各个运行的进程能够最大限度的使用CP:另一方面,保证各个进程能公平的使用CPU. 调度功能:决定哪个进程运行以及进程运行多长时间. 调度实现原理:与进程的优先级有关 Linux上调度实现的方法:O(1)的调度算法 调度相关的系统调用 4.1多任务   多任务系统可以划分为两类:非抢占式多任务( cooperative multitasking )和抢占式多任务(preemptive multitasking).像所 有Unix 的

20135302魏静静——课本第3章学习笔记

第三章   进程管理 本章主要内容: 进程和线程 进程的任务结构 进程和线程的创建 进程的终止 1. 进程和线程 进程:进程就是处于执行期的程序,实际上,进程就是正在执行的程序代码的实时结果: 线程:执行线程,简称线程,是进程中活动的对象(每个线程拥有独立的程序计数器.进程栈.和一组进程寄存器),内核调度的对象是线程,不是进程 进程提供2种虚拟机制:虚拟处理器和虚拟内存 每个进程有独立的虚拟处理器和虚拟内存, 每个线程有独立的虚拟处理器,同一个进程内的线程有可能会共享虚拟内存. 内核中进程的信息

《Linux内核设计与实现》第17章学习笔记

第17章.设备与模块 17.1设备类型 1.块设备(blkdev): 寻址以块为单位,通常支持重定位操作.通过称为“块设备节点”的特殊文件来访问. 2.字符设备(cdev): 不可寻址,仅提供数据的流式访问.通过称为“字符设备节点”的特殊文件来访问. 3.网络设备(ethernet devices): 提供了对网络的访问.它不是通过设备节点来访问,而是通过套接字API这样的特殊接口来访问. 17.2 模块 17.2.1 Hello,World (1)hello_init()函数是模块的入口点.

20135302魏静静——课本1-2章学习笔记

第一章 Linux内核简介 一.Unix Unix是一个强大.健壮和稳定的操作系统. Unix——支持抢占式多任务.多线程.虚拟内存.换页.动态链接和TCP/IP网络. 二.操作系统和内核简介 操作系统是指在整个系统中负责完成最基本功能和系统管理的那些部分. 内核独立于普通应用程序,一般处于系统态,拥有受保护的内存空间和访问硬件设备的所有权限.这种系统态和被保护起来的内存空间,统称为内核空间.在系统中运行的应用程序通过系统调用来与内核通信. 应用程序完成其工作的基本行为方式是: 应用程序通过系统

20135302魏静静——课本5章学习笔记

第五章 系统调用 5.1 与内核通信 中间层 作用三个:1.为用户空间提供一种硬件的抽象接口:2.保证系统稳定和安全:3.除异常和陷入,是内核唯一的合法入口. 5.2 API.POSIX和C库 API定义了应用程序使用的编程接口(可实现系统调用). API.POSIX.C库与系统调用之间关系. 5.3 系统调用——syscall 5.3.1 系统调用号 当用户空间的进程执行一个系统调用,就用系统调用号指明到底执行哪个系统调用. sys_ni_syscall():错误号,负责“填补空缺”,返回-E

20135302魏静静——课本18章学习笔记

第十八章 调试 一.内核中的bug 内核bug的原因可能有: - 错误代码 - 同步时发生的错误,例如共享变量锁定不当 - 错误的管理硬件 - …… 内核bug发作的症状可能有: - 降低所有程序的运行性能 - 毁坏数据 - 使得系统处于死锁状态 - …… 内核开发比起用户开发要多考虑一些独特的问题,比如: - 定时限制 - 竞争条件 - …… 原因是允许多个线程在内核中同时运行. 二.通过打印来调试 1. 健壮性 弹性极佳的函数:任何时候.任何地方都能调用它 可以在中断上下文和进程上下文中被调

scala编程第17章学习笔记(1)——集合类型

列表 列表的初始化及对其首尾的访问: scala> val colors = List("red", "blue", "green") colors: List[String] = List(red, blue, green) scala> colors.head res15: String = red scala> colors.tail res16: List[String] = List(blue, green) 数组 创

scala编程第17章学习笔记(4)——元组

元组可以把固定数量的条目组合在一起以便于作为整体传送.不像数组或列表,元组可以保存不同类型的对象. 元组常用来返回方法的多个值.例如,下面的方法找到集合中的最长单词并返回它的索引: scala> def longestWord(words: Array[String]) = { | var word = words(0) | var idx = 0 | for (i <- 1 until words.length) | if (words(i).length > word.length)

scala编程第17章学习笔记(2)——集和映射

默认情况下在使用“Set”或“Map”的时候,获得的都是不可变对象.如果需要的是可变版本,需要先写明引用. 如果同一个源文件中既要用到可变版本,也要用到不可变版本的集合或映射,方法之一是引用包含了可变版本的包名: scala> import scala.collection.mutable import scala.collection.mutable 与以往一样, 不可变集可以用Set指代,但现在还可以用mutable.Set指代可变集.举例如下: scala> val mutaSet =