博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Linux内核体系结构--1
阅读量:4094 次
发布时间:2019-05-25

本文共 2020 字,大约阅读时间需要 6 分钟。

操作系统内核的结构模式主要可分为整体式单内核模式和层次式的微内核模式。Linux 0.11内核,采用了单内核模式。单内核模式的主要优点是内核代码结构紧凑,执行速度块,不足之处主要是结构性不强。在单内核模式的系统中,操作系统提供的服务流程为:应用程序使用指定的参数值执行系统调用指令(int x80),是CPU从用户态切换到核心态,然后操作系统根据具体的参数值调用特定的系统调用服务程序,而这些服务程序则根据需要再调用底层的一些支持函数以完成特定的功能。在完成了应用程序所要求的服务后,操作系统又使CPU从核心态返回到用户态,从而返回到应用程序中继续执行后面的指令。Linux内核主要由5个模块构成,分别是:内核调度模块、内存管理模块、文件系统模块、进程间通信模块和网络接口模块。

这里写图片描述

进程调度模块用来负责控制进程对CPU资源的使用,采取的策略是各进程能够公平合理的访问CPU,同时保证内核能及时的执行硬件操作。内存管理模块用于确保所有进程能够安全的共享机器主内存区,同时,内存管理模块还支持虚拟内存管理方式,使得Linux支持进程使用比实际内存空间更多的内存容量。并可以利用文件系统把暂时不用的数据块交换到外部存储设备上去,当需要时再交换回来。文件喜用模块用于支持对外部设备的驱动和存储,虚拟文件系统通过向所有的外部存储设备提供一个通用的文件接口,隐藏了各种硬件设备的不同细节。从而提供并支持与其他操作系统兼容的多种文件系统格式。进程间通信子模块用于支持多种进程间的信息交换方式。网络接口模式提供对多种网络通信标准的访问并支持许多网络硬件。
所有的模块都与进程调度模块存在依赖关系,因为他们都需要进程调度程序来挂起(暂停)或重新运行他们的进程。
进程调度子系统需要使用内存管理来调整一特定进程所使用的物理内存空间。进程间通信子系统需要依靠内存管理器来支持共享内存通信机制,这种机制允许两个进程访问内存的同一个区域以进行进程间信息的交换。虚拟文件系统也会使用网络接口来支持网络文件系统(NFS),同样也能使用内存管理子系统提供内存虚拟盘(ramdisk)设备,而内存管理子系统也会使用文件系统来支持数据块的交换操作。
根据Linux 0.11内核源代码的结构将内核主要模块绘制成下图所示的框图结构。
这里写图片描述
这些模块还会一览内核中的通用资源,这些资源包括内核所有的子系统都会调用的内存分配和收回函数、打印警告或出错信息函数以及一些系统调试函数。
Linux内核对内存的管理和使用
在Linux 0.11内核中,为了有效的使用机器中的物理内存,在系统初始化阶段内存被划分成几个功能区域。
这里写图片描述
其中,Linux内核程序占据在物理内存开始的部分,接下来是供硬盘或软盘等块设备使用的高速缓冲区部分(其中要扣除显示卡内存和ROM BIOS所占用的内存地址范围640KB~1MB)。内存的最后部分是供所有程序可以随时申请和使用的主内存区,内核程序在使用主内存区时,首先要向内核内存管理管理模块提出申请,并在申请成功后才能使用。对于含有RAM虚拟盘的系统,主内存区头部还要划去一部分,供虚拟盘存放数据。
当一个进程需要读取块设备中的数据时,系统会首先把数据督导高速缓冲区中;当有数据需要写到块设备上去时,系统也是首先将数据放到高速缓冲区中,然后由块设备驱动程序写到相应的设备上。
Linux系统同时采用了内存分段和分页管理机制,来对系统中的内存进行有效的管理。
内存地址空间概念
首先,要分清3种地址以及他们之间的变换概念:a、程序(进程)虚拟和逻辑地址;b、CPU的线性地址;c、实际物理内存地址。
虚拟地址是指由程序产生的由段选择符和段内偏移地址两个部分组成的地址。
逻辑地址是指由程序产生的与段相关的地址偏移部分。应用程序员仅需与逻辑地址打交道,而分段和分页机制对他来说是完全透明的,仅由系统编程人员涉及。
线性地址是虚拟地址到物理地址变换之间的中间层,是处理器可寻址的内存空间(称为线性地址空间)中地址。
物理地址是指出现在CPU外部地址总线上的寻址物理内存的地址信号,是地址变换的最终结果。
虚拟存储(虚拟内存)是指计算机呈现出比实际拥有的内存大得多的内存量。在Linux 0.11内核中,给每个程序(进程)划分了总容量为64MB的虚拟内存空间,因此程序的逻辑地址范围为0x0000000~0x4000000。
CPU多任务和保护方式
Linux 0.11操作系统使用了CPU的0和3两个保护级,当一个任务(进程)执行系统调用而陷入内核代码中执行时,我们就称进程处于内核运行态(或简称为内核态),此时处理器处于特权级最高的(0级)内核代码中执行。当进程处于内核态时,执行的内核态代码会使用当前进程的内核栈,每个进程都有自己的内核栈。
当进程在执行用户自己的代码时,则称其处于用户运行态(用户态),即此时处理器在特权级最低的(3级)用户代码中运行。
这里写图片描述
后边会接着写。

你可能感兴趣的文章
【docker案例】项目打包部署
查看>>
elasticsearch的分布式特性
查看>>
logstash篇之入门与运行机制
查看>>
logstash篇之插件
查看>>
logstash篇之监控运维
查看>>
kibana
查看>>
saltstack基础
查看>>
saltstack使用
查看>>
saltstack API的使用
查看>>
kibana篇之数据探索Discover
查看>>
Linux共享文件夹之Samba的安装与配置
查看>>
Oracle VitualBox配置新建虚拟机与建盘
查看>>
C++中指针和引用的区别
查看>>
常用的html代码
查看>>
析构函数、虚析构函数、纯虚析构函数
查看>>
C++ explicit关键字详解
查看>>
pa_offset = offset & ~(sysconf(_SC_PAGE_SIZE) - 1) 详解
查看>>
Ubuntu 18.04单网卡多网段IP配置
查看>>
C10K C100K C1000K C10M select poll epoll
查看>>
I帧 P帧 B帧 DTS / PTS概念
查看>>