3.1BIOS
计算机体系结构概述
cpu加电执行的第一条指令是在内存中,内存分成RAM随机访问存储,还有一个ROM只读存储,rom中还有一些原来写入的一些内容,这些内容系统初始化代码就从那里开始执行
启动时计算机内存和磁盘布局
加载程序的内存地址空间
加载程序读操作系统,再把相应的控制权转到读进来的操作系统内核代码上,操作系统就可以开始运行的
BIOS系统调用 (提供功能)
■BIOS以中断调用的方式 提供了基本的I/O功能
INT 10h:字符显示
INT 13h:磁盘扇区读写
INT 15h:检测内存大小
INT 16h:键盘输入
■只能在x86的实模式下访问(限制)
3.2系统启动流程
主引导记录着从哪个文件系统里去读加载程序,有了主引导记录之后,然后就进到当前哪个分区里面,分区里面又有一个分区的引导扇区,这个活动分区的引导扇区再来加载之前那个加载程序(BootLoader)
CPU初始化
CPU初始化之后,根据代码段段寄存器和当前指令指针寄存器这两个的内容,算出来它的第一条指令在内存当中的什么地方
■CPU加电稳定后从0XFFFF0读第一条指令
CS:IP = 0xf000:fff0
第一条指令是跳转指令
■CPU初始状态为16位实模式
CS:IP是16位寄存器
指令指针PC = 16*CS+IP
最大地址空间是1MB(因为是20为的地址)
BIOS初始化过程
■硬件自检POST
■检测系统中内存和显卡等关键部件的存在和工作状态
■查找并执行显卡等接口卡BIOS,进行设备初始化;(设备自身有初始化程序)
■执行系统BIOS,进行系统检测;
检测和配置系统中安装的即插即用设备;
■更新CMOS中的扩展系统配置数据ESCD(配置表,每次加电都会更新插入和拔出的卡)
■按指定启动顺序从软盘、硬盘或光驱启动(设置启动顺序来读进第一块扇区)
主引导记录MBR格式
■启动代码:(只有)446字节(因为分区的信息也要存在512字节中)
检查分区表正确性
加载并跳转到磁盘上的引导程序
■硬盘分区表:64字节
描述分区状态和位置
每个分区描述信息占据16字节
■结束标志字:2字节(55AA)
主引导记录的有效标志
分区引导扇区格式
■跳转指令:跳转到启动代码(cpu不一样,指令也是不一样的)
与平台相关代码
■文件卷头:文件系统描述信息
■启动代码:跳转到加载程序(存在硬盘上可以改动)
■结束标志:55AA
加载程序(bootloader)
配置文件,不同系统这个文件格式是不一样的,依据这个选择你启动的这种参数,比如说我是在正常启动,还是说我是在安全模式启动,还是说我是在一个调试状态下启动我的系统,那这些区别都会读出来之后,它导致我在加载内核的时候的一些内核会不一样,或者说我加载的时候的参数会不一样,依据配置去加载内核
系统启动规范
■BIOS
固化到计算机主板上的程序
包括系统设置、自检程序和系统自启动程序
BIOS-MBR、BIOS-GPT、PXE(GPT,全局唯一标识分区表,可以描述更多分区(四个以上))
■UEFI(统一可扩展固件接口)
接口标准
在所有平台上一致的操作系统启动服务
扩展:可信流
3.3中断、异常和系统调用比较
背景
■为什么需要中断、异常和系统调用
在计算机运行中,内核是被信任的第三方
只有内核可以执行特权指令
方便应用程序
■中断和异常希望解决的问题(用于解决意外的情况)
当外设连接计算机时,会出现什么现象?
当应用程序处理意想不到的行为时,会出现什么现象?
■系统调用希望解决的问题
用户应用程序是如何得到系统服务?
系统调用和功能调用的不同之处是什么?
内核的进入与退出
中断、异常和系统调用
■系统调用(system call)
应用程序主动向操作系统发出的服务请求
■异常(exception)
非法指令或者其他原因导致当前指令执行失败(如:内存出错)后的处理请求
■中断(hardware interrupt)
来自硬件设备的处理请求
中断可以满足应用程序,外部设备或者程序执行异常的服务请求
中断、异常和系统调用比较
■源头
中断:外设
异常:应用程序意想不到的行为(可能内部也可能外部)
系统调用:应用程序请求操作提供响应方式服务
■响应方式
中断:异步
异常:同步
系统调用:异步或同步
■处理机制
中断:持续,对用户应用程序是透明的
异常:杀死或者重新执行意想不到的应用程序指令
系统调用:等待和持续
中断处理机制
硬件处理
■在CPU初始化时设置中断使能标志
依据内部或外部事件设置中断标志
依据中断向量调用相应中断
服务例程
中断和异常处理机制
软件
现场保存(编译器)
中断服务处理(服务例程)
清除中断标记(服务例程)
现场恢复(编译器)
中断嵌套
■硬件中断服务例程可被打断
不同硬件中断源可能硬件中断处理时出现
硬件中断服务例程中需要临时禁止中断请求
中断请求会保持到CPU做出响应
■异常服务例程可被打断
异常服务例程执行时可能出现硬件中断
■异常服务例程可嵌套(异常中还可以出现异常)
异常服务例程可能出现缺页
3.4系统调用
■操作系统服务的编程接口
■通常由高级语言编写(C或者C++)
■程序访问通常是通过高层次的API接口而不是直接进行系统调用
■三种最常用的应用程序编程接口(API)
Win32 API用于Windows
POSIX API用于POSIX-based systems (包括UNIX,LINUX,Mac OS X的所有版本)
Java API用于JAVA虚拟机(JVM)
系统调用的实现
■每个系统调用对应一个系统调用号
·系统调用接口根据系统调用号来维护表的索引
■系统调用接口调用内核态中的系统调用功能实现,并返回系统调用的状态和结果
■用户不需要知道系统调用的实现
·需要设置调用参数和获取返回结果
·操作系统接口的细节大部分都隐藏在应用编程接口后
通过运行程序支持的库来管理
函数调用和系统调用的不同处
系统调用与函数调用的堆栈不一样,系统调用可以用特权操作
■系统调用
·INT和IRET指令用于系统调用
■系统调用时,堆栈切换和特权级的转换
■函数调用
·CALL和RET用于常规调用
常规调用时没有堆栈切换
中断、异常和系统调用的开销
■超过函数调用
■开销:
·引导机制
·建立内核堆栈
·验证参数(参数的有效性合法性是需要做验证的)
·内核态映射到用户态的地址空间
更新页面映射权限
·内核态独立地址空间(TLB)
系统调用示例
000pt;" � 2Ԅ��