当前位置: 技术问答>linux和unix
关于库函数和系统调用的区别
来源: 互联网 发布时间:2017-02-10
本文导语: 书上说;若干个库函数可以映射到一个系统调用入口点,比如exec有几种不同的调用方式,如execl 和execle,它们为同一系统调用提供不同接口。对于这些系统调用,它们的库函数对它们各自的参数加以处理,但最终的...
书上说;若干个库函数可以映射到一个系统调用入口点,比如exec有几种不同的调用方式,如execl 和execle,它们为同一系统调用提供不同接口。对于这些系统调用,它们的库函数对它们各自的参数加以处理,但最终的,这些库函数都映射到一个内核入口点。那到底什么是系统调用,什么是库函数。写程序时用的execl是系统调用还是库函数。这里面的库函数和C语言所说的库函数(如printf)有什么区别?我原以为像printf这样的称之为库函数而像creat,execl这样都叫做系统调用,好像这样理解不太正确,还有操作系统API又怎么界定,他属于系统调用还是系统调用的包装。
|
这个问题是这样的:
1. 首先,现在的OS内核主要采用两种模式,整体的单内核模式(linux)和分层的微内核模式(Windows)。单内核
模式的特点就是代码紧凑,执行速度快,各个模块之间是直接的调用关系,可以说最后一点既是优点,也是缺
点...有点就是执行速度快,缺点是内核看起来很乱,维护起来困难。
2. 无论是单内核,还是微内核,立体的体系结构从下到上大概都是分成这样几层:物理硬件,OS内核,OS服务,
应用程序。这四层结构中,OS内核起到一个“承上启下”的作用,向下管理物理硬件;向上为OS服务和应用程序
提供接口。主意,这里的接口实际上是指系统调用(System Call)。
3. 通常OS内核为了考虑实现起来的难度和易于管理,只提供少部分必要的系统调用,这些系统调用通常都是C和
汇编混编来实现的。接口用C定义,实现体用汇编来写。这样做的好处是,执行效率高,并且极大的方便了上层的
调用。
4. 再说库函数(即API)。库函数可以概括的分为两类,一类是随OS提供的,另一类是第三方的。随系统提供的库
函数进一步封装或组合系统调用,实现更多的功能,就像用C语言的许多功能单一的小函数来实现很多很多个功能
复杂的大函数一样。这样的API能够执行一些相对内核来说很复杂的操作,比如,read()函数根据参数,直接就
能读文件,而背后隐藏的比如文件在硬盘的哪个磁道,哪个扇区,加载到内存的哪个位置等等这些操作,程序员
是不必关心的,这些操作里面自然也包含了系统调用。而对于第三方的库,它其实和系统库一样,只是它直接利
用系统调用的可能性要小一些,而是利用系统提供的API接口来实现功能。(API的接口是开放的)
大概就这么多吧,想到哪写到哪,组织的也很凌乱,希望对楼主有帮助...
1. 首先,现在的OS内核主要采用两种模式,整体的单内核模式(linux)和分层的微内核模式(Windows)。单内核
模式的特点就是代码紧凑,执行速度快,各个模块之间是直接的调用关系,可以说最后一点既是优点,也是缺
点...有点就是执行速度快,缺点是内核看起来很乱,维护起来困难。
2. 无论是单内核,还是微内核,立体的体系结构从下到上大概都是分成这样几层:物理硬件,OS内核,OS服务,
应用程序。这四层结构中,OS内核起到一个“承上启下”的作用,向下管理物理硬件;向上为OS服务和应用程序
提供接口。主意,这里的接口实际上是指系统调用(System Call)。
3. 通常OS内核为了考虑实现起来的难度和易于管理,只提供少部分必要的系统调用,这些系统调用通常都是C和
汇编混编来实现的。接口用C定义,实现体用汇编来写。这样做的好处是,执行效率高,并且极大的方便了上层的
调用。
4. 再说库函数(即API)。库函数可以概括的分为两类,一类是随OS提供的,另一类是第三方的。随系统提供的库
函数进一步封装或组合系统调用,实现更多的功能,就像用C语言的许多功能单一的小函数来实现很多很多个功能
复杂的大函数一样。这样的API能够执行一些相对内核来说很复杂的操作,比如,read()函数根据参数,直接就
能读文件,而背后隐藏的比如文件在硬盘的哪个磁道,哪个扇区,加载到内存的哪个位置等等这些操作,程序员
是不必关心的,这些操作里面自然也包含了系统调用。而对于第三方的库,它其实和系统库一样,只是它直接利
用系统调用的可能性要小一些,而是利用系统提供的API接口来实现功能。(API的接口是开放的)
大概就这么多吧,想到哪写到哪,组织的也很凌乱,希望对楼主有帮助...
|
我的理解是:系统调用可以理解为内核提供给我们在用户态用的接口函数,可以认为是某种内核的库函数。
|
很多c函数库中的函数名与系统调用的名称一样是因为该函数本身其实就是调用的系统调用,放到c函数库就是为了用户态的使用
例如:
我自己定义一个系统调用sys_mycall,这个只能内核态调用,要在用户态编程使用时,需用函数_syscallN(N表示需要传给系统调用的参数个数)宏来将其声明,这样在我们自己的程序中就可以使用mycall函数了
写程序直接使用的是库函数,而库函数内部可能就是调用的同名系统调用,这样是否好理解一点?
例如:
我自己定义一个系统调用sys_mycall,这个只能内核态调用,要在用户态编程使用时,需用函数_syscallN(N表示需要传给系统调用的参数个数)宏来将其声明,这样在我们自己的程序中就可以使用mycall函数了
写程序直接使用的是库函数,而库函数内部可能就是调用的同名系统调用,这样是否好理解一点?