一 特权级与中断
用户模式(user mode)和内核模式(kernel mode),也被称为用户态和内核态.
操作系统一般是通过中断来从用户态切换到内核态.
一般的过程如下:
User Mode execution -----+ Interruption occured Next instruction
| +
| | User Mode
________________________________________________________________________
| | Kernel Mode
| |
+ |
Interrupt Vector Table ------+ Interupt Handler
二 系统调用主要步骤
1. 触发中断
2. 切换堆栈
将当前栈由用户栈切换为内核栈的实际行为是:
1) 保存当前esp, ss值
2) 将esp,ss的值设置为内核栈的相应值
反过来, 将当前栈由内核栈切换为用户栈就是:
1) 保存当前esp, ss值
2) 将esp,ss的值设置为用户栈的相应值
CPU除了切入内核态之外,还会自动完成:
1) 找到当前进程的内核栈
2) 在内核栈中依次压入用户态的寄存器SS, ESP, EFLAGS, CS, EIP
三 windows API
1.调用过程
windows API是架构在系统调用(又称作系统服务System Service)之上的一层结构.
让程序只能调用API层的函数, 而不是如Linux一般直接使用系统调用.
windows下的C的fwrite调用路径如下:
PROGRAM: fwrite ->
CRT: write(Libcmt.lib msvcr990.dll) ->
API: NtWriteFile() (Kernel32.dll) -> Interrupt 0x2e(NTDLL.dll) ->
Kernel: IoWriteFile()(NtosKrnl.exe)
而在linux中,
PROGRAM: fwrite ->
CRT: write(Libc.a libc.so) ->
API: 无
Kernel: sys_write()(/vlinuxz)
2. 为什么要使用windows API
解决一些兼容性的问题.
理论上, 所有的应用程序都不用重新编译就可以在不同的windows平台上正常运行.
本文介绍了操作系统中用户态与内核态的概念及其切换原理,详细解释了通过中断实现状态切换的过程,并对比了Windows与Linux系统调用的不同实现方式。
573

被折叠的 条评论
为什么被折叠?



