Linux内核架构和工作原理详解.docx
- 文档编号:1102981
- 上传时间:2022-10-17
- 格式:DOCX
- 页数:12
- 大小:749.52KB
Linux内核架构和工作原理详解.docx
《Linux内核架构和工作原理详解.docx》由会员分享,可在线阅读,更多相关《Linux内核架构和工作原理详解.docx(12页珍藏版)》请在冰豆网上搜索。
Linux内核架构和工作原理详解
Linux内核架构和工作原理详解
作用是将应用层序的请求传递给硬件,并充当底层驱动程序,对系统中的各种设备和组件进行寻址。
目前支持模块的动态装卸(裁剪)。
Linux内核就是基于这个策略实现的。
Linux进程采用层次结构,每个进程都依赖于一个父进程。
内核启动init程序作为第一个进程。
该进程负责进一步的系统初始化操作。
init进程是进程树的根,所有的进程都直接或者间接起源于该进程。
virt/----提供虚拟机技术的支持。
Linux内核预备工作
理解Linux内核最好预备的知识点:
懂C语言
懂一点操作系统的知识
熟悉少量相关算法
懂计算机体系结构
Linux内核的特点:
结合了unix操作系统的一些基础概念
Linux内核的任务:
1.从技术层面讲,内核是硬件与软件之间的一个中间层。
作用是将应用层序的请求传递给硬件,并充当底层驱动程序,对系统中的各种设备和组件进行寻址。
2.从应用程序的层面讲,应用程序与硬件没有联系,只与内核有联系,内核是应用程序知道的层次中的最底层。
在实际工作中内核抽象了相关细节。
3.内核是一个资源管理程序。
负责将可用的共享资源(CPU时间、磁盘空间、网络连接等)分配得到各个系统进程。
4.内核就像一个库,提供了一组面向系统的命令。
系统调用对于应用程序来说,就像调用普通函数一样。
内核实现策略:
1.微内核。
最基本的功能由中央内核(微内核)实现。
所有其他的功能都委托给一些独立进程,这些进程通过明确定义的通信接口与中心内核通信。
2.宏内核。
内核的所有代码,包括子系统(如内存管理、文件管理、设备驱动程序)都打包到一个文件中。
内核中的每一个函数都可以访问到内核中所有其他部分。
目前支持模块的动态装卸(裁剪)。
Linux内核就是基于这个策略实现的。
哪些地方用到了内核机制?
1.进程(在cpu的虚拟内存中分配地址空间,各个进程的地址空间完全独立;同时执行的进程数最多不超过cpu数目)之间进行通信,需要使用特定的内核机制。
2.进程间切换(同时执行的进程数最多不超过cpu数目),也需要用到内核机制。
进程切换也需要像FreeRTOS任务切换一样保存状态,并将进程置于闲置状态/恢复状态。
3.进程的调度。
确认哪个进程运行多长的时间。
Linux进程
1.采用层次结构,每个进程都依赖于一个父进程。
内核启动init程序作为第一个进程。
该进程负责进一步的系统初始化操作。
init进程是进程树的根,所有的进程都直接或者间接起源于该进程。
2.通过pstree命令查询。
实际上得系统第一个进程是systemd,而不是init(这也是疑问点)
3.系统中每一个进程都有一个唯一标识符(ID),用户(或其他进程)可以使用ID来访问进程。
Linux内核源代码的目录结构
Linux内核源代码包括三个主要部分:
1.内核核心代码,包括第3章所描述的各个子系统和子模块,以及其它的支撑子系统,例如电源管理、Linux初始化等。
2.其它非核心代码,例如库文件(因为Linux内核是一个自包含的内核,即内核不依赖其它的任何软件,自己就可以编译通过)、固件集合、KVM(虚拟机技术)等。
3.编译脚本、配置文件、帮助文档、版权说明等辅助性文件。
使用ls命令看到的内核源代码的顶层目录结构,具体描述如下。
include/----内核头文件,需要提供给外部模块(例如用户空间代码)使用。
kernel/----Linux内核的核心代码,包含了3.2小节所描述的进程调度子系统,以及和进程调度相关的模块。
mm/----内存管理子系统(3.3小节)。
fs/----VFS子系统(3.4小节)。
net/----不包括网络设备驱动的网络子系统(3.5小节)。
ipc/----IPC(进程间通信)子系统。
arch//----体系结构相关的代码,例如arm,x86等等。
arch//mach-----具体的machine/board相关的代码。
arch//include/asm----体系结构相关的头文件。
arch//boot/dts----设备树(DeviceTree)文件。
init/----Linux系统启动初始化相关的代码。
block/----提供块设备的层次。
sound/----音频相关的驱动及子系统,可以看作“音频子系统”。
drivers/----设备驱动(在Linuxkernel3.10中,设备驱动占了49.4的代码量)。
lib/----实现需要在内核中使用的库函数,例如CRC、FIFO、list、MD5等。
crypto/-----加密、解密相关的库函数。
security/----提供安全特性(SELinux)。
virt/----提供虚拟机技术(KVM等)的支持。
usr/----用于生成initramfs的代码。
firmware/----保存用于驱动第三方设备的固件。
samples/----一些示例代码。
tools/----一些常用工具,如性能剖析、自测试等。
Kconfig,Kbuild,Makefile,scripts/----用于内核编译的配置文件、脚本等。
COPYING----版权声明。
MAINTAINERS----维护者名单。
CREDITS----Linux主要的贡献者名单。
REPORTING-BUGS----Bug上报的指南。
Documentation,README----帮助、说明文档。
Linux内核体系结构简析简析
图1Linux系统层次结构
最上面是用户(或应用程序)空间。
这是用户应用程序执行的地方。
用户空间之下是内核空间,Linux内核正是位于这里。
GNUCLibrary(glibc)也在这里。
它提供了连接内核的系统调用接口,还提供了在用户空间应用程序和内核之间进行转换的机制。
这点非常重要,因为内核和用户空间的应用程序使用的是不同的保护地址空间。
每个用户空间的进程都使用自己的虚拟地址空间,而内核则占用单独的地址空间。
Linux内核可以进一步划分成3层。
最上面是系统调用接口,它实现了一些基本的功能,例如read和write。
系统调用接口之下是内核代码,可以更精确地定义为独立于体系结构的内核代码。
这些代码是Linux所支持的所有处理器体系结构所通用的。
在这些代码之下是依赖于体系结构的代码,构成了通常称为BSP(BoardSupportPackage)的部分。
这些代码用作给定体系结构的处理器和特定于平台的代码。
Linux内核实现了很多重要的体系结构属性。
在或高或低的层次上,内核被划分为多个子系统。
Linux也可以看作是一个整体,因为它会将所有这些基本服务都集成到内核中。
这与微内核的体系结构不同,后者会提供一些基本的服务,例如通信、I/O、内存和进程管理,更具体的服务都是插入到微内核层中的。
每种内核都有自己的优点,不过这里并不对此进行讨论。
随着时间的流逝,Linux内核在内存和CPU使用方面具有较高的效率,并且非常稳定。
但是对于Linux来说,最为有趣的是在这种大小和复杂性的前提下,依然具有良好的可移植性。
Linux编译后可在大量处理器和具有不同体系结构约束和需求的平台上运行。
一个例子是Linux可以在一个具有内存管理单元(MMU)的处理器上运行,也可以在那些不提供MMU的处理器上运行。
Linux内核的uClinux移植提供了对非MMU的支持。
图2Linux内核体系结构
Linux内核的主要组件有:
系统调用接口、进程管理、内存管理、虚拟文件系统、网络堆栈、设备驱动程序、硬件架构的相关代码。
(1)系统调用接口
SCI层提供了某些机制执行从用户空间到内核的函数调用。
正如前面讨论的一样,这个接口依赖于体系结构,甚至在相同的处理器家族内也是如此。
SCI实际上是一个非常有用的函数调用多路复用和多路分解服务。
在./linux/kernel中您可以找到SCI的实现,并在./linux/arch中找到依赖于体系结构的部分。
(2)进程管理
进程管理的重点是进程的执行。
在内核中,这些进程称为线程,代表了单独的处理器虚拟化(线程代码、数据、堆栈和CPU寄存器)。
在用户空间,通常使用进程这个术语,不过Linux实现并没有区分这两个概念(进程和线程)。
内核通过SCI提供了一个应用程序编程接口(API)来创建一个新进程(fork、exec或PortableOperatingSystemInterface[POSIX]函数),停止进程(kill、exit),并在它们之间进行通信和同步(signal或者POSIX机制)。
进程管理还包括处理活动进程之间共享CPU的需求。
内核实现了一种新型的调度算法,不管有多少个线程在竞争CPU,这种算法都可以在固定时间内进行操作。
这种算法就称为O
(1)调度程序,这个名字就表示它调度多个线程所使用的时间和调度一个线程所使用的时间是相同的。
O
(1)调度程序也可以支持多处理器(称为对称多处理器或SMP)。
您可以在./linux/kernel中找到进程管理的源代码,在./linux/arch中可以找到依赖于体系结构的源代码。
(3)内存管理
内核所管理的另外一个重要资源是内存。
为了提高效率,如果由硬件管理虚拟内存,内存是按照所谓的内存页方式进行管理的(对于大部分体系结构来说都是4KB)。
Linux包括了管理可用内存的方式,以及物理和虚拟映射所使用的硬件机制。
不过内存管理要管理的可不止4KB缓冲区。
Linux提供了对4KB缓冲区的抽象,例如slab分配器。
这种内存管理模式使用4KB缓冲区为基数,然后从中分配结构,并跟踪内存页使用情况,比如哪些内存页是满的,哪些页面没有完全使用,哪些页面为空。
这样就允许该模式根据系统需要来动态调整内存使用。
为了支持多个用户使用内存,有时会出现可用内存被消耗光的情况。
由于这个原因,页面可以移出内存并放入磁盘中。
这个过程称为交换,因为页面会被从内存交换到硬盘上。
内存管理的源代码可以在./linux/mm中找到。
(4)虚拟文件系统
虚拟文件系统(VFS)是Linux内核中非常有用的一个方面,因为它为文件系统提供了一个通用的接口抽象。
VFS在SCI和内核所支持的文件系统之间提供了一个交换层(请参看图4)。
图3Linux文件系统层次结构
在VFS上面,是对诸如open、close、read和write之类的函数的一个通用API抽象。
在VFS下面是文件系统抽象,它定义了上层函数的实现方式。
它们是给定文件系统(超过50个)的插件。
文件系统的源代码可以在./linux/fs中找到。
文件系统层之下是缓冲区缓存,它为文件系统层提供了一个通用函数集(与具体文件系统无关)。
这个缓存层通过将数据保留一段时间(或者随即预先读取数据以便在需要是就可用)优化了对物理设备的访问。
缓冲区缓存之下是设备驱动程序,它实现了特定物理设备的接口。
(5)网络堆栈
网络堆栈在设计上遵循模拟协议本身的分层体系结构。
回想一下,InternetProtocol(IP)是传输协议(通常称为传输控制协议或TCP)下面的核心网络层协议。
TCP上面是socket层,它是通过SCI进行调用的。
socket层是网络子系统的标准API,它为各种网络协议提供了一个用户接口。
从原始帧访问到IP协议数据单元(PDU),再到TCP和UserDatagramProtocol(UDP),socket层提供了一种标准化的
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Linux 内核 架构 工作 原理 详解