程序员的自我修养: 系统调用的原理

一 特权级与中断

用户模式(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平台上正常运行.

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值