当前位置: 首页 > 科技观察

Linux概念架构理解

时间:2023-03-12 04:43:32 科技观察

摘要Linux内核的成功有两个原因:架构设计支持大量志愿开发者加入开发过程;每个子系统,尤其是那些需要改进的子系统,都支持良好的可扩展性。正是这两个原因,让Linux内核得以不断演进。一、Linux内核在整个计算机系统中的位置图1-计算机系统的分层结构分层结构的原理:子系统之间的依赖关系是自上而下的:靠近顶部的层依赖于较低的层,但靠近底部的子系统不依赖于较高层。此类子系统之间的依赖关系只能是自上而下的,即图中顶部的子系统依赖于底部的子系统,反之亦然。2、内核的作用Virtualization(抽象)将计算机硬件抽象成虚拟机,供用户进程(process)使用;进程在运行时,根本不需要知道硬件是如何工作的,只需要调用Linux内核提供的虚拟接口(virtualinterface)即可。多任务处理实际上是并行使用计算机硬件资源的多个任务。内核的任务是仲裁资源的使用,造成每个进程都认为自己是独占系统的错觉。PS:进程上下文切换就是替换程序状态字,替换页表基地址寄存器的内容,替换current指向的task_struct实例,替换PC-->同样替换进程打开的文件(通过可以找到task_struct的文件),替换了进程内存的执行空间(可以通过task_struct的mem找到);3.Linux内核总体架构Linux内核总体架构的中心系统是进程调度器(ProcessScheduler,SCHED):其余的所有子系统都依赖于进程调度器,因为其余的子系统都需要阻止和恢复进程。当进程需要等待硬件动作完成时,对应的子系统就会阻塞进程;当硬件动作完成后,子系统将恢复进程:阻塞和恢复动作都依赖于进程调度器来完成。上图中的每一个依赖箭头都有一个原因:进程调度器依赖于内存管理器(Memorymanager):当一个进程恢复执行时,需要依赖内存管理器为其运行分配内存。IPC子系统依赖于内存管理器:共享内存机制是一种进程间通信的方法,运行两个进程使用相同的共享内存空间进行信息传递。VFS依赖于网络接口(NetworkInterface):支持NFS网络文件系统;VFS依赖于内存管理器:支持ramdisk设备。换出到磁盘上的交换分区(swap),进入挂起状态。4、高度模块化的设计系统,有利于分工合作。很少有程序员需要跨多个模块工作,只有当当前系统依赖于另一个子系统时才会发生这种情况;硬件设备驱动程序、逻辑文件系统模块Modules)、网络设备驱动程序(networkdevicedrivers)和网络协议模块(networkprotocolmodules)这四个模块的可扩展性***。5、系统中的数据结构任务列表(TaskList)进程调度器为每个进程维护一个数据结构task_struct;所有进程由一个链表管理,形成一个任务列表;进程调度器还维护一个当前指针,指向当前占用CPU的进程。内存映射(MemoryMap)内存管理器存储了每个进程的虚拟地址到物理地址的映射;并且还提供了如何换出特定页面,或如何处理页面错误。这些信息存储在数据结构mm_struct中。每个进程都有一个mm_struct结构,在进程的task_struct结构中,有一个指针mm指向二级进程的mm_struct结构。mm_struct中有一个指针pgd,它指向进程的页目录表(即存放页目录首地址)-->当进程被调度时,这个指针被替换为一个物理地址并且写入控制寄存器CR3(x86架构Page基地址寄存器)I-nodesVFS通过inodes节点表示文件在磁盘上的映像,inodes用来记录文件的物理属性。每个进程都有一个files_struct结构,用来表示进程打开的文件,task_struct中有一个files指针。使用inode节点可以进行文件共享。共享文件有两种方式:(1)通过同一个系统打开文件,指向同一个inodes节点,发生在父子进程之间;(2)通过不同系统打开文件指向同一个inode节点,比如有硬链接;或两个不相关的指针打开同一个文件。数据连接内核中所有数据结构的根都在进程调度器维护的任务列表列表中。在系统中每个进程的数据结构task_struct中,都有一个指针mm指向它的内存映射信息;还有一个指针files指向它打开的文件(用户打开文件表);还有一个指针指向进程Character打开的网络套接字。六、子系统体系结构1.进程调度器(ProcessScheduler)体系结构(一)目标进程调度器是Linux内核中最重要的子系统。它被系统用来控制对CPU的访问——不仅是用户进程对CPU的访问,还有其他子系统对CPU的访问。(2)模块processscheduler调度策略模块(schedulingpolicymodule):决定哪个进程获得CPU的访问权;调度策略应该允许所有进程尽可能公平地共享CPU。架构专用模块设计了一套统一的抽象接口,屏蔽了特定架构接口芯片的硬件细节。该模块与CPU交互以阻止和恢复进程。这些操作包括获取每个进程需要保存的寄存器和状态信息,执行汇编代码完成阻塞或恢复操作。架构无关模块与调度策略模块交互以确定下一个要执行的进程,然后调用架构无关代码来恢复该进程的执行。不仅如此,该模块还会调用内存管理器的接口,确保被阻塞进程的内存映射信息被正确保存。系统调用接口模块(systemcallinterface)允许用户进程访问LinuxKernel显式暴露给用户进程的资源。通过一组定义明确的基本不变的接口(POSIX标准)将用户应用程序与Linux内核解耦,使用户进程不会受到内核变化的影响。(3)数据表示调度器维护一个数据结构——任务列表,其元素是每个活动进程的task_struct实例;该数据结构不仅包含用于阻止和恢复进程的信息,还包含其他计数和状态信息。该数据结构可在整个内核层中公开访问。(4)依赖关系、数据流和控制流前面提到,调度器需要调用内存管理器提供的函数,为需要恢复执行的进程选择合适的物理地址。正因为如此,进程调度器子系统依赖于内存管理子系统。当其他内核子系统需要等待硬件请求完成时,它们都依赖于进程调度子系统来阻塞和恢复进程。这种依赖性通过函数调用和对共享任务列表数据结构的访问来体现。所有内核子系统都读取或写入表示当前正在运行的进程的数据结构,从而形成贯穿整个系统的双向数据流。除了内核层的数据流和控制流,OS服务层还提供了为用户进程注册定时器的接口。这形成了调度程序对用户进程的控制流。通常唤醒休眠进程的用例不在正常控制流的范围内,因为用户进程无法预测何时会被唤醒。最后,调度器与CPU交互,阻塞和恢复进程,进而形成它们之间的数据流和控制流——CPU负责中断当前正在运行的进程,让内核调度其他进程运行。2.内存管理器(MemoryManager)架构(1)目标内存管理模块负责控制进程如何访问物理内存资源。进程虚拟内存和机器物理内存之间的映射由硬件内存管理系统(MMU)管理。每个进程都有自己独立的虚拟内存空间,所以两个进程可能有相同的虚拟地址,但实际上它们运行在不同的物理内存区域。MMU提供内存保护,使两个进程的物理内存空间不互相干扰。内存管理模块还支持交换——将暂时不用的内存页换出到磁盘上的交换分区。该技术使进程的虚拟地址空间大于物理内存的大小。虚拟地址空间的大小由机器字大小决定。(2)模块内存管理子系统架构特定的模块提供访问物理内存的虚拟接口;架构独立模块负责各个进程的地址映射和虚拟内存交换。当页面错误发生时,该模块负责决定将哪个内存页面换出内存——因为内存页面交换选择算法几乎不需要改变,所以这里没有建立独立的策略模块。系统调用接口(systemcallinterface)为用户进程提供了严格的访问接口(malloc和free;mmap和ummap)。该模块允许进程分配和释放内存,并执行内存映射文件操作。(3)Data表示内存管理存储了各个进程从虚拟内存到物理内存的映射信息。这个映射信息保存在mm_struct结构实例中,指向这个实例的指针保存在每个进程的task_struct中。除了存储映射信息外,数据块还应该存储有关内存管理器如何获取和存储页面的信息。例如:可执行代码可以存储可执行映像作为备份;但动态请求的数据必须备份到系统页面。(这个我不太明白,请高手解释一下?)***,内存管理模块还应该存储访问和技术信息,以保证系统的安全。(4)依赖关系、数据流和控制流内存管理器控制物理内存,当页面错误发生时接受硬件通知(页面错误中断)——这意味着内存管理模块和内存管理硬件存在双向的数据流和控制流它们之间。内存管理也依赖于文件系统来支持交换和内存映射I/O——这个需求意味着内存管理器需要调用提供给文件系统的函数接口(procedurecalls),在磁盘上存储内存页面并获取他们从磁盘。内存页。因为文件系统请求很慢,内存管理器使得进程在等待内存页被换入之前需要进入休眠——这个要求使得内存管理器调用进程调度器的接口。由于每个进程的内存映射都存储在进程调度程序的数据结构中,因此在内存管理器和进程调度程序之间也存在双向数据和控制流。用户进程可以创建新的进程地址空间并知道页面错误——这需要来自内存管理器的控制流。一般来说,用户进程没有数据流向内存管理器,但是用户进程可以通过select系统调用从内存管理器获取一些信息。3、虚拟文件系统(VirtualFileSystem)体系结构(1)目标虚拟文件系统为存储在硬件设备上的数据提供统一的访问接口。兼容不同的文件系统(ext2、ext4、ntf等)。计算机中几乎所有的硬件设备都由一个通用的设备驱动程序接口表示。逻辑文件系统有助于与其他操作系统标准兼容,并允许开发人员使用不同的策略来实现文件系统。虚拟文件系统更进一步,允许系统管理员在任何设备上安装任何逻辑文件系统。虚拟文件系统封装了物理设备和逻辑文件系统的细节,允许用户进程使用统一的接口访问文件。除了传统的文件系统目标之外,VFS还负责加载新的可执行文件。该任务由逻辑文件系统模块执行,它使Linux能够支持多种可执行文件。(2)模块虚拟文件系统模块设备驱动模块(DeviceIndependentInterface):提供所有设备的相同视图逻辑文件系统(logicalfilesystem):为每个支持的文件系统提供独立的系统接口(systemindependentinterface)提供接口这与硬件资源和逻辑文件系统无关。该模块通过块设备节点或字符设备节点提供所有资源。系统调用模块(系统调用接口)为用户进程提供对文件系统的统一控制访问。虚拟文件系统屏蔽了用户进程的所有特殊功能。(3)数据是指所有的文件都用inode来表示。每个inode记录了一个文件在硬件设备上的位置信息。不仅如此,inode还存储了指向逻辑文件系统模块和设备驱动程序的函数指针,可以执行特定的读写操作。通过以这种形式存储函数指针(即面向对象中虚函数的思想),特定的逻辑文件系统和设备驱动程序可以向内核注册自己,而不需要内核依赖特定的模块特性。(4)依赖关系、数据流和控制流一个特殊的设备驱动程序是ramdisk,它在主存中开辟一块区域,作为持久存储设备。这个设备驱动使用内存管理模块来完成任务,所以VFS和内存管理模块之间存在依赖关系(图中的依赖是反的,应该是VFS依赖内存管理模块),数据流和控制流。逻辑文件系统支持网络文件系统。此文件系统从另一台机器访问文件,就好像它们是本地文件一样。为实现此功能,逻辑文件系统通过网络子系统完成其任务——这引入了VFS对网络子系统的依赖性以及它们之间的控制和数据流。如前所述,内存管理器将VFS用于内存交换功能和内存映射I/O。另外,当VFS等待硬件请求完成时,VFS需要使用进程调度器来阻塞进程;当请求完成后,VFS需要通过进程调度器唤醒进程。***,系统调用接口允许用户进程调用访问数据。与之前的子系统不同,VFS不提供用户注册模糊调用的机制,因此不存在从VFS到用户进程的控制流。4、网络接口(NetworkInterface)架构(1)目标网络子系统使Linux系统能够通过网络连接到其他系统。该子系统支持多种硬件设备和多种网络协议。网络子系统屏蔽了硬件和协议的实现细节,抽象出一个简单易用的接口供用户进程和其他子系统使用——用户进程和其他子系统不需要知道硬件设备和协议的细节。(2)模块网络协议层模块图网络设备驱动程序(networkdevicedrivers)和设备独立接口模块(deviceindependentinterfacemodule)为所有硬件设备提供一致的访问接口,使得高层子系统不需要知道硬件的细节。网络协议模块(networkprotocolmodules)负责实现各个网络传输协议,如:TCP、UDP、IP、HTTP、ARP等~协议独立接口提供了独立于特定协议和特定硬件设备接口的一致性。这允许其余的内核子系统无需依赖特定协议或设备即可访问网络。系统调用接口模块(systemcallsinterface)规定了用户进程可以访问的网络编程API(3)数据表示每个网络对象都表示为一个套接字(socket)。套接字与进程相关联的方式与inode节点相同。套接字可以通过两个指向同一个套接字的task_structs被多个进程共享。(4)数据流、控制流和依赖当网络子系统需要等待硬件请求完成时,需要通过进程调度系统阻塞和唤醒进程——这就形成了网络子系统和进程调度之间的控制子系统流和数据流。不仅如此,虚拟文件??系统通过网络子系统实现了网络文件系统(NFS)——这就形成了VFS和网络子系统钉钉的数据流和控制流。七。结语1、Linux内核是整个Linux系统中的一层。从概念上讲,内核由五个主要子系统组成:进程调度程序模块、内存管理模块、虚拟文件系统、网络接口模块和进程间通信模块。这些模块通过函数调用和共享数据结构交换数据。2.Linux内核架构促成了他的成功。这种架构让大量的志愿开发者能够适当的分工合作,使得各个具体的模块易于扩展。可扩展性1:Linux架构通过一种数据抽象技术使这些子系统具有可扩展性——每个具体的硬件设备驱动程序都作为一个单独的模块实现,支持内核提供的统一接口。通过这种方式,各个开发人员可以将新的设备驱动程序添加到Linux内核中,而与其他内核开发人员的交互最少。可扩展性2:Linux内核支持许多不同的体系结构。在每个子系统中,架构相关的代码被分离出来,形成一个单独的模块。这样,当一些厂商推出自己的芯片时,他们的内核开发团队只需要在内核中重新实现机器相关的代码,就可以将内核移植到新的芯片上运行。参考文章:http://oss.org.cn/ossdocs/linux/kernel/a1/index.htmlhttp://www.cs.cmu.edu/afs/cs/project/able/www/paper_abstracts/intro_softarch。htmlhttp://www.cs.cmu.edu/afs/cs/project/able/www/paper_abstracts/intro_softarch.htmlhttp://www.fceia.unr.edu.ar/ingsoft/monroe00.pdf内核源代码:http://lxr.oss.org.cn/