一 特权级与中断
用户模式(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平台上正常运行.