1- 介绍

Introduction

原文链接

我的博客

Linux 架构

Linux 可以被粗略划分为用户空间内核空间,这两个部分使用系统调用接口交互。内核在内核空间运行,是操作系统的核心组件,它为同层或上层提供服务。应用一般运行在用户空间中。

Linux 内核模块

内核模块可以按照用户需求,加载到内核中,或从内核剔除。添加或剔除的过程不需要重启系统。客户程序可以通过下面两种方式添加到内核中:

  • 将代码添加到内核源码树中,并重新编译内核
  • 更高效的方式是在内核运行过程中将代码添加进入内核,这个过程称作加载模块,这个模块就是我们要向内核中添加的客户程序

内核模块被称作可加载内核模块 LKM: Loadable Kernel Modules,用于与内核做区分。内核位于 /boot 目录中,在我们启动设备时被加载,而 LKM 则是在内核加载结束后才被加载。

内核模块也是内核的一部分,它们通过与内核交互,完成目标功能。

使用 LKM 可以完成不同的诉求,最常见的应用是:

  • 设备驱动
  • 文件系统驱动
  • 系统调用

设备驱动

设备驱动专门为某种硬件编写,内核使用这类驱动完成于硬件的通讯。

文件系统

文件系统驱动将文件系统解释为文件以及目录等内容。有多种方式能够将文件与目录等内容存储到光驱、网络服务器等媒介上。对于每一种不同的方式,都需要与之对应的驱动。比如我们常见的 ext2 文件系统类型,就有对应的 ext2 文件系统驱动,还有其他的文件系统类型,如 MS-DOS 文件系统以及 NFS 文件系统等。

系统调用

用户空间程序通过系统调用获取内核服务。比如使用系统调用能够完成读取文件、创建新的进程、关闭系统等。大部分系统调用都是基本的内核已经提供了的内容,当然我们在开发时,也可以创造自己的系统调用,并通过 LKM 安装到内核中。

可加载内核模块优点

  • 不需要重新编译内核 ,节省时间
  • 灵活,使用单条命令就能够加载/卸载它

内核模块与用户程序区别

  • 独立的地址空间,模块运行在内核空间,应用运行在用户空间
  • 内核模块具有更高执行优先级,运行在内核空间的代码相运行在较于应用空间的代码,具有更高的优先级
  • 使用不同的头文件

内核驱动与内核模块区别

  • 内核模块是单独编译的一块代码,可以在内核运行时通过 insmodmodprobe 加载
  • 内核驱动直接与硬件打交道

设备驱动类型

有三类设备驱动类型:

  • 字符设备
  • 块设备
  • 网络设备

字符设备

以字符形式读/写硬件文件的驱动。一些典型的字符设备如键盘、鼠标、串口等。如果用户使用字符文件写数据,其他用户将不能使用相同的字符文件写数据,并阻塞访问。字符文件使用同步机制写数据,字符设备用来通讯,不能被挂载。

块设备

以块形式读/写硬件文件的驱动。我们所有的盘,比如硬盘驱动、USB、CD-ROM 都是块设备。写数据是以异步的形式实现。这些设备文件用来存储数据到真正的硬件上,可以被挂载访问。

网络设备

以数据包形式收/发数据的驱动,比如以太网卡。有些网络设备只是回环设备,用来将数据发送给自己。

posted @ 2024-02-19 20:50  ArvinDu  阅读(1)  评论(0编辑  收藏  举报