03.黑盒之中有什么
黑盒之中有什么
从抽象的角度来看,内核就是计算机资源的管理者,管理资源是为了让应用使用资源。
计算机中的资源分为两类:硬件资源、软件资源;
硬件资源有以下这些:
- 总线,负责连接各种其它设备,是其它设备工作的基础
- CPU。中央处理器,负责执行程序和处理数据运算。
- 内存。负责存储运行时的代码和数据
- 硬盘负责长久存储用户文件数据
- 网卡。负责计算机与计算机之间的通信
- 显卡。负责显示工作
- 各种IO设备,如显示器、打印机、键盘、鼠标
计算机结构图如下:
计算机中的软件资源,可以表示为计算机中各种形式的数据,如各种文件,软件资源。
内核作为硬件资源和软件资源的管理者,内部组成在逻辑上大致如下: - 管理CPU,由于CPU是执行程序的,而内核把运行时的程序抽象成进程,又称为进程管理
- 管理内存。由于程序和数据都要占用内存,内存是非常宝贵的资源,所以内核要非常小心地分配释放内存
- 管理硬盘。硬盘主要存放用户数据,而内核把用户数据抽象成文件 ,即管理文件,文件需要合理地组织,方便用户查找和读写,形成了文件系统。
- 管理显卡。负责显示信息,现在操作系统支持GUI(图形用户接口),管理显卡自然而然地就成了内核中的图形系统
- 管理网卡。网卡主要完成网络通信,网络通信需要各种通信协议,最后在内核中形成了网络协议栈,又称网络组件。
- 管理各种IO设备。
内核除了这些必要组件之外,根据功能不同还有安全组件等。各种计算机硬件的性能不同,硬件型号不同,硬件种类不同,硬件厂商不同,内核要想管理和控制这些硬件就要编写对应的代码,这样的代码称为驱动程序。
宏内核结构
宏内核结构就是把以上诸如管理进程的代码,管理内存代码、管理各种IO设备的代码、文件系统的代码、图形系统代码以及其它功能模块的代码,把这些所有的代码经过编译,最后链接在一起形成一个大的可执行程序。
宏内核结构
宏内核提供内存分配功能的服务过程,具体如下:
- 应用程序调用内存分配的API
- 处理器模式切换到特权模式,开始运行内核代码
- 内核里的内存管理代码按照特定的算法,分配一块内存
- 把分配的内存块的首地址、返回给内存分配的API函数
- 内存分配的API函数返回,处理器开始运行用户模式下的应用程序,应用程序就得到了一块内存的首地址,并且可以使用这块内存
宏内核结构的缺点:
没有模块化、没有扩展性、没有移植性、高度耦合在一起,一旦其中一个组件有漏洞,内核中的所有的组件都可能会出现问题。
唯一的优点就是性能好
微内核结构
微内核结构正好与宏内核结构相反,它提倡内核功能尽可能少:仅仅只有进程调度、处理中断、内存空间映射、进程间通信等功能。
开发者把实际的进程管理、内存管理、设备管理、文件管理等服务功能,做成一个个服务进程。和用户应用进程一样,它们很特殊,宏内核提供的功能在微内核架构里由这些服务进程专门负责完成。
微内核定义了一种良好的进程间通信的机制----消息。服务进程的编程模型就是循环处理来自其它进程的消息,完成相关服务的功能。
微内核分配内存的服务过程:
-
应用程序发送内存分配的消息,这个发送消息的函数微内核提供的,相当于系统API,微内核的API相当少,极端情况下只需要两个一个接收消息,一个发送消息。
-
处理器切换到特权模式,开始运行核代码
-
微内核代码让当前进程停止运行,并根据消息包中的数据,确定消息发送给谁,分配内存的消息当然是发送给内存管理服务进程。
-
内存管理服务进程收到消息,分配一块内存
-
内存管理服务进程,会通过消息的形式返回分配内存块的地址给内核,然后继续等下一条消息
-
微内核把包含内存块地址的消息发送给内存分配消息的应用程序。
-
处理器开始运行用户模式下的应用程序,应用程序就得到了一块内存的首地址,并且可以使用这块内存。
一来一去的消息和进程之间的切换开销大大影响了系统的性能。
但是微内核有很多优点,首先,系统结构相当清晰利于协作开发。其次,系统有良好的移植性,微内核代码量非常少,就算重写整个内核也不是难事。最后,微内核有相当好的伸缩性、扩展性,因为那些系统功能只是一个进程,可以随时拿掉一个服务进程以减少系统功能,或者增加几个服务进程以增强系统功能。
分离硬件的相关性
分层的主要目的和好处就是屏蔽底层细节,使上层开发更加简单。
计算机领域的一个基本方法是增加一个抽象层,从而使得抽象层的上下两层独立的发展,所以在内核内部再分若干层也不足为奇。
分离硬件的相关性就是把操作硬件和处理硬件功能差异的代码抽离出来,形成一个独立的软件抽象层,对外提供相应的接口方便上层开发。
选择
将操作系统内核分为三个大层:
- 内核接口层
- 内核功能层
- 内核硬件层
内核接口层,定义了一系列接口,主要有两点内容:
- 定义了一套UNIX接口的子集,
- 这套接口的代码,就是检查参数是否合法,如果参数有问题就返回相关的错误,接着调用下层完成功能的核心代码
- 内核功能层主要完成各种实际功能:
1.进程管理,主要实现进程的创建、销毁、调度进程
2.内存管理,在内核功能层只有内存池管理,分两种内存池:页面内存池和任意大小的内存池
3.中断管理,这个在内核功能层中非常简单,就是把一个中断回调函数安插到相关的数据结构中,一旦发生相关的中断就会调用这个函数。
4.设备管理,这个是最难的,需要用一些列的数据结构表示驱动程序模块,驱动程序本身、驱动程序创建的设备,最后把它们组织在一起,还要实现创建设备、销毁设备、访问设备的代码,这些代码最终会调用设备驱动程序,达到操作设备的目的。
内核硬件层,主要包括一个具体硬件平台相关的代码
1.初始化,初始化代码是内核被加载到内存中最先需要运行的代码,例如初始化少量的设备、CPU、内存、中断的控制、内核用于管理的数据结构等。
2.CPU控制,提供CPU模式设定、开、关中断、读写CPU特定寄存器等功能的代码。
3.中断处理。保存中断时机器的上下文,调用中断回调函数,操作中断控制器。
4.物理内存管理。提供分配、释放大块内存,内存空间映射,操作MMU\Cache
5.平台其它相关的功能,有些硬件平台上有些特殊的功能能,需要额外处理一下
同时,我们把文件系统、网络组件、其它功能组件作为虚拟设备交由设备管理,比如需要文件系统时就写一个文件系统虚拟设备的驱动,完成文件系统的功能,需要网络时就开发一个网络虚拟设备的驱动,完成网络功能。
04.震撼的Linux全景图
Linux五大重要组件
NT内核架构图
Darwi架构图