模块和热插拔
注:本文为《深入Linux内核架构》 的学习笔记
理解Linux内核最好预备的知识点:
Linux内核的特点:
结合了unix操作系统的一些基础概念
Linux内核的任务:
1.从技术层面讲,内核是硬件与软件之间的一个中间层。作用是将应用层序的请求传递给硬件,并充当底层驱动程序,对系统中的各种设备和组件进行寻址。
2.从应用程序的层面讲,应用程序与硬件没有联系,只与内核有联系,内核是应用程序知道的层次中的最底层。在实际工作中内核抽象了相关细节。
3.内核是一个资源管理程序。负责将可用的共享资源(CPU时间、磁盘空间、网络连接等)分配得到各个系统进程。
4.内核就像一个库,提供了一组面向系统的命令。系统调用对于应用程序来说,就像调用普通函数一样。
内核实现策略:
1.微内核。最基本的功能由中央内核(微内核)实现。所有其他的功能都委托给一些独立进程,这些进程通过明确定义的通信接口与中心内核通信。
2.宏内核。内核的所有代码,包括子系统(如内存管理、文件管理、设备驱动程序)都打包到一个文件中。内核中的每一个函数都可以访问到内核中所有其他部分。目前支持模块的动态装卸(裁剪)。Linux内核就是基于这个策略实现的。
内核的组成部分:
1.用户空间(在“地址空间与特权级别”小节会详细介绍):
应用程序:
C库
2.内核空间(在“地址空间与特权级别”小节会详细介绍):
核心内核
设备驱动程序
硬件
详细可参考图1
图1 Linux内核组成部分
哪些地方用到了内核机制?
1.进程(在cpu的虚拟内存中分配地址空间,各个进程的地址空间完全独立;同时执行的进程数最多不超过cpu数目)之间进行通 信,需要使用特定的内核机制。
2.进程间切换(同时执行的进程数最多不超过cpu数目),也需要用到内核机制。
进程切换也需要像FreeRTOS任务切换一样保存状态,并将进程置于闲置状态/恢复状态。
3.进程的调度。确认哪个进程运行多长的时间。
Linux进程
1.采用层次结构,每个进程都依赖于一个父进程。内核启动init程序作为第一个进程。该进程负责进一步的系统初始化操作。init进程是进程树的根,所有的进程都直接或者间接起源于该进程。
2.通过pstree命令查询。实际上得系统第一个进程是systemd,而不是init(这也是疑问点)
3.系统中每一个进程都有一个唯一标识符(ID),用户(或其他进程)可以使用ID来访问进程。
功能:将一个新程序加载到当前进程的内存中并执行。旧程序的内存页将刷出,其内容替换为新的数据。然后开始执行新程序。
Linux线程
进程可以看成是一个正在执行的程序,而线程则是与主程序并行运行的程序函数或例程。
采用clone方法创建线程。
地址空间与特权级别
在正式介绍之前先介绍几个单位:
KiB 2^10字节
MiB 2^20
GiB 2^30
虚拟地址与物理地址:
虚拟地址:在计算机的专用术语中是指标识一个虚拟(非物理地址)的实体地址。
物理地址:切切实实存在的地址。在存储器里以字节为单位存储信息,为正确地存放或取得信息,每一个字节单元给以一个唯一的存储器地址,称为物理地址。
IA-32位结构的CPU只需要使用二级页表,Linux内核总是使用四级页表,剩余部分由内核通过控页表对缺少的页表进行仿真。
概念注意:
用户空间
如图2所示:
图2 虚拟内存的划分
注意:每一个进程都有上述独立的虚拟地址空间。对于图2所示,每个进程有4GiB的内存空间。
这两种状态的差别在于:对高于TASK_SIZE的内存区域的访问。
CPU大多数在执行用户空间中的代码。当应用程序执行系统调用时,则会切换到核心态,内核将完成其请求。在此期间,内核可以访问虚拟地址空间的用户部分。在系统调用完成之后,CPU切换回用户状态。
硬件中断也使CPU切换到核心态,但这种情况下内核不能访问用户空间。
系统调用有哪些:
进程管理
信号
文件
目录和文件系统
保护机制
定时器函数
如:在IA-32处理器上,Linux使用一个专用软件中断执行系统调用。
设备驱动程序、块设备和字符设备
设备驱动程序的任务:是在于支持应用程序经由设备文件与设备通信。换言之,使得能按恰当的方式在设备上读取/写入数据。
设备驱动程序的定义:用于与系统连接的输入/输出装置通信。如硬盘、软驱、各种接口、声卡等。
外设分为两类:
1.字符设备。提供连续的数据流,数据可以顺序读取,通常不支持随机存取。支持按字节/字符来读写数据。
典型:调制解调器
2.块设备。可以随机访问设备数据,程序可以自行确定读取数据的位置。不支持基于字符寻址,数据读写只能以块的倍数进行。
典型:硬盘。
复杂性:比字符设备复杂,因为设计到缓存机制。
网络
网卡也可以通过设备驱动程序控制。
但在内核中,网卡不能以设备文件访问。因为网络通信期间数据打包到各种协议层,内存处理数据必须针对协议层处理,才能有效将数据对接应用程序。
为了支持用文件接口处理网络连接。Linux提供了套接字抽象,套接字可以看成是应用程序、文件接口、内核的网络实现之间的代理。
文件系统
文件存储在硬盘或者其他块设备(如光盘等),采用层次式文件系统。
文件系统使用目录结构主治存储的数据,并将其他原信息(如所有者、访问权限等)关联起来。
Linux支持许多不同的文件系统:
如标准的Ext2和Ext3文件系统、ReiserFS、XFS、VFAT等
注意:软件层(Virtual Filesystem虚拟文件系统)内核必须提供一个额外的软件层,将各种底层的文件系统的具体特征与应用层隔离开。如图3所示。
图3 文件系统的额外软件层
参考文献:
[1]Wolfgang Mauerer.《深入Linux内核架构》 Wolfgang Mauerer著 郭旭译 人民邮电出版社