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。
    • 用户空间实现一个系统后台服务用于监听套接字,处理任何读到的信息,并将事件传送到系统栈里。
  • 相关阅读:
    在Centos 7下编译openwrt+njit-client
    开博随笔
    Chapter 6. Statements
    Chapter 4. Arrays and Pointers
    Chapter 3. Library Types
    Chapter 2.  Variables and Basic Types
    关于stm32不常用的中断,如何添加, 比如timer10 timer11等
    keil 报错 expected an identifier
    案例分析 串口的地不要接到电源上 会烧掉
    案例分析 CAN OPEN 调试记录 进度
  • 原文地址:https://www.cnblogs.com/zzzz5/p/5444210.html
Copyright © 2011-2022 走看看