1.为什么用户程序不能直接访问系统内核模式提供的服务?
在linux中,将程序的运行空间分为内核与用户空间(内核态和用户态),在逻辑上它们之间是相互隔离的,因此用户程序不能访问内核数据,也无法使用内核函数。
2.系统调用:
系统功能调用是操作系统提供给程序设计人员的一种服务,系统调用非常精简,通常有两百多个,现在可能有三百个。
程序设计人员在编写程序时,可以利用系统调用来请求操作系统的服务。
系统调用实际上是内核中的一些函数,他们有各自对应的响应函数
sys_xxx
响应函数名以“sys_”开头,后跟该系统调用的名字。
例如
系统调用
fork()
的响应函数是sys_fork()
(见Kernel/fork.c
),
exit()
的响应函数是sys_exit()
(见kernel/fork.
)。
实际上,Linux中每个系统调用都有相应的系统调用号作为唯一的标识,内核维护一张系统调用表,sys_call_table,表中的元素是系统调用函数的起始地址,而系统调用号就是系统调用在调用表的偏移量。
系统调用就是一种特殊的接口。通过这个接口,用户可以访问内核空间。系统调用规定了用户进程进入内核的具体位置。
具体步骤:用户进程-->系统调用-->内核-->返回用户空间。
3.API
api 就是应用程序接口,是一些预定义的函数。跟内核没有必然的联系。API(Application Programming Interface)应用程序接口,是一些预先定义的函数,提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。
一个单独的API可能调用几个系统调用;
不同的API可能调用了同一个系统调用。
4.库函数
顾名思义是把函数放到库里,是把一些常用到的函数编完放到一个文件里,供别人用。别人用的时候把所在的文件名用#include<>加到里面就可以了,一般放到lib文件里。
库函数一般分为两类:
一种是C语言标准规定的库函数
一类是编译器特定的库函数
libc就是一个C标准库,里面放着一些基本的函数,这些函数都被标准化了。
事实上,系统调用所提供给用户的是直接而纯碎的高级服务,如果想要更加人性化,具有更符合特定情况的功能,那么就要我们用户自己定义,因此衍生了库函数,它把部分系统调用包装起来。
4.系统调用和库函数之间的联系与区别?
系统调用是应用程序与内核交互的接口。人们在长期的编程中发现使用系统函数有个重大的缺点,那就是程序的移植性。例如linux提供的系统调用的函数和windows就不一样。但是大部分的系统调用函数的速度库函数调用的速度要快。
库函数调用则是面向应用开发的,相当于应用程序的api,采用这样的方式有很多原因:
(1):双缓冲技术;
(2):移植性;
(3):底层调用本身存在的一些缺陷;
(4):让api也可以有了级别和专门的工作面向;
5.API和系统调用的区别?
API分为两种:
第一:用户级API
替用户写好函数,方便调用,使程序员可以将焦点放在设计程序逻辑上面,而不必再编写繁琐、重复的程序,不必关注技术的细节。例如VC++,MFC,VB等都是类库和各种控件,它代替了API的神秘功能,它不涉及硬件相关的操作。
第二:系统级API
如果应用程序想要和硬件交互,必须调用此类函数。程序员调用的是API(api函数),然后通过与系统调用共同完成函数的功能。因此,API是一个提供给应用程序的接口,一组函数,是与程序猿直接进行交互的。系统调用则不与程序员进行交互,它是根据API函数,通过一个软件中断机制向内核提交请求(trap指令类似于一个系统中断,系统也会有一个特殊的中断处理函数(interrupt handler)来处理用户的请求),以获得内核服务的接口。
并不是所有的API函数都一一对应一个系统的调用,有时,一个API函数会需要几个系统调用共同来完成函数的功能,甚至一些API函数不需要调用相应的系统调用,不需要内核提供的服务。
6.API和C标准库函数有什么区别?
由于内核中也有库函数,所以这里指的是用户空间的库函数
C标准库函数
C 库函数 是指 C 语言本身支持的一些基本函数,通常是汇编直接实现 的。
API函数
API函数是操作系统为方便用户设计应用程序而提供的实现特定功能的函数,API函数也是C语言的函数实现的。
区别
他们之间区别是:API函数是针对操作系统的,C语言运行时函数则是针对C语言本身的。C语言库函数是API的上层!
C库函数更加人性化
7.C运行库和C标准库的区别?
C标准库,顾名思义既然是标准,就是由标准组织制定的。是由“美国国家标准协会(American National Standards Institute,ANSI)”为了规范C语言库而制定的标准。在最初,各个大学各个公司使用的C语言库都不尽相同,造成相互移植非常困难,在这个背景下,制定了这个标准。
C运行库,是和平台相关的,即和操作系统相关的。它由不同操作系统不同开发平台提供不同的C运行库。
C运行时库函数是指C语言本身支持的一些基本函数,通常是汇编直接实现的。
但是C运行库的部分实现是基于C标准库的,即C运行库是各个操作系统各个开发工具根据自身平台开发的库,某种程度上,可以说C运行库是C标准库的一个扩展库,只是加了很多C标准库所没有的与平台相关的或者不相关的库接口函数。
举例子如:c标准库的strcpy函数负责字符串的拷贝,但是由于缺少对目地字符串缓冲区大小的控制,极有可能导致缓冲区溢出(大量的缓冲区溢出攻击都是由于这种漏洞而产生的);相反,Windows提供了能够实现同样功能的安全的字符串拷贝函数,减少了缓冲区攻击的可能,strcpy_s。这些函数是以c运行库的方式提供的,当然,不同的操作系统,c运行时库可能不同,但是对c标准库的支持是完全一致的,也就是说,在不同的操作系统上,使用同一个c标准库的函数必然产生一致的结果。