zoukankan      html  css  js  c++  java
  • 20135337——Linux内核分析:第十七章 模块与设备

    第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。
    • 用户空间实现一个系统后台服务用于监听套接字,处理任何读到的信息,并将事件传送到系统栈里。
  • 相关阅读:
    Codeforces 469D Two Sets
    Codeforces1249D2 Too Many Segments (hard version)
    Codeforces 796D Police Stations
    Codeforces 617E XOR and Favorite Number
    Codeforces 900D Unusual Sequences
    Python底层(一):列表
    最短路径笔记(一):Floyd
    竞赛题笔记(二):剪邮票
    图论题笔记(三):最少中转次数
    图论题笔记(二):城市地图
  • 原文地址:https://www.cnblogs.com/zzzz5/p/5444210.html
Copyright © 2011-2022 走看看