Linux内核

Linux系统一般有4个主要部分:
内核、shell、文件系统和应用程序。内核、shell和文件系统一起形成了基本的操作系统结构,它们使得用户可以运行程序、管理文件并使用系统. 具体如下图:
Linux内核_第1张图片

内核(Kernel)是Linux系统的核心,控制着计算机系统上的所有硬件和软件,在需要的时候分配硬件和执行软件。

内核的基本功能

Linux的内核主要有以下几个功能:

  1. 系统内存管理
  2. 软件程序管理
  3. 硬件设备管理
  4. 文件系统管理

1. 系统内存管理

Kernel能管理计算机的硬件内存,也可以创建和管理虚拟内存。

虚拟内存:
计算机上的物理资源是有限的,当Linux系统中物理内存不足时,内核会将物理内存中暂时不用的空间写入一个虚拟的逻辑空间中,供程序使用,这样不用的物理空间就得到了释放,可以用于其他的用途;当需要使用到原始内容时,这些信息会被重新从虚拟逻辑空间读入物理内存中。这块虚拟出来的逻辑空间成为交换空间(swap space),是Linux内核内存管理的一大特点。
为了保证物理内存得到充分的利用,内核会将物理内存中不经常使用的数据块自动交换到交换空间中(这个过程称为换出,swapping out;相反的过程即称为换入),经常使用的数据块则保留在物理内存。内核不断地在交换空间和物理内存之间反复交换虚拟内存中的内容,使得系统以为它拥有比物理内存更多的可用内存。
当程序要访问一个被换出的内存时,内核必须从物理内存中换出另外一个内存给它让出空间,然后从交换空间中换入请求的内存部分。

内存分页
我们知道计算机中的数据都是以字节格式存储的,最小的存储单位是1B。

而在程序使用虚拟内存时,实际上是调用了虚拟内存的内存地址,它标记了虚拟内存空间所在的位置;当然,虚拟内存也维护这一个对应物理内存的映射,从而形成了一个内存地址映射表,程序调度虚拟内存地址时,通过映射表,最终能够找到物理内存。

如果程序的存储都是按照1B存储,那每读取1个B的数据,都需要在映射表中做一次运算,这样会大大降低程序的运行效率。为了避免这样的问题,Linux定义了默认的最小存储单元,即Linux内存的最小存储块,这个块成为页(Page)。Linux中一般会设置page的大小为4k,即4 x 1024 B,这样,Linux内存就是由无数个4k大小的页组成的,内存映射关系中记录的就是这些page的地址。内存交换的内存空间,也是按照page来交换的。

关于Linux中的内存管理,可以参考如下文章:

> Linux内存管理机制

2. 软件程序管理

系统运行中的程序成为进程,可以在前台运行(在屏幕上可见),也可以在后台运行(在屏幕上不可见)。内核控制和管理着系统中的所有进程。

内核创建了第一个进程(init进程)来启动系统上的其他进程。当内核启动时,它会将init进程加载到虚拟内存中;在启动其他进程时,也会在虚拟内存中给其分配一个专有区域来存储进程用到的代码和数据。
一些Linux发行版使用一个表来管理在系统开机时需要自动启动的进程,这个表通常位于专门文件/etc/inittab中。其他一些系统,如ubuntu/SUSE等则采用/etc/init.d/目录,将开机时启动或停止某个应用的脚本放在该目录下。这些脚本通过/etc/rcX.d目录下的入口(entry)启动,这里的X代表运行级(run level)。

Linux系统有7个运行级别(runlevel)
运行级别0:系统停机状态,系统默认运行级别不能设为0,否则不能正常启动;
运行级别1:单用户工作状态,root权限,用于系统维护,禁止远程登陆;
运行级别2:多用户状态(没有NFS)。NFS是网络文件系统的缩写,由Sun公司开发能够通过网络,使不同的机器、不同的操作系统 (主要是 Unix-like)进行彼此资料的共享,使用RPC协议进行资料传输管理);
运行级别3:完全的多用户状态(有NFS),登陆后进入控制台命令行模式;
运行级别4:系统未使用,保留;
运行级别5:X11控制台,登陆后进入图形GUI模式;
运行级别6:系统正常关闭并重启,默认运行级别不能设为6,否则不能正常启动;

运行级为1时,只启动基本的系统进程以及一个控制台的终端进程,成为单用户模式。通常是用于系统故障时进行的进击的文件系统维护,这种模式只允许1个系统管理员登录。
标准的启动运行级是3,大多数的应用软件,例如网络支持程序,都是运行在这个级别;另一个常见的运行级是5,在这个运行级上系统会启动图形化的X Windows系统,允许用户通过图形化桌面窗口登录系统。

3. 硬件设备管理

Linux对所有硬件的管理是在内核层完成的,完成该工作的程序称之为硬件驱动程序。驱动程序类似于应用程序和硬件设备之间的中间人,允许内核与设备之间交换数据。

内核中处理插入设备驱动代码的两种方法:

  • 编译进内核内部的设备驱动代码;
  • 可插入内核的设备驱动代码

Linux的内核是模块化的,它允许内核在运行时向其中插入代码或者从其中删除代码。这样就能够实现驱动代码插入到运行中的内核而无需重新编译内核,使得内核运行效率不会因此受到太大影响。

Linux系统中,硬件设备实际是被当做特殊的文件处理的,称为设备文件。设备文件分为三类

  • 字符型设备文件
    在处理数据时只能处理一个字符的设备,大多数类型的调制解调器、终端都是作为字符型设备创建的。
  • 块设备文件
    处理数据文件时,每次能处理大块数据的设备,例如硬盘。
  • 网络设备文件
    指采用数据包发送和接受数据的设备,包括各种网卡和一个特殊的会换设备,该特殊的回环设备允许Linux使用常见的网络编程协议同自身通信。

Linux为系统上的每个设备都创建一个称为“节点”的特殊文件,实现与各种设备的通信。内核使用唯一的数值对标记所有的节点,这个数值对包括一个主设备号和一个次设备号。类似的设备都会被划分到同样的主设备号下,次设备号则用于标记主设备组下的某个特定设备。

4. 文件系统管理

文件系统管理也是Linux内核管理的一大主要功能。Linux内核支持通过不同类型的文件系统从硬盘中读写数据,除了自己的文件系统外,还支持从其他系统采用的文件系统中读写数据。

Linux内核采用虚拟文件系统(Virtual File System,VFS)作为和每个文件系统交互的借口,这位Linux内核与其他类型文件系统通信提供了标准接口,当每个文件系统都被挂载和使用时,VFS会将信息都缓存在内存中。

Linux文件系统

/ | 虚拟目录的根目录,通常不会在这里存储文件。
/bin | 二进制目录,存放许多用户级的GNU工具。
/boot | 启动目录,存放启动文件。
/dev | 设备目录,Linux在这里创建设备节点
/etc | 系统配置文件目录
/home | 主目录,Linux在这里存放用户目录
/lib | 库目录,存放系统和应用程序的库文件
/media | 媒体目录,可移动媒体设备的常用挂载点
/mnt | 挂载目录,另一个可移动媒体设备的常用挂载点
/opt | 可选目录,长用于存放第三方软件包和数据文件
/proc | 进程目录,存放现有硬件及当前进程的相关信息
/root | root用户的主目录
/sbin | 系统二进制目录,存放许多GNU管理员级工具
/run | 运行目录,存放系统运作时的运行时数据
/srv | 服务目录,存放本地服务的相关文件
/sys | 系统目录,存放系统硬件信息的相关文件
/tmp | 临时目录,可以在该目录中创建和删除临时工作文件
/usr | 用户二进制目录,大量用户级的GNU工具和数据文件存储在这里
/var | 可变目录,用以存放经常变化的文件,比如日志文件

Linux内核_第2张图片

文件内容描述:

Linux内核_第3张图片

Linux文件系统更多内容,请参考Linux中国网站:
https://linux.cn/article-6132-1.html

你可能感兴趣的:(Linux)