最近跟着Coursera学习操作系统,所以借着博客记录下学习过程:
操作系统如何启动?
答:点电源键就好(逃
但是作为程序员应该要了解底层实现
知识点:
①涉及到代码执行相关寄存器:计算机一加电下CS(代码段寄存器) = 0xf000,IR (指令指针) = fff0
②系统启动若在实模式下那么第一条指令地址即PC中的内容为:PC = CS << 4 + IR
③虽然X86有32位和64位,但是在实模式(x86为了兼容i8086CPU设定的一种16位模式,而且地址线只有20位。系统启动会自动转入实模式,16位表示数据宽度,也就是一次只能取2^16 = 64KB数据)下只有20位地址总线,这样一来寻址空间便只有 2 ^ 20 B = 1MB,即BIOS启动固件只能在内存0x00000 - 0xFFFFF(1MB)内容之内
④那在实模式下怎么用16位的段寄存器表示呢?
这就引出了分段的概念,8086CPU将1MB存储空间分成许多逻辑段,每个段最大限长为64KB(但不一定就是64KB)。这样每个存储单元就可以用“段基地址+段内偏移地址”表示。段基地址由16位段寄存器值左移4位(系统16位数据到20位地址)表达,段内偏移表示相对于某个段起始位置的偏移量
BIOS 启动固件(BIOS程序)包含了:
①基本输入输出程序:如可以从键盘读取用户的输入
②系统的设置信息:决定着是从硬盘启动,还是网络启动,还是光盘启动,还是USB启动
③开机自检程序:检查所需硬件的存在和状态
④系统自启动程序
BIOS会固化成计算机主板上程序其中包括系统设置,自检程序,系统自启动程序这些程序。
BIOS以中断调用的方式提供了基本I/O功能:
系统调用号 功能
INT 10H : 字符显示
INT 13H : 扇区读写
INT 15H : 内存检测
INT 16H : 键盘输入
在Intel X86系列CPU下,BIOS只能在实模式下访问
1.早期,计算机存储分成RAM和ROM,而ROM为只读,故BIOS程序就被刷在其中。
2.系统一加电BIOS程序被载入内存,Once video has been enabled,the BIOS displays its startup screen, which provides some key information about the BIOS as well as other system information(你为什么没看到?因为LENOVO把你遮住了)(下图为内存情况):
3.具体的计算机启动过程:
①:
系统加电,执行系统的BIOS程序(CS = 0xf000,IR = fff0:此处实际上是个jmp指令)内容为:
1.硬件自检(检测计算机硬件能否满足运行的基本条件):检测系统中内存和显卡等部件存在,查找并执行部件的接口卡的BIOS(初始化程序)进行设备初始化,如果硬件出现问题,主板会发出不同含义的蜂鸣,启动中止
2.系统自检:检测和配置系统中安装的即插即用设备(指在电脑上加上一个新的外部设备时,能自动侦测与配置系统的资源,而不需要重新配置或手动安装驱动程序,现代的“即插即用”一词又加上了热插拔的意义,允许用户在电源打开的状态下,直接新增或移除硬件设备,例如USB或IEEE 1394)
3.更新CMOS中扩展系统配置数据ESCD(用来知道当前系统有什么样的设备)
4.初始化完成后,BIOS需要把控制权给到下一个启动程序,这个“下一个启动程序”是由我们自己设定,可以从软硬盘,CD-ROM,USB等中选取。
②:
从上面启动顺序中的某个设备中加载第一块扇区到0x7c00,大小为512个字节,如果这个512个字节满足主引导记录格式(告诉计算机到硬盘的哪一个位置去找操作系统)
(1) 第0-446字节:主引导代码(机器码):
在CPU上电之后,若由硬盘启动,则BIOS将硬盘的主引导记录(位于0柱面、0磁道、1扇区)读入7C00处,然后将控制权交给主引导代码。主引导代码的任务包括:
扫描分区表,找到一个激活(可引导)分区;
找到激活分区的起始扇区;
将激活分区的引导扇区装载到内存0x7C00处;
Once the boot sector is found and its contents or data verified, the BIOS starts the process of booting the operating system by using the information in the boot sector. If this is a floppy disk boot sector, the information is read into memory at location 0000:7c00. INT 19 goes to memory location 0000:7c00 to continue the process. If no boot sector is found on the floppy drive, INT 19 moves to the next bootable drive in the list provided by the motherboard BIOS, usually a hard drive, and then attempts to read the MBR. If a Master Boot Record is found, it is read into memory at location 0000:7c00 and INT 19 jumps to memory location 0000:7c00 the same as was the case with the floppy. At this point, the BIOS attempts to move control of the computer from the BIOS to the actual operating system.
Next, the small program in the Master Boot Record will attempt to locate an active (bootable) partition in the hard drives partition table. If such a partition is found, the boot sector of that partition is also read into memory at location 0000:7C00 and then MBR program itself jumps to memory location 0000:7C00. Keep in mind that each operating system has its own boot sector format. The next step involves the small program in the boot sector locating the first part of the operating system's kernel loader program, or in some cases the kernel itself orperhaps a boot manager program(例如grub),
1.Primary Bootloader runs from MBR(grub中stage1代码在MBR中) and jumps to Secondary Bootloader.,the Primary Bootloader gives user a choice to select which operating system user wants,in any of the cases, due to small size of master boot record (512 bytes) the initial stage of any bootloader just contains basic information and leads to another sector(grub的stage2)2.Secondary Bootloaders(stage2) loads Operating System.and read then that into memory. For you Windows NT and Windows 2000 fans, this kernel loader is referred to as NTLDR. You will find a description of the DOS boot process here.
(2) 第447-510字节:分区表(Partition table)。
(3) 第511-512字节:主引导记录签名(0x55和0xAA)。
判断满不满足就看最后两字节是否为0x55和0xAA,如果不满足就把控制权给到下一个启动设备,再次读取它的第一个扇区看满不满足主引导记录格式。分区表的长度只有64个字节,里面又分成四项,每项16个字节。所以,一个硬盘最多只能分四个一级分区,又叫做"主分区"。
每个主分区16个字节,由6个部分组成:
(1) 第1个字节:如果为0x80,就表示该主分区是激活分区,控制权要转交给这个分区。四个主分区里面只能有一个是激活的。
(2) 第2-4个字节:主分区第一个扇区的物理位置(柱面、磁头、扇区号等等)。
(3) 第5个字节:主分区类型。
(4) 第6-8个字节:主分区最后一个扇区的物理位置。
(5) 第9-12字节:该主分区第一个扇区的逻辑地址。
(6) 第13-16字节:主分区的扇区总数。
③:
这时,计算机的控制权就要转交给硬盘的某个分区了
情况A:卷引导记录
四个主分区里面,只有一个是激活的。计算机会读取激活分区的第一个扇区,叫做"卷引导记录"(Volume boot record,缩写为VBR)。
"卷引导记录"的主要作用是,告诉计算机操作系统在这个分区里的位置。然后,计算机就会加载操作系统了。
情况B:扩展分区和逻辑分区
随着硬盘越来越大,四个主分区已经不够了,需要更多的分区。但是,分区表只有四项,因此规定有且仅有一个区可以被定义成"扩展分区"(Extended partition)。
所谓"扩展分区",就是指这个区里面又分成多个区。这种分区里面的分区,就叫做"逻辑分区"(logical partition)
计算机先读取扩展分区的第一个扇区,叫做"扩展引导记录"(Extended boot record,缩写为EBR),它里面也包含一张64字节的分区表,但是最多只有两项(也就是两个逻辑分区)。
计算机接着读取第二个逻辑分区的第一个扇区,再从里面的分区表中找到第三个逻辑分区的位置,以此类推,直到某个逻辑分区的分区表只包含它自身为止(即只有一个分区项)。因此,扩展分区可以包含无数个逻辑分区。
但是,似乎很少通过这种方式启动操作系统。如果操作系统确实安装在扩展分区,一般采用下一种方式启动。
情况C:启动管理器(boot loader)
在这种情况下,计算机执行完"主引导记录"前面446字节的机器码之后,不再把控制权转交给某一个分区,而是运行事先安装的"启动管理器"(boot loader),由用户选择启动哪一个操作系统。
Linux环境中,目前最流行的启动管理器是Grub。
到此OS启动完毕!!!
BIOS发展:
BISO-MBR(主引导记录) ----> BIOS-GPT(分区数量增多) ----> PXE(从网络上加载OS代码)
UEFI(统一可扩展固件接口)
X86处理器所有32位但是为了兼容仍保留16位的实模式,OS启动仍然回切到实模式启动,这样数据宽度和寻址范围就大大减小,之后就出现了UEFI(统一可扩展固件接口)可以在所有平台上提供一直的os启动服务。
Done!!!