物理内存和虚拟内存;缓存IO和直接IO;作业调度算法;线程和进程;进程和线程的调度;线程的创建和结束;线程状态;线程间通信与线程同步机制;互斥锁和信号量;线程池;消费者和生产者;死锁;并发和并行。
一、操作系统启动
开机
程序放进内存里,IP指针指向它,取址执行。
IP指针
存放要执行的下一条指令的偏移地址
,内容可以强迫改写。
实模式
和保护模式
对应,实模式的寻址CS:IP(CS左移4位+IP),和保护模式不一样。
CS
段寄存器IP
指令指针寄存器(偏移)- BIOS 基本输入输出系统
- ROM掉电保存(硬盘)
- RAM掉电不保存(内存)
一个扇区512个字节,把磁盘0磁 道0扇区(引导扇区,引导扇区是操作系统中的第一段代码)读到内存 0x7c00 处。
bootset
引导扇区就是启动设备的第一个扇区
引导扇区代码:bootsect.s(汇编)
ds = 0x07c0
es = 0x9000 //段寄存器
si = 0
di = 0 //偏移
//段寄存器和偏移组成地址
ds + si 向左偏移四位 ->0x7c00
es + di 向左偏移四位 ->0x90000
移动256个字,512个字节
把都进来的代码从 0x7c00 移动到 0x90000
go赋给IP,INITSEG赋给CS 0x90000 + go
boot 0x90000 - 0x90200 (512字节)
跳转到setup CS置为0x9020,IP置为0
setup 0x90200 -
setup
上电时,操作系统在硬盘上,把代码放进内存才能取址执行,由第一段代码引导扇区bootsect.s完成,bootsect首先读入setup,打印logo,调用13号终端,把system部分读入。
0x90002存储了内存的大小
将整个操作系统从 0x9000 移动到 0 地址处
一开始从 0x7c00 移动到 0x90000 是为了预留出操作系统的空间
setup执行完,进入保护模式
jmpi 0,8
此时寻址方式发生改变 不再是CS<<4 + IP
CS IP 16位寄存器,最大寻址20位,即寻址能力1M。
而32位机寻址能力有4G,这种方式不能满足。
切换到新的寻址模式:16位->32位模式(保护模式)
mov ax,#0x0001 mov cr0,ax //将cr0最后一位置1
cr0
寄存器,最后一维PE置1,启动保护模式
CPU走另外一条解释执行指令的电路
CS
选择子,以前放的是地址,现在放的是查表的索引。段的基址放在表中,CS选择表中的项,取出基址,加上偏移IP。
gdt
全局描述符。
setup初始化表,每个表项有64位(8个字节)。
jmpi 0,8
CS = 8,查gdt表,8 就是 gtb 里的第二行,因为第一项有8个字节。
按照规则得到基址为 0x00000000,因此这一指令就是跳转到0地址处,即system模块 。
system
head.s 是system中第一个文件
执行32位汇编代码
head.s结束后进入main函数,死循环。
bootsect 将操作系统从磁盘上都进来
setup 获得参数、启动保护模式
head 初始化gdt表、页表
main 初始化
读入内存——初始化
二、操作系统接口
区分内核态
和用户态
:一种处理器“硬件设计”。
当前程序执行在什么态,由于CS:IP是当前指令,用CS的最低两位来表示:0是内核态,3是用户态
- 内核可以访问任何数据,用户态不能访问内核数据
DPL
目标内存段的特权级别
CPL
当前内存段的特权级别
硬件提供了“主动进入内核的方法”
中断指令int
- int指令将使CS中的CPL置为0,进入内核
- 这是用户程序发起的调用内核代码的唯一方式
系统调用的核心:
(1)用户程序中包含一段包含int指令的代码
(2)操作系统写中断处理,获取想调程序的编号
(3)操作系统根据编号执行相应代码