Linux内核—操作系统

Posted by 冷眼樵夫 on 01-21,2019

概述

计算机的基本原理是存储程序和程序控制。预先要把指挥计算机如何进行操作的指令序列(称为程序)和原始数据通过输入设备输送到计算机内存贮器中。每一条指令中明确规定了计算机从哪个地址取数,进行什么操作,然后送到什么地址去等步骤。计算机在运行时,先从内存中取出第一条指令,通过控制器的译码,按指令的要求,从存储器中取出数据进行指定的运算和逻辑操作等加工,然后再按地址把结果送到内存中去。接下来,再取出第二条指令,在控制器的指挥下完成规定操作。依此进行下去。直至遇到停止指令。

程序与数据一样存贮,按程序编排的顺序,一步一步地取出指令,自动地完成指令规定的操作是计算机最基本的工作原理。这一原理最初是由美籍匈牙利数学家冯.诺依曼于1945年提出来的,故称为冯.诺依曼原理。

在Richard Stevens的unix环境高级编程中这样定义“它控制计算机硬件资源,提供程序运行环境。一般而言我们称这种软件为内核(kernel),它相对较小,位于环境的中心”。总结下就是控制硬件,提供环境。程序员主要关心的是所谓的环境,主要说下提供什么环境。

操作系统都会想它们运行的程序提供各种服务,执行新的程序,打开文件,读文件,分配存储空间,获得当前时间等(一般通过系统调用)。广义上,操作系统还有内核外的系统调用,基于系统调用的shell(也是一种特殊的应用程序,为其他应用程序提供接口)和库函数(对系统调用的封装),和基于shell,系统调用,库函数(这三个东西基本组成了我们常用的环境)的应用软件。有图如下:
file

内核

其实,linux只是一个主要用c写的内核。

从不同的角度来看,内核担任的角色不同。从纯技术角度来看,内核只是软件和硬件的一个中间层,它把从软件发来的请求发送给硬件,完成寻址等操作,还充当了底层驱动。

从应用程序角度来看,内核是对硬件的一个高层次的抽象,应用程序与硬件没有联系,只与内核有联系,内核是应用程序知道的最底层。

从多个并发的进程的角度来看,内核是一个资源管理器,它完成对进程的切换,调度,共享计算机资源(CPU,内存,磁盘,网络等)。

还可以把内核看成一个库,通过系统调用向内核发送各种请求。

操作系统本质上来讲就是一个比较大的程序,由多个源文件和头文件编译连接而成。操作系统的主要功能就是操作设备平台的各个硬件,将使用设备的人和具体的硬件操作隔离开来,只留下操作接口供使用,这样使用者就不必直接操作硬件,避免了繁杂的工作量,只需要通过api接口来间接操作硬件。

内核结构

Linux 内核实现了很多重要的体系结构属性。在或高或低的层次上,内核被划分为多个子系统。Linux 也可以看作是一个整体,因为它会将所有这些基本服务都集成到内核中。这与微内核的体系结构不同,后者会提供一些基本的服务,例如通信、I/O、内存和进程管理,更具体的服务都是插入到微内核层中的。

内核有什么,最简单的就是直接看看内核源代码文件夹下有什么,一般内核文件在linux的目录/usr/src/kernels的文件夹下。

1.内存管理

裸机程序要使用内存,需要程序员自己去管理分配,这样容易造成已使用内存被覆盖、访问到不该访问的区域以及内存泄漏等致命问题,有了操作系统后,当任何进程需要使用到内存时,都要向操作系统申请、注册,再由操作系统统一分配、调度,操作系统清楚地知道哪些内存归哪个进程所有,哪些区域不允许被访问,这就极大地降低了内存覆盖、越权访问等问题,提高了整个系统的稳定性。
内核所管理的另外一个重要资源是内存。为了提高效率,如果由硬管理虚拟内存,内存是按照所谓的内存页 方式进行管理的(对于大部分体系结构来说都是 4KB)。Linux 包括了管理可用内存的方式,以及物理和虚拟映射所使用的硬件机制。
不过内存管理要管理的可不止 4KB缓冲区。Linux 提供了对 4KB缓冲区的抽象,例如 slab 分配器。这种内存管理模式使用 4KB缓冲区为基数,然后从中分配结构,并跟踪内存页使用情况,比如哪些内存页是满的,哪些页面没有完全使用,哪些页面为空。这样就允许该模式根据系统需要来动态调整内存使用。
为了支持多个用户使用内存,有时会出现可用内存被消耗光的情况。由于这个原因,页面可以移出内存并放入磁盘中。这个过程称为交换,因为页面会被从内存交换到硬盘上。内存管理的源代码可以在 ./linux/mm 中找到。
file

2.进程调度

操作系统允许多个进程进行宏观上的并行运行,即可以同时间段运行多个进程,通过操作系统的协调调度实现cpu的分时复用,以在各进程间来回切换执行,实现宏观上的并行。
进程管理的重点是进程的执行。在内核中,这些进程称为线程,代表了单独的处理器虚拟化(线程代码、数据、堆栈和 CPU寄存器)。在用户空间,通常使用进程 这个术语,不过 Linux 实现并没有区分这两个概念(进程和线程)。内核通过 SCI 提供了一个应用程序编程接口(API)来创建一个新进程(fork、exec 或 Portable Operating System Interface [POSⅨ] 函数),停止进程(kill、exit),并在它们之间进行通信和同步(signal 或者 POSⅨ 机制)。
进程管理还包括处理活动进程之间共享 CPU 的需求。内核实现了一种新型的调度算法,不管有多少个线程在竞争 CPU,这种算法都可以在固定时间内进行操作。这种算法就称为 O⑴ 调度程序,这个名字就表示它调度多个线程所使用的时间和调度一个线程所使用的时间是相同的。O⑴ 调度程序也可以支持多处理器(称为对称多处理器或 SMP)。您可以在 ./linux/kernel 中找到进程管理的源代码,在 ./linux/arch 中可以找到依赖于体系结构的源代码。

3.硬件设备管理

操作系统会去控制操作各个硬件设备,这样有了操作系统就不需要直接操作硬件了,而只需要通过API来调用操作系统中的硬件驱动程序来间接操作硬件。

4.虚拟文件系统

操作系统提供文件系统来帮助用户管理块存储设备。块存储设备是由一个个扇区组成的,对块设备操作要一扇区为单位,当没有操作系统时,就需要用户自己操作各个扇区来管理文件,有了操作系统后,用户就不必再去关注具体的扇区操作了,而是只需要关注文件名称以及文件存储于块设备的哪个区域。
虚拟文件系统(VFS)是 Linux 内核中非常有用的一个方面,因为它为文件系统提供了一个通用的接口抽象。VFS 在 SCI 和内核所支持的文件系统之间提供了一个交换层。
在 VFS 上面,是对诸如 open、close、read 和 write 之类的函数的一个通用 API 抽象。在 VFS 下面是文件系统抽象,它定义了上层函数的实现方式。它们是给定文件系统(超过 50 个)的插件。文件系统的源代码可以在 ./linux/fs 中找到。
文件系统层之下是缓冲区缓存,它为文件系统层提供了一个通用函数集(与具体文件系统无关)。这个缓存层通过将数据保留一段时间(或者随即预先读取数据以便在需要是就可用)优化了对物理设备的访问。缓冲区缓存之下是设备驱动程序,它实现了特定物理设备的接口。

5.系统调用接口

SCI 层提供了某些机制执行从用户空间到内核的函数调用。正如前面讨论的一样,这个接口依赖于体系结构,甚至在相同的处理器家族内也是如此。SCI 实际上是一个非常有用的函数调用多路复用和多路分解服务。在 ./linux/kernel 中您可以找到 SCI 的实现,并在 ./linux/arch 中找到依赖于体系结构的部分。

模块化

Linux操作系统最重要的一个特点就是:实现了模块化。

所谓模块化,也就是说linux操作系统的各个功能模块之间的关系是相互独立的松耦合形式,相互之间没有通过全局变量来相互管理,甚至函数间的相互调用都很少,比如内存管理模块就是用来管理内存用的,它和硬件驱动模块内有必要的联系,不至于硬件驱动发生了故障会导致内存管理模块也发生故障。模块化的最大好处就是可以实现内核功能的可裁剪,实现功能定制。

实现模块化的手段:

1.配置时可裁剪

Linux在配置时可以分为成千上万个功能模块,可以根据需要将想要的功能模块配置进去。

2.模块化编译和安装

linux实现了模块化的编译安装,可以将某些功能以模块的形式安装去系统,而不必使其成为内核的一部分,这样有利于功能模块的动态增减,实现动态升级。

3.选择性

在源码中使用条件编译来决定哪些模块需要被编译安装,哪些不需要。


0评论