代码改变世界

1.3 操作系统

2020-11-27 11:41  kuter  阅读(152)  评论(0)    收藏  举报

一、启动:

1、通电:从ROM(只读内存,即:BIOS芯片)中读取BIOS|UEFI引导程序,BISO程序执行硬件自检,读取CMOS中配置信息初始化

2、通过启动顺序优先级,把控制权交给排在第一位的储存设备,下一阶段执行程序,磁盘第一个扇区512byte(即:MBR):

  (1) 第1-446字节:调用操作系统的机器码。

  (2) 第447-510字节:分区表(Partition table)。

  (3) 第511-512字节:主引导记录签名(0x55和0xAA)。

  分区纪录表64byte(记录一个分区需要16byte);主引导记录签名(最后2byte,0x55和0xAA:这个设备可以用于启动)

记录一个分区16byte:

  (1) 第1个字节:如果为0x80,就表示该主分区是激活分区,控制权要转交给这个分区。四个主分区里面只能有一个是激活的。

  (2) 第2-4个字节:主分区第一个扇区的物理位置(柱面、磁头、扇区号等等)。

  (3) 第5个字节:主分区类型

  (4) 第6-8个字节:主分区最后一个扇区的物理位置。

  (5) 第9-12字节:该主分区第一个扇区的逻辑地址。

  (6) 第13-16字节:主分区的扇区总数。

3、MBR把计算机的控制权就要转交给硬盘的某个分区,这里又分成三种:

3.1 情况A:卷引导记录

上一节提到,四个主分区里面,只有一个是激活的。计算机会读取激活分区的第一个扇区,叫做"卷引导记录"(Volume boot record,缩写为VBR)。

"卷引导记录"的主要作用是,告诉计算机,操作系统在这个分区里的位置。然后,计算机就会加载操作系统了。

3.2 情况B:扩展分区和逻辑分区

随着硬盘越来越大,四个主分区已经不够了,需要更多的分区。但是,分区表只有四项,因此规定有且仅有一个区可以被定义成"扩展分区"(Extended partition)。

所谓"扩展分区",就是指这个区里面又分成多个区。这种分区里面的分区,就叫做"逻辑分区"(logical partition)。

计算机先读取扩展分区的第一个扇区,叫做"扩展引导记录"(Extended boot record,缩写为EBR)。它里面也包含一张64字节的分区表,但是最多只有两项(也就是两个逻辑分区)。

计算机接着读取第二个逻辑分区的第一个扇区,再从里面的分区表中找到第三个逻辑分区的位置,以此类推,直到某个逻辑分区的分区表只包含它自身为止(即只有一个分区项)。因此,扩展分区可以包含无数个逻辑分区。

但是,似乎很少通过这种方式启动操作系统。如果操作系统确实安装在扩展分区,一般采用下一种方式启动。

3.3 情况C:启动管理器

在这种情况下,计算机读取"主引导记录"前面446字节的机器码之后,不再把控制权转交给某一个分区,而是运行事先安装的"启动管理器"(boot loader),由用户选择启动哪一个操作系统。

Linux环境中,目前最流行的启动管理器是Grub

4、控制权转交给操作系统后,操作系统的内核首先被载入内存。

以Linux系统为例,先载入/boot目录下面的kernel。内核加载成功后,第一个运行的程序是/sbin/init。它根据配置文件(Debian系统是/etc/initab)产生init进程。这是Linux启动后的第一个进程,pid进程编号为1,其他进程都是它的后代。

然后,init线程加载系统的各个模块,比如窗口程序和网络程序,直至执行/bin/login程序,跳出登录界面,等待用户输入用户名和密码。

至此,全部启动过程完成。

引用http://www.ruanyifeng.com/blog/2013/02/booting.html

 

二、操作系统内核分类:

1、宏内核:

内存管理

cpu调度

文件系统

中断处理,设备驱动

应用管理,进程调度

2、微内核:进程调度,弹性部署,5G,loT

操作系统的用户态和内核态:

cpu分不同的指令级别:0-3

linux内核跑在ring0级,用户程序跑在ring3级,对于系统的关键访问,需要经过kernel同意,保证系统的w健壮性,linux内核执行的操作-->200多个系统调用

操作系统进程管理:

进程是操作系统用来分配资源的基本单位,每一个进程都有一个数据结构描述它,进程描述符(PDC:Process Control Block)。

进程和线程的区别:进程有自己的内存空间,线程共享进程的内存空间,执行调度的基本单位。

内核线程:内核自己的线程,内核独用的。

僵尸进程和独儿进程:

僵尸进程:父进程创建一个子进程,会维护子进程的pcb,子进程运行结束了,父进程没有释放子进程,就形成了僵尸进程。

独儿进程:父进程创建一个子进程,会维护子进程的pcb,子进程结束之前,父进程结束了,就形成了独儿进程。操作系统会默认为独儿进程,提供一个公共的父进程。

内核进程调度器决定运行哪个进程,时长等。

进程调度:抢占式和非抢占式。

非抢占式:除非进程主动让出cpu(yielding),否则将一直运行该进程;

抢占式:由进程调度器强制开始或暂停(抢占)某一进程的执行;

进程调度算法:2.6采用CFS(Completely Fair Schedule)完全公平调度策略;按优先级分配时间片的比例;记录每个进程的执行时间,如果有一个进程执行时间不到应该分配给它的比例,优先执行;