1.
并不是所有程序都是平等的,对于程序来说,不平等体现在资源的占有量,。
内核态就是访问资源多的状态,又称为特权态。
用户态就是访问资源受到限制的状态。
如果要访问操作系统的内核数据结构,如进程表,需要在内核态才能办到。
如果要访问用户程序里的数据,在用户态下就可以。
对于运行于内核态的程序,它的安全性和可靠性就要特别注意。
一个程序到底要设为内核态还是用户态,要考虑两方面的内容,效率与资源需求。因为内核态以访问的资源多,但用于维护管理(安全,资源等)比较复杂,效率就不高。
一般来说:
①程序如果在用户态可以运行,就应该让他处于用户态。
②对时序要求比较高的事情,应该在内核态做。
③CPU和内存管理应该在内核态进行。(安全)
④诊断和测试应该在内核态做,因为他需要访问计算机的所有资源。
⑤输入输出管理因为要访问各种的设备和底层数据结构,也必须在内核态实现。
也就是说我们一般从安全性和资源需求两方面考虑是否将程序放在内核态。
2.
那么计算机在运行一个程序时,他是怎样判断一个程序是内核态还是用户态的呢?
这需要依靠CPU状态位里的一个字位。
也就是说,内核态,用户态并不是程序的状态,而是处理器的一种状态。我们通过设置CPU状态位里的这一字位可以设置CPU的处理状态。
一个程序在运行时,CPU是什么态,这个程序就是什么态。
3.
地址翻译
用户态通过对每一条指令的地址翻译过程的控制来限制程序对资源的访问。
核心态跳过了地址翻译的过程直接执行指令。
3.
从系统调用表读取系统调用号
(1)当我们执行“int fd=open("a.txt")”;
(2)产生中断(中断的优先级比较高)(现场保护)(现场恢复)中断号0X80
(3)将中断号写到寄存器中。
(4)寄存器到内存中的系统调用表读取系统调用号,将需要的代码返回