Linux是一种免费使用和自由传播的类UNIX操作系统,其内核由Linus于1991年10月5日首次发布,它主要受到和Unix思想的启发。Linux目前作为当前最为流行的操作系统在之一,它的许多思想与设计都值得我们学习。
Linux中最重要的思想便是:一切都是文件。Linux将系统中所有对象都视作文件,包括命令、进程、硬件等等。那么对于用户而言,所有的操作都与文件操作类型,可以使用相同的API,极大地方便了用户使用。这种一切皆文件的思想也融入到Linux系统中的各个模块里。

一、进程调度模块
Linux以进程作为系统资源分配的基本单位,由进程调度算法协调各个进程使用处理机的时机。进程调度模块帮助组织多个进程的同时进行,从用户的角度,CPU仿佛同时在运行多个程序。
进程创建
在Linux环境编程时,一般采用fork()来创建新的进程,当然,那是在用户空间的函数,它会调用内核中的clone()系统调用,由clone()函数继续调用do_fork()完成进程的创建。PCB文件是用来表示进程存在的唯一标志。进程撤销:
进程终止后,需要通知内核以便内核释放进程所拥有的资源,包括内存、打开文件以及其他资源。进程终止的一般方式是调用exit()库函数,该函数释放C函数库所分配的资源,执行编程者所注册的每个函数,并结束从系统回收进程的那个系统调用。进程切换:
进程切换又称为任务切换、上下文切换。它是这样一种行为,为了控制进程的执行,内核挂起当前在CPU上运行的进程,并恢复以前挂起的某个进程的执行。在本质上,每个进程切换由两部分组成:切换页全局目录以安装一个新的地址空间;切换内核态堆栈和硬件上下文,因为硬件上下文提供了内核执行新进程所需要的所有信息,包括CPU寄存器。进程调度:
现代的Linux为分时共享系统,调度算法可以在固定时间内选中要运行的进程。首先,我们必须知道进程可以分为实时进程与普通进程。每个LInux进程总是按照如下的调度类型被调度:先进先出的实时进程、时间片轮转的实时进程、普通的分时进程。调度算法根据进程是普通进程还是实时进程而有很大不同。
二、内存管理模块
对任何一台计算机而言,其内存以及其它资源都是有限的。为了让有限的物理内存满足应用程序对内存的大需求量,Linux 采用了称为“虚拟内存”的内存管理方式。Linux 将内存划分为容易处理的“内存页”(对于大部分体系结构来说都是 4KB)。Linux 包括了管理可用内存的方式,以及物理和虚拟映射所使用的硬件机制。

进程可以在代码中直接使用虚拟地址,但虚拟地址终归是要转化到物理地址上的。为了将虚拟地址映射到物理地址上,Linux在内存中保存了进程的页表。 虚拟地址通过页表将虚拟地址转化为物理地址,每个进程都对应着一个页表虚拟空间 和 物理内存 都按照 4k 来分页,一个虚拟空间中的页和物理内存中页是 一一对应的。

三、文件系统模块
Linux 的文件系统模块采用先进的虚拟文件系统(VFS)技术,屏蔽了各种文件系统的差别,为处理各种不同的文件系统提供了统一的接口,支持多种不同的物理文件系统达90多种。同时,Linux把各种硬件设备看作一种特殊的文件来处理,用管理文件的方法管理设备,非常方便、有效。
举例来说,linux系统内有:存储器文件系统(FAT32、ext4),伪文件系统(/proc、/sys、/dev ),当然还有其它文件,如系统网络文件系统(nfs)等等。
因为每个文件系统的实现方式不同,不同的文件系统标准,就需要使用不同的逻辑来访问,这对外提供使用者来说是一种负担,不同系统的不同访问接口十分繁杂!
为了解决这种问题,linux提供了虚拟文件系统(Virtual File System,VFS),屏蔽了各种硬件上的差异以及具体实现的细节,向下为所有的硬件设备提供统一的接口,从而达到设备无关性的目的,向上文件管理系统还为应用层提供统一的API 接口;

为了更好的理解Linux操作系统,单纯的从总体结构上分析可能还稍显不足,为此我们可以下载linux内核,从源码层面进行修改、调试与分析,下面给出课程中实验的流程:
实验一:
下载Linux与补丁包

打补丁包

之后进行编译
make allnoconfig
make

启动qmue
sudo ln –s /usr/bin/qemu-system-i386 /usr/bin/qemu
qemu -kernel arch/x86/boot/bzImage
运行结果

实验二:
#安装编译相关依赖
sudo apt install libncurses5-dev libssl-dev bison flex libelf-dev openssl libc6-dev
#这里选择清华源
wget https://mirrors.tuna.tsinghua.edu.cn/kernel/v4.x/linux-4.5.tar.gz
#下载解压后配置编译选项,这里可以进行内核编译的各种配置
make menuconfig
#开始编译
make -j8
#安装qemu
sudo apt install qemu

#开启GDB调试
qemu-system-x86_64 \
-kernel ./arch/x86/boot/bzImage \
-initrd ./rootfs \
-append "root=/dev/ram rdinit=/helloworld" \
-smp 2 \
-s -S
gdb ./vmLinux
#以下进行调试
target remote:1234
b start_kernel
c
#同时在使用VS code打开时,还需要修改配置
{
// Use IntelliSense to learn about possible attributes.
// Hover to view descriptions of existing attributes.
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
"version": "0.2.0",
"configurations": [
{
"name": "gdb-kernel",
"type": "cppdbg",
"request": "launch",
"program": "${workspaceFolder}/vmlinux",
"args": [],
"stopAtEntry": false,
"cwd": "${workspaceFolder}",
"environment": [],
"externalConsole": false,
"MIMode": "gdb",
}
]
}
之后我们就可以使用VS code来调试了

参考资料:
深入理解计算机系统
操作系统概念
庖丁解牛Linux操作系统分析