一、 内核组成
由进程管理、设备驱动、内存管理、文件系统、网路协议栈、系统调用组成。
1.1 内存管理详情如下
内存原理;smp/numa模型;页表、页表缓存; cpu缓存; 内存映射;虚拟内存;伙伴分配器;块分配器;巨型页;页回收;页错误异常处理与反碎片技术;连续内存分配原理与实现;内存系统调用;kmalloc/vmalloc;内存池原理与实现;内存优化与实现。
1.2 文件系统详情如下
虚拟文件系统vfs;通用文件模型;数据结构;文件系统调用;挂在文件系统;无存储文件系统;磁盘文件系统;ext2/ext3/ext4文件系统;日志jbd2;用户空间系统;fuse原理机制、接口实现。
1.3 设备驱动详情如下
设备子系统;i/o机制原理;设备模型;字符设备子系统;网络接口驱动;linux设备模型;ldm;设备模型和sysfs;字符设备驱动;子设备与次设备;设备文件操作;分配与注册字符设备;写文件操作实现;网卡设备驱动;数据结构;设备方法;驱动程序;块设备驱动;资源管理;i/o调度;bio结构原理;pci总线原理;蓝牙子系统;hci层/连接;l2cap;bnep;蓝牙数据包接受架构。
1.4 网络协议栈详情如下
网络基础架构
SKB/net_device;网络层分析;Linux邻近子系统;netlink套接字;iptables套接字;netfilter框架;内核NIC接口分析;mac80211无线子系统;
网络协议栈
internet控制消息协议(ICMP);用户数据报协议(UDP);传输控制协议TCP;流控制传输协议(SCTP);数据报拥塞控制协议(DCCP);组播/策略/多路径路由选择;接收/发送(IPv4/IPv6)数据报;infiniBand栈的架构;系统API调用;POSIX网络API调用;epoll内核原理与实现;网络系统参数配置。
1.5 进程管理详情如下
进程管理涵盖了进程的基础原理、状态转换、生命周期中的系统调用、通过task_struct
数据结构表示,以及进程调度机制,包括调度策略、进程优先级分析和在SMP(对称多处理)环境下的调度优化。
1.6 系统调用详情如下
1.6.1 系统调用的概念与原理
- 用户空间与内核空间:用户空间是应用程序执行的环境,其中的程序不能直接访问底层硬件,而内核空间则是操作系统内核执行的环境,具有对系统硬件和资源的完全访问权限。
- 系统调用的作用:系统调用是用户空间程序与内核空间进行通信的一种方式,提供了一组接口,允许应用程序请求内核执行特权操作,如文件操作、网络通信等。
- 执行过程:当用户空间的程序需要执行一个系统调用时,它会通过软中断(或类似的机制)触发内核空间的执行。内核会根据系统调用的标识符找到相应的内核函数执行特权操作,完成后将结果返回给用户空间。
1.6.2 系统调用的功能
系统调用提供了丰富的功能接口,包括但不限于以下几个方面:
- 文件操作:如打开、关闭、读取、写入文件等。
- 进程控制:如创建新进程、发送信号、等待子进程退出等。
- 内存管理:如内存分配、释放等。
- 网络通信:如建立套接字连接、发送和接收数据等。
- 设备访问:如访问磁盘、网络设备等。
1.6.3 系统调用的实现与接口
- 实现方式:在Linux中,系统调用通常通过C库函数调用,并通过返回值和errno变量指示成功或错误。每个系统调用被赋予一个唯一的系统调用号,用于标识具体的系统调用。
- 接口:系统调用的接口通常是通过软中断号或指令来指定的,用户空间向内核空间传递参数的方式通常是通过寄存器或堆栈。
1.6.4 系统调用的安全性与稳定性
- 安全性:系统调用在用户空间和硬件设备之间添加了一个中间层,通过权限检查等方式确保了系统的安全。
- 稳定性:系统调用提供了标准化的接口,使得应用程序能够以一致的方式与内核进行交互,从而保证了系统的稳定性。
1.6.5 常见的系统调用示例
open()
、close()
:打开或关闭文件。read()
、write()
:从文件读取或向文件写入数据。fork()
:创建一个新进程。exec()
:执行一个新程序。socket()
、bind()
、listen()
、accept()
、connect()
:网络编程相关的系统调用。
1.6.6 系统调用的性能考虑
- 系统调用涉及到用户态到内核态的切换,这会引入一定的性能开销。因此,在设计应用程序时需要权衡系统调用的次数和性能需求。
1.6.7 Linux内核的系统调用数量
- 随着Linux内核的发展,系统调用的数量也在不断增加。以Linux kernel-5.18.8为例,它包含了440个系统调用,这些系统调用讲究通用性,一旦固定,很少修改,以保证Linux系统的稳定性和兼容性。