Introduction
Linux 架构
Linux 可以被粗略划分为用户空间与内核空间,这两个部分使用系统调用接口交互。内核在内核空间运行,是操作系统的核心组件,它为同层或上层提供服务。应用一般运行在用户空间中。
Linux 内核模块
内核模块可以按照用户需求,加载到内核中,或从内核剔除。添加或剔除的过程不需要重启系统。客户程序可以通过下面两种方式添加到内核中:
- 将代码添加到内核源码树中,并重新编译内核
- 更高效的方式是在内核运行过程中将代码添加进入内核,这个过程称作加载模块,这个模块就是我们要向内核中添加的客户程序
内核模块被称作可加载内核模块 LKM: Loadable Kernel Modules
,用于与内核做区分。内核位于 /boot
目录中,在我们启动设备时被加载,而 LKM
则是在内核加载结束后才被加载。
内核模块也是内核的一部分,它们通过与内核交互,完成目标功能。
使用 LKM
可以完成不同的诉求,最常见的应用是:
- 设备驱动
- 文件系统驱动
- 系统调用
设备驱动
设备驱动专门为某种硬件编写,内核使用这类驱动完成于硬件的通讯。
文件系统
文件系统驱动将文件系统解释为文件以及目录等内容。有多种方式能够将文件与目录等内容存储到光驱、网络服务器等媒介上。对于每一种不同的方式,都需要与之对应的驱动。比如我们常见的 ext2
文件系统类型,就有对应的 ext2
文件系统驱动,还有其他的文件系统类型,如 MS-DOS
文件系统以及 NFS
文件系统等。
系统调用
用户空间程序通过系统调用获取内核服务。比如使用系统调用能够完成读取文件、创建新的进程、关闭系统等。大部分系统调用都是基本的内核已经提供了的内容,当然我们在开发时,也可以创造自己的系统调用,并通过 LKM
安装到内核中。
可加载内核模块优点
- 不需要重新编译内核 ,节省时间
- 灵活,使用单条命令就能够加载/卸载它
内核模块与用户程序区别
- 独立的地址空间,模块运行在内核空间,应用运行在用户空间
- 内核模块具有更高执行优先级,运行在内核空间的代码相运行在较于应用空间的代码,具有更高的优先级
- 使用不同的头文件
内核驱动与内核模块区别
- 内核模块是单独编译的一块代码,可以在内核运行时通过
insmod
、modprobe
加载 - 内核驱动直接与硬件打交道
设备驱动类型
有三类设备驱动类型:
- 字符设备
- 块设备
- 网络设备
字符设备
以字符形式读/写硬件文件的驱动。一些典型的字符设备如键盘、鼠标、串口等。如果用户使用字符文件写数据,其他用户将不能使用相同的字符文件写数据,并阻塞访问。字符文件使用同步机制写数据,字符设备用来通讯,不能被挂载。
块设备
以块形式读/写硬件文件的驱动。我们所有的盘,比如硬盘驱动、USB、CD-ROM 都是块设备。写数据是以异步的形式实现。这些设备文件用来存储数据到真正的硬件上,可以被挂载访问。
网络设备
以数据包形式收/发数据的驱动,比如以太网卡。有些网络设备只是回环设备,用来将数据发送给自己。
标签:文件系统,介绍,内核,驱动,内核模块,设备,加载 From: https://www.cnblogs.com/arvin-blog/p/18021939