操作系统知识点_用户编程接口

3、用户编程接口

函数调用和系统调用

  函数调用运行在用户空间,为程序员提供调用真正的幕后完成实际事务的是系统调用接口。系统函数是内核提供给应用程序的接口,属于系统的一部分。

函数调用:调用函数库中的一段程序或函数;与用户程序联系;在用户地址空间执行;运行时间属于“用户时间”;属于过程调用,系统开销小;

系统调用:各个系统的系统调用是不同的;调用系统的内核服务;是操作系统的入口点;在内核地址空间执行;“系统”时间;在用户和内核空间切换开销大;unix中有大约90个。如fork,write,brk chdir等

 

用户态和核心态

用户态:非特权态。访问受限。系统调用和中段可进入核心态。可靠性安全性要求低,维护简单。

核心态:特权态。拥有系统资源的状态。可以访问内存所有数据,内核数据结构,如进程表等。CPU可执行任何指令,可随意进入用户态。可靠性和安全性要求高,维护管理复杂。

切换过程:用户程序在用户态运行,但是有时候需要做一些内核态做的事情,程序就需要向操作系统请求执行这些操作,这时候就需要用户态切换到内核态。

 

用户栈和核心栈

  内核在创建进程时,会为进程创建相应的堆栈。每个进程会有两个栈:用户栈,存在于用户空间;核心栈,存在于内核空间。当进程运行在用户态,CPU堆栈指针寄存器里面的内容是用户栈的地址;当运行在核心态,则为核心栈地址。

  中断或系统调用,进程会陷入内核态。此时,进程使用的堆栈也要从用户栈转到内核栈。进程陷入内核态后,1、用户态堆栈地止保存在内核栈中;2、设置堆栈指针寄存器内容为内核堆栈地址。完成用户栈转向内核栈。进程从内核回到用户态时,吧内核栈中保存的用户堆栈地址恢复到堆栈指针寄存器即可。

注:当进程陷入内核时,内核栈保存进程在内核态运行的信息;当进程返回用户态时后,内核栈中保存的信息无效,会全部恢复。因此每次进程从用户陷入内核时得到的内核栈都是空的。所以在进程陷入和内核时,直接把内核栈的栈顶地址给堆栈指针寄存器就可以了。

 

静态链接与动态链接

  静态链接:把要调用的函数或过程放进exe文件中;相同调用时会多个拷贝。(.lib文件)

  动态链接:加入函数的描述信息(重定位信息)。运行时,简历程序与动态链接库的连接关系。(.dll文件)

 

 

 

 

  

posted @ 2017-04-10 22:22  糯米米一粒  阅读(429)  评论(0编辑  收藏  举报