以下基于宋宝华老师的Linux设备驱动详解
Linux内核主要由进程调度、内存管理、虚拟文件系统、网络接口和进程间通信5个子系统组成
进程调度
- 当请求的资源不能得到满足时,驱动一般会调度其他线程执行,并使本进程进入睡眠状态,直到它请求的资源被释放,才会被唤醒进入就绪状态。
- 睡眠分为可中断睡眠和不可中断睡眠,可中断睡眠在收到信号的时候会醒
- 完全处于
TASK_UNINTERRUPTIBLE状态的进程无法被杀死- 2.6.26之后,内核增加了一个
TASK_KILLABLE状态,等于TASK_WAKEKILL|TASK_UNINTERRUPTIBLE,可以响应致命信号
- 2.6.26之后,内核增加了一个
- 在Linux内核中,使用
task_struct结构体来描述进程,该结构体中包含如下- 描述进程内存资源
- 文件系统资源
- 文件资源
- tty资源
- 信号处理等指针
- Linux的线程采用轻量级进程模型来实现:在用户空间通过
pthread_create创建线程时,本质上内核只是创建了一个新的task_struct,并将新task_struct的所有资源指针都指向创建它的那个task_struct的资源指针 - 在内核中,如果需要几个并发执行的任务,也可以启动内核线程,这些线程没有用户空间
pid_t kernel_thread(int (*fn)(void*), void* arg, unsigned long flags);:启动内核线程
内存管理
控制多个进程安全地共享主内存区域。当CPU提供内存管理单元时,Linux内存管理对于每个进程完成从虚拟内存到物理内存的状态。Linux2.6引入了对无MMU CPU的支持
- 内核空间和用户空间的具体界限是可以调整的:内核配置选项,
Kernel Features→ Memory split - 内存管理总体的所包含的部分:
Buddy算法:用于管理每个页的占用情况,内核空间的slab以及用户空间的C库的二次管理- 内核提供了页缓存的支持,用内存来缓存磁盘,
per-BDI flusher线程,用于刷会脏的页缓存到磁盘 Kswapd交换线程,在Linux中用于页面回收——包括file-backed的页和匿名页,的内核线程。采用最近最少使用(LRU)算法进行内存回收
虚拟文件系统
- Linux虚拟文件系统隐藏了各种硬件的具体细节,为所有设备提供了统一的借口
- 独立于各个具体的文件系统,是对各种文件系统的一个抽象
- 为上次提供了统一的
vfs_read()、vfs_write()等接口
这个系统的实质作用,就是提供一个统一的open、read、write等函数调用,上层应用程序不管打开FAT、ext1等这类文件系统的文件,还是各类不同的设备文件,都可以通过open()函数来打开,读写也是。
网络接口
网络接口提供了对各种网络标准的存取和各种网络硬件的支持
- 网络接口可分为网络协议和网络驱动程序
- 网络协议:赋值是按每一种可能的网络传输协议
- 网络设备驱动程序:负责与硬件设备通信
- 不管使用的具体是使用的哪一种网络协议,上层统一使用套接字接口
进程间通信
支持进程之间的通信
5个组成部分的依赖关系
进程与内存管理
这两个子系统相互依赖
- 程序要运行,则必须要创建进程
- 创建进程就必须要将程序和数据装入内存
进程间通信与内存管理
进程间通信子系统依赖内存管理才能支持共享内存通信机制。
虚拟文件系统与网络接口
虚拟文件系统利用网络接口,才能支持网络文件系统:NFS
内存管理与虚拟文件系统
两者之间互相依赖
- 虚拟文件系统利用内存管理支持
RAMDISK设备 - 内存管理利用虚拟文件系统支持交换,交换进程定期由调度程序调度
其他
除了这些,所有的子系统还要依赖于一些共同的资源,如所有子系统都要用到的API:分配与释放内存等
Linux内核由进程调度、内存管理、虚拟文件系统、网络接口和进程间通信构成。进程调度管理资源与睡眠状态,内存管理支持多进程共享内存,虚拟文件系统提供统一接口,网络接口处理协议与硬件,进程间通信依赖内存管理。

580

被折叠的 条评论
为什么被折叠?



