四种内核成分node
- 设备类型:在全部 Unix 系统中为了统一普通设备的操做所采用的分类.
- 模块: Linux 内核中用于按需加载和卸载目标码的机制.
- 内核对象:内核数据结构中支持面向对象的简单操做,还支持维护对象之间的父子关系。
- sysfs :表示系统中设备树的一个文件系统。
Linux系统中,设备被分为如下三种类型linux
块设备网络
- 一般缩写为 blkdev ,它是可寻址的,寻址以块为单位,块大小随设备不一样而不一样;
- 支持重定位(seeking )操做,也就是对数据的随机访问 块设备的例子有硬盘、蓝光光牒,还有如 Flash 这样的存储设备;
- 经过称为“块设备节点”的特殊文件来访问的.
字符设备数据结构
- 字符设备一般缩写为 cdev,它是不可寻址的,仅提供数据的流式访问;
- 例子有键盘、鼠标、打印机,还有大部分伪设备。
- 经过称为“字符设备节点”的特殊文件来访问的。
- 与块设备不一样,应用程序经过直接访问设备节点与字符设备交互。
网络设备dom
- 网络设备打破了 Unix 的“全部东西都是文件”的设计原则,它不 是经过设备节点来访问,而是经过套接字 API 这样的特殊接口来访问。 其余设备
- “杂项设备”,是个简化的字符设备。杂项设备使驱动程序开发者可以很容易地表示一个简单设备。
- “伪设备”的设备驱动是虚拟的,仅提供访问内核功能而 已。最多见的如内核随机数发生器(经过/dev/random和/dev/urandom 访问)、空设备(经过/dev/null 访问)、零设备(经过/dev/zero访问)等。
一、Linux 内核是模块化组成的,它容许内核在运行时动态地向其中插入或从中删除代码。模块化
二、支持模块的好处:函数
- 基本内核镜像能够尽量地小,由于可选的功能和驱动程序能够利用模块形式再提供。
- 模块容许咱们方便地删除和从新载入内核代码,也方便了调试工做。并且当热插拔新设备时,可经过命令载入新的驱动程序。
三、调用 module_init()实际上不是真正的函数调用,而是一个宏调用,它惟一的参数即是模块的初始化函数。模块的全部初始化函数必须符合下面的形式:工具
int my _ init (void) ;ui
构建过程的第一步是决定在哪里管理模块源码。
构建方式:设计
(1)放在内核派代码树中.
- 把模块源码加入到内核源代码树中
- 做为一个补丁或者是最终把你的代码合并到正式的内核代码树中.
(2)放在内核代码外.
用来安装编译的模块到合适的目录下
make modules install
一般须要以 root 权限运行。
产生内核依赖关系的信息, root用户可运行命令
depmod
一、载入模块最简单的方法是经过 insmod 命令。
insmod module.ko
二、卸载模块使用 rmmod 命令,以 root 身份运:
rmmod module
三、via modprobe中插入模块,须要以 root 身份运行:
modprobe module [ module parameters ]
其中,参数 module 指定了须要载入的模块各称,后面的参数将在模块加载时传入内核。
Kconfig 文件:
config FISHING_POLE tristate "Fish Master 3000 support" default n help If you say Y here, support for the Fish Master 3000 wi th computer interface will be compiled into the kernel and accessible via a device node . You can also say M here and the driver will be built as a module named fishing.ko. If unsure, say N.
- 配置选项第一行定义了该选项所表明的配置目标。注意 CONFIG_ 前缀并不须要写上。
- 第二行声明选项类型为住istate,也就是说能够编译进内核(Y),也可做为模块编译(M),或者干脆不编译它(N)。若是编译选项表明的是一个系统功能,而不是一个模块,那么编译选项将用 bool 指令代替往istate,这说明它不容许被编译成模块。处于指令以后的引号内文字为该选项指定了名称。
- 第三行指定了该选项的默认选择,这里默认操做是不编译它(则。也能够把默认选择指定为编译进内核飞凹,或者编译成一个模块(M)。对驱动程序而言,默认选择一般为不编译进内核(N)。
- Help 指令的目的是为该选项提供帮助文档。各类配置工具均可以按要求显示这些帮助。由于这些帮助是面向编译内核的用户和开发者的,因此帮助内容简洁扼要。通常的用户一般不会编译内核,但若是他们想试试,每每也能理解配置帮助的意思。
全部宏须要包含<linux/module.h>头文件。
在内核中,导出内核函数须要使用特殊的指令:
EXPORT_ SYMBOL()和 EXPORTSYMBOLGPL()
统一设备模型 :
设备模型提供了一个独立的机制专门来表示设备,并描述其在系统中的拓扑结构,从而使得系统具备如下优势:
- 代码重复最小化.
- 提供诸如引用计数这样的统一机制。
- 能够列举系统中全部的设备,观察它们的状态,而且查看它们链接的总结.
- 能够将系统中的所有设备结构以树的形式完整、有效地展示出来一一包括全部的总统和内部链接。
- 能够将设备和其对应的驱动联系起来,反之亦然。
- 能够将设备按照类型加以归类,好比分类为输入设备,而无需理解物理设备的拓扑结构.
- 能够沿设备树的叶子向其根的方向依次遍历,以保证能以正确顺序关闭各设备的电源。
设备模型的核心部分就是 kobject,它自 struct kobject 结构体表示,定义于头文件<linux/kobject.b>中。
ktype 的存在是为了描述一族kobject 所具备的广泛特性.
kset 是 kobject 对象的集合体。把它当作是一个容器,可将全部相关的 kobject 对象,好比“所有的块设备”置于同一位置。
kobject,由 struct koject 表示。 kobject 为咱们引入了诸如引用计数、父子关系和对象名称等基本对象道具,而且是以一个统一的方式提供这些功能。
使用 kobjcet 的第一步须要先来声明和初始化。 kobject 经过函数ko均ect_init 进行初始化,该函数定义在文件 <linux/kobject.h>中 :
void kobjectinit(struct kobject •kobj, struct kobjtype •ktype);
- sysfs文件系统是个处于内存中的虚拟文件系统
- 它为咱们提供了 kobject 对象层次结构的视图。
- 帮助用户能以一个简单文件系统的方式来观察系统中各类设备的拓扑结构。
函数都定义于文件 lib/kobject.c 中,声明于头文件<linux/kobject.b>中。
一、 默认属性
二、建立新属性
int sysfscreatelink(struct kobject kobj, struct kobject target, char name);
三、删除新属性 - 删除一个属性需经过函数sysfsremove file() 完成:
void sysfsremovefile (struct kobject kobj, const struct attribute attr);
void sysfsremovelink(struct kobject kobj , char name);
一、内核事件由内核空间传递到用户空间须要通过 netlink. netlink 一个用于传送网络信息的多点传送套接字。
二、在内核代码中向用户空间发送信号使用函数 kobject uevent():
int kobject_uevent(struct kobject *kobj,enum kobject_ action action);