在学习Linux,关于Linux启动和进程的一点学习分享给大家。之后还会有一文为Linux虚拟文件系统VFS的学习分享。
Linux操作系统的启动过程和进程树的形成
图1.Linux引导过程
操作系统启动之前一定是BIOS(Basic Input-Output System)最先启动来引导,CPU硬件逻辑中,加电后会将CS置为0xF000、IP置为0xFFF0,也就是说PC中存入0xFFFF0( F000:FFF0H ),正是BIOS所在的位置。之后会进行 Power On Self Test 自检进行设备检查,最后开始引导启动Linux操作系统,真正有趣的就开始了。
BIOS由两部分组成:POST和Daemon运行时服务,BIOS按照硬件逻辑设计的顺序搜索处于活动状态并且可以引导的设备,设备可以是软盘、CD-ROM、网络上的某个设备,USB 闪存等等,通常Linux会从硬盘上的某个分区引导,其中有位于 0 道 0 柱面 1 扇区(即硬盘上第一个扇区(512Bytes/扇区))的MBR为主引导加载程序,当Linux从硬盘上被引导时,MBR被加载到RAM,然后BIOS将控制权交给MBR。
图2.MBR
MBR主引导加载程序从Partition分区表中查找可用的活动分区读入RAM并执行,作为次引导加载程序,主引导MBR和次引导可以分别称为第一阶段和第二阶段引导加载程序,次引导也是内核加载程序,用以加载 Linux 内核和初始 RAM 磁盘,这两个阶段的加载程序在x86中称为Linux Loader(LILO)或 GRand Unified Bootloader(GRUB)。将次阶段的引导加载程序加载到内存,就可以操作文件系统了,之后将内核映像和初始RAM磁盘initrd映像加载到内存中,LILO就将控制权交给了内核。
「initrd: 与内核绑定的,实际根文件系统可用之前挂载到系统中的一个初始根文件系统。https://www.ibm.com/developerworks/cn/linux/l-initrd.html」
内核映像不是一个可执行的内核,是一个压缩的内核映像(zImage),内核映像前面有一个程序,它控制内核解压和初始RAM磁盘initrd解压,并将其移入高端内存,然后此程序启动内核引导。
图3.Linux内核i386引导的主要函数流程
关于高端内存/低端内存。
来到了新的关键点,head.S这些汇编语言源程序用来初始化,之后的./init/main.c就是Linux内核的main函数!到这里,Linux启动后的第一个「用户空间进程(user-space process)」init(/sbin/init)诞生,这里也是进程树的起点,之后调度器就接管了控制权,任务交给了进程调度,通过下面所有的进程相关的算法和内容,一步步创建新的子进程,构建起进程树。
Linux进程的创建过程
fork(),of course.
Linux的进程状态和状态转换
Linux中进程有六种状态:
R,运行状态(Running/Runnable):在运行队列里,可能在运行也可能在等待。
S,睡眠状态(Sleeping):浅度睡眠,可以被中断。
D,磁盘睡眠状态(Disk sleep):深度睡眠,不可被中断,比如磁盘写入时。
T,停止状态/追踪停止状态(Stopped/tracing stop):通过SIGSTOP的signal信号停止进程,SIGCONT继续。
Z,僵尸状态(Zombie):进程在推出过程中资源全被收回,只剩task_struct空壳。
X,死亡状态(Dead):kernel⾥的do_exit()返回的状态,而不能在任务列表看到。
Linux操作系统中的几种典型的实际使用的进程调度方法
linux的调度程序由两个调度器组成:主调度器,周期性调度器(两者又统称为通用调度器(generic scheduler)或核心调度器(core scheduler)),主要有下面几种调度算法。
调度方法 | 描述 | 调度器类 |
---|---|---|
SCHED_NORMAL | 适用于普通进程 | CFS |
SCHED_BATCH | 采用分时策略,根据动态优先级(可用nice()API设置) | CFS |
SCHED_IDLE | 优先级最低,系统空闲时适用 | CFS-IDLE |
SCHED_FIFO | 先入先出,适用于实时进程 | RT |
SCHED_RR | 轮转,适用于实时进程 | RT |
SCHED_DEADLINE | 基于Earliest Deadline First (EDF) 调度算法 | DL |
小记
别的平台好像没事,markdown排好了版导进了csdn总会变难看,考虑换自己的网站了。
2023-10-29,回看时图片已经失效,原来是IBM的网站改组了。
从官网找了半天,比如搜linuxboot之类的都没搜到,用中文搜“Linux 引导过程在 20,000 英尺处的视图”反而搜到了一堆乱转载的文章。好吧,也算是侵权转载的一点贡献了。