# BIOS和主引导记录MBR

计算机有2种模式:实模式保护模式

  • 实模式:刚开机🔋。存取有1MB的空间,CPU单任务运行,寻址方式是段地址+偏移地址
  • 保护模式:操作系统接管后。寻址方式是段(32位)+偏移量(32位),段页式寻址方式,CPU多任务。

# 实模式

分为:基本内存显卡内存BIOS。其中BIOS分为:显示卡BIOS、IDE控制器BIOS、系统BIOS。

# 系统BIOS

下面介绍系统BIOS,它的功能有:

  • 系统启动配置
  • 基本的设备IO服务,采用中断方式实现
  • 加电自检(POST),初始化基本硬件(CPU、内存),不正常的时候,错误通过喇叭提示

对于加电自检的工作流程:按下PowerON/Reset,执行FFFF0处的指令,执行:JUMP POST;

# MBR/硬盘分区/格式化

每个分区的首扇区都非常重要(图中蓝色和绿色),关系如下图所示:

image-20190929162737042

# BIOS和MBR的程序运行过程

简单来说:POST -> CMOS -> MBR -> PBR。如下图所示。

image-20190929162938087

# 操作系统启动过程

定义:从加点开始到用户工作环境准备好的过程。分为初始引导、核心初始化、系统初始化。

# 1. 初始引导

目的:把os核心装入内存并使之开始接管计算机系统。

过程:

1. 加电,JUMP POST
2. BIOS中**启动程序**运行:
  	1. 读取MBR
  	2. 加载MBR中的**引导程序**
3. 引导程序:
	1. 根据参数,读取硬盘指定位置的文件装入内存
	2. 加载硬盘上的**OS内核**,初始化基本参数

# 2. 核心初始化

目的:OS内核初始化系统的核心数据。

例如:寄存器初始化、页表初始化、核心进程构建。

# 3. 系统初始化

目的:为用户使用系统作准备,是系统处于待命状态

例如:初始化文件系统、控制台、网络系统

# 用户界面的概念

定义:os提供给用户控制计算机的机制,又称用户接口

分类:操作界面、系统调用。

操作界面:图形用户接口(窗口、图标、鼠标)、键盘命令(普通命令、批处理程序、shell)

目前最常用的shell是BASH。

image-20190929205755683

# SHELL脚本编程

shell脚本由shell环境解释执行(不需编译)

执行脚本文件,需要具有可执行属性:chmod +x run.sh

执行脚本的时候,刚开始可以用 !#+shell绝对路径的方法来指定默认使用的shell。通过:cat /etc/shells 可以查看系统支持的所有shell,以及分别的绝对路径。

下面是输入读取的例子:

#!/bin/bash

# -n 读入字符个数;-p 提示文字;输入内容赋值给answer变量
read -n 1 -p "Enter your choice: " answer
echo 
# case-esac 结构
case $answer in
  Y|y)
    echo yes
    ;;
  N|n)
    echo no
    ;;
  *)
    echo "Please input Y or N"
  ;;
esac
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17

下面是if-else的例子:

#!/bin/bash

echo -n "Please input x,y: "
read x y
echo "x=$x, y=$y"
if (( x > y )); then
  echo "x is larger than y"
elif (( x == y)); then  
  echo "x is equal to y"
else 
  echo "x is less than y"
fi
1
2
3
4
5
6
7
8
9
10
11
12

# 系统调用

定义:操作系统内核,为应用程序提供的服务/函数。例如printf()exit()。这些函数是在内核空间实现的。

特点

- 一般涉及**核心资源**或**硬件**的操作;
- 运行于**核态**;
- 每个系统调用都有**对应的唯一的编号**;
- 会产生**自愿中断**

过程如下图所示。简单来说:调用->保护现场->编号查找入口地址->调用功能->恢复现场->结束中断。

image-20190930124542133

下面是一个c的实例代码:

#include <stdio.h>

int main(void) {
  printf("Hello World!\n");
  exit(0);
}
1
2
3
4
5
6

这段代码涉及到外设显卡(printf)、进程(exit)操作。在mac下,编译后的汇编代码部分如下:

## %bb.0:
	pushq	%rbp
	.cfi_def_cfa_offset 16
	.cfi_offset %rbp, -16
	movq	%rsp, %rbp
	.cfi_def_cfa_register %rbp
	subq	$16, %rsp
	movl	$0, -4(%rbp)
	leaq	L_.str(%rip), %rdi
	xorl	%eax, %eax
	movb	%al, %cl
	movl	%eax, -8(%rbp)          ## 4-byte Spill
	movb	%cl, %al
	callq	_printf
	movl	-8(%rbp), %edi          ## 4-byte Reload
	movl	%eax, -12(%rbp)         ## 4-byte Spill
	callq	_exit
	.cfi_endproc
                                        ## -- End function
	.section	__TEXT,__cstring,cstring_literals
L_.str:                                 ## @.str
	.asciz	"Hello World!\n"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22

其中,movl %eax, -8(%rbp)movl %eax, -12(%rbp)就是向eax寄存器中,指定系统调用号。通过callq进入系统调用,并且执行。