Linux内核笔记 -- 内核中层设施
来源:互联网 发布:oa系统的数据库设计 编辑:程序博客网 时间:2024/05/17 18:49
内核中层设施
在阅读内核源码时,有一个重要的问题。内核将一部分东西放进kernel文件夹中,其他一些东西放进mm、ipc、net、fs、sound、block等文件夹中。这样的划分依据是什么?
- 在系统实现了IRQ之后,就能处理机器相关的中断,能够获取到系统的精确时间并实现计时的功能,借助IPI可以通知其他的处理器。
- 实现了粗细粒度的锁就能确保多核心执行过程中数据的正确性。
- 通过封装机器MMU的内存管理指令,就能实现对Cache的管理,实现内存屏障、写回、缓存无效等通用功能。
这些功能都是机器提供给用户的功能,操作系统的最核心部分是这些下层的基础设施,对系统而言,这些东西逻辑简单,贴近机器,但是功能不健全,要有效的使用机器就要对其在使用方式上进行扩展,通过一定的数据结构构建出能够有效操作下层设施的中层模块。
中层设施实现的功能
当我们有了基础的功能,我们能够给串口或者显示器输出一段字符串日志,但我们在输出时不能每次都处理一个个字节来生成这个字符串,这时我们利用状态机来实现一个专门按照一定格式填充字符串生成目标字符串的函数(printf)。
[linux−4.13.12/lib/vsprintf.c] 然后我们就能够非常快捷的生成目标字符串了。我们利用RCU机制在spinlock基础上实现了一个类似版本控制的数据同步模块,减少了数据同步中的挂起问题,加快了内核中多线程对数据访问和修改的效率。
借鉴BPF中状态机的思想,实现了在内核中免复制的性能监控和数据过滤。
在拥有基本的执行能力后,通过
task_struct
来分割各个执行体,以执行体为单元实现了多任务的调度和资源分配,让用户通过fork、clone等系统调用来说执行自己的代码。通过在线程执行体上添加时间标记,在调度前后统计线程在系统上的执行时间(acct)。
借助计时函数实现完成对象实现多线程的更加灵活的等待。
在基本的机器资源使用中,引入CGroup的树状结构对各个子系统的资源进行定量的约束,在请求资源过程中插入函数来查询Cgroup来判断是否可以分配资源。引入Namespace对系统的各个子系统进行环境隔离。
中层设施的定位
中层设施在机器的下层基础上扩展了系统的功能,但主要的工作区域还是CU、ALU、MMU和基本的内存使用上,这些上层扩展增强了内核自身的能力,也划定了内核的最核心的结构。其他的各个子系统都是在这个中层结构上构建数据结构、注册处理过程把自己挂接到系统相应、预留自己的接口。最终其他的子系统也都会落在这个中层核心上,扩展系统功能,就像身体的躯干和四肢的关系一样。