操作系统接口就是系统调用的函数

POISX(Portable Operating System Interface of Unix)定义 fork、open 等系统函数

内核态与用户态

CS 的最低两位来表示:0 为内核态,3 为用户态。

执行时检查 CPL(Current Privilege Level)是否小于等于 DPL(Descriptor Privilege Level)

Tx5nos2QPzuUkF8

用户程序发起的调用核心代码的唯一方式就是中断指令 int0x80

​ 将 CS 中的 CPL 改为 0,“进入内核”

系统调用的核心:

  1. 用户程序中包含一段包含 int0x80 指令的代码
  2. 操作系统写中断处理,获取想调程序的编号
  3. 操作系统根据编号执行相应代码

多线程切换

核心是 Yield() 函数,用户主动实现不同线程栈的切换

lvkhMuXqTPdZ14m

1
2
3
4
void Yield() {
TCB2.esp = esp;
esp = TCB1.esp;
} // 执行完后弹栈,由于 esp 已经改为另一个进程的 esp ,弹栈后即可到另一线程的相应位置
1
2
3
4
5
6
void ThreadCreate(A) {
TCB *tcb = malloc();
*stack = mallocc();
*stack = A; // 100
tcb.esp = stack;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// 以浏览器分别加载文本和图片等数据为例
void WebExplorer() { // main()
ThreadCreate(GetData,URL,buffer);...
while(1) Yield();
}
void GetData(char *URL,char *p) {
连接URL;下载;Yield();...
}
void ThreadCreate(func,argl) {
申请栈;申请TCB;func等入栈;关联CB与栈;..
}
void Yield() {
压入现场;esp放在当前TCB 中;
Next();从下个rcB取出esp;弹栈切换线程;
}