设备驱动简介
1、内核
内核是个大块的可执行文件,负责处理所有请求,内核的可以划分为如下部分:
进程管理
内核负责创建和销毁进程,并处理它们与外部世界的联系(输入和输出)。 不同进程间通讯(通过信号、 管道、 或者进程间通讯等原语)对整个系统功能来说是基本的,也由内核处理。 另外, 调度器控制进程如何共享 CPU,是进程管理的一部分。内核的进程管理活动实现了多个进程在一个单个或者多个 CPU 之上的抽象。
内存管理
计算机的内存是主要的资源,处理它所用的策略对系统性能是至关重要的。 内核为所有进程的每一个都在有限的可用资源上建立了一个虚拟地址空间。虚拟内存就是在你电脑的物理内存不够用时把一部分硬盘空间作为内存来使用,这部分硬盘空间就叫作虚拟内存。彻底搞懂虚拟内存,虚拟地址,虚拟地址空间_虚拟内存和虚拟地址_一口Linux的博客-CSDN博客
文件系统
Unix 在很大程度上基于文件系统的概念;几乎 Unix 中的任何东西都可看作一个文件。在非结构化的硬件之上建立了一个结构化的文件系统,Linux支持多个文件系统类型,也就是物理介质上不同的数据组织方式。
设备控制
几乎每个系统操作最终都映射到一个物理设备上。除了处理器、内存和非常少的个别实体之外,任何设备控制操作都由特定于要寻址的设备相关的代码来进行,这些代码称为设备驱动。内核中必须嵌入系统中出现的每个外设的驱动。
网络
网络必须由操作系统来管理,因为大部分网络操作不是特定于某一个进程。进入系统的报文是异步事件,报文在某一个进程接手之前必须被收集、识别、分发。系统负责在程序和网络接口之间递送数据报文,它必须根据程序的网络活动来控制程序的执行。另外, 所有的路由和地址解析问题都在内核中实现。
1.1 可加载模块
每块可以在运行时添加到内核的代码,被称为一个模块。Linux 内核提供了对许多模块类型的支持,包括但不限于设备驱动。每个模块由目标代码组成(没有连接成一个完整可执行文件),可以动态连接到运行中的内核中,通过 insmod 程序链接,以及通过 rmmod 程序去链接。
1.2设备和模块分类
字符设备
一个字符( char ) 设备是一种可以当作一个字节流来存取的设备( 如同一个文件 );一个字符驱动负责实现这种行为。这样的驱动常常至少实现 open, close, read, 和 write 系统调用。文本控制台( /dev/console )和串口(/dev/ttyS0 及其友 )是字符设备的例子,因为它们很好地展现了流的抽象。在一个字符设备和一个普通文件之间唯一有关的不同就是,你经常可以在普通文件中移来移去,但是大部分字符设备仅仅是数据通道,你只能顺序存取。然而,存在看起来象数据区的字符设备,你可以在里面移来移去,例如, frame grabber 这样,应用程序可以使用 mmap 或者 lseek 存取。
块设备
如同字符设备, 块设备通过位于 /dev 目录的文件系统结点来存取. 一个块设备(例如一个磁盘)应该是可以驻有一个文件系统的. 在大部分的 Unix 系统, 一个块设备只能处理这样的 I/O 操作, 传送一个或多个长度经常是 512 字节( 或一个更大的 2 的幂的数 )的整块. Linux, 相反, 允许应用程序读写一个块设备象一个字符设备一样 – 它允许一次传送任意数目的字节.结果就是, 块和字符设备的区别仅仅在内核在内部管理数据的方式上, 并且因此在内核/驱动的软件接口上不同. 如同一个字符设备, 每个块设备都通过一个文件系统结点被存取的, 它们之间的区别对用户是透明的. 块驱动和字符驱动相比, 与内核的接口完全不同.
网络接口
任何网络事务都通过一个接口来进行, 就是说, 一个能够与其他主机交换数据的设备. 通常,一个接口是一个硬件设备, 但是它也可能是一个纯粹的软件设备, 比如环回接口. 一个网络接口负责发送和接收数据报文, 在内核网络子系统的驱动下, 不必知道单个事务是如何映射到实际的被发送的报文上的. 很多网络连接( 特别那些使用 TCP 的)是面向流的, 但是网络设备却常常设计成处理报文的发送和接收. 一个网络驱动对单个连接一无所知; 它只处理报文.