1、库函数和系统调用
库函数调用是语言或应用程序的一部分,完全运行在用户空间,为程序员提供调用真正的在幕后完成实际事务的系统调用接口。而系统调用是内核提供给应用程序的接口,属于系统的一部分。库函数调用的是语言或应用程序的一部分,而系统调用是操作系统的一部分。
库函数调用通常比行内展开的代码慢,因为它需要付出函数调用的开端。但系统调用比库函数调用还要慢很多,因为它需要把上下文环境切换到内核模式。
2、静态链接和动态链接
静态链接:指把要调用的函数或者过程直接连接到可执行文件中,成为可执行文件的一部分,该可执行文件包含了运行时所需的全部代码。
静态链接的缺点是当多个程序都调用相同函数时,内存中就会存在这个函数的多个拷贝,这样就浪费了内存资源。
优点是静态链接的执行程序能够在其他同类操作系统的机器上直接运行。
动态链接:它所调用的函数代码并没有拷贝到应用程序的可执行文件中去,而是仅仅在其中加入了所调用函数的描述信息(往往是一些重定位信息)。仅当应用程序被装入内存开始运行时,在操作系统的管理下,才在应用程序与相应的动态链接库(DLL)之间建立链接关系。当要执行所调用DLL中的函数时,根据链接产生重定位信息,操作系统才转去执行DLL中相应的函数代码。
3、静态链接库和动态链接库
静态链接库就是使用.lib文件,静态链接的可执行文件一般比较大一些。
动态链接库是一个包含可由多个程序同时使用的代码和数据的库,它包含函数和数据的模块的集合。程序文件在运行时将所需的模块映射到调用进程的地址空间。
4、用户态和核心态
核心态与用户态是操作系统的两种运行级别,它用于区分不同程序的不同权利。
核心态:就是拥有资源多的状态,或者说访问资源多的状态,也称之为特权态。如果一个程序运行在特权态,则该程序就可以访问计算机的任何资源,资源访问权限不受限制。
用户态:非特权态,在这种状态下访问的资源将受到限制。一般程序一开始都是运行于用户态,当程序需要使用系统资源时,就必须通过调用软中断进入核心态。
一个程序到底应该运行在核心态还是用户态取决于其对资源和效率的需求。
5、用户栈与内核栈
用户栈存在于用户空间;内核栈存在于内核空间。
每次进程从用户态陷入内核的时候得到的内核栈都是空的,所以在进程陷入内核的时候,自己把内核栈的栈顶地址给堆栈指针寄存器就可以了。