系统调用、API之间的关系(图)

系统调用、API之间的关系(图)

1.为什么用户程序不能直接访问系统内核模式提供的服务?

     在linux中,将程序的运行空间分为内核空间与用户空间(内核态和用户态),在逻辑上它们之间是相互隔离的,因此用户程序不能访问内核数据,也无法使用内核函数。当用户进程必须访问内核或使用某个内核函数时,就得使用系统调用(System Call)。在Linux中,系统调用是用户空间访问内核空间的唯一途径。

 

2.什么是系统调用?

答:系统调用就是一种特殊的接口。通过这个接口,用户可以访问内核空间。系统调用规定了用户进程进入内核的具体位置。

       系统调用是用户进程进入内核的接口层,它本身并非内核函数,但它是由内核函数实现,进入内核后,不同的系统调用会找到各自对应的内核函数,这些内核函数被称为系统调用的“服务例程”。比如系统调用getpid实际调用了服务例程为sys_getpid(),或者说系统调用getpid是服务例程sys_getpid()的“封装例程”。系统调用、API之间的关系(图)

       具体步骤:用户进程-->系统调用-->内核-->返回用户空间。

系统调用就是为了解决上述问题而引入的,是提供给用户的“特殊接口”。

    系统调用规定用户进程进入内核空间的具体位置。

   1.程序运行空间从用户空间进入内核空间。

   2.处理完后再返回用户空间。

 

3.什么是API

答:应用程序接口API(Application Programming Interface) ,是程序员在用户空间下可以直接使用的函数接口。是一些预定义的函数,比如常用的read()、malloc()、free()、abs()函数等,这些函数都具有一定功能,说明了如何获得一个给定的服务,跟内核没有必然的联系。提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

 

4.两者的区别。

答:区别:api是函数的定义,规定了这个函数的功能,跟内核无直接关系。而系统调用是通过中断向内核发请求,实现内核提供的某些服务。

      联系:程序员调用的是API(API函数),然后通过与系统调用共同完成函数的功能。   因此,API是一个提供给应用程序的接口,一组函数,是与程序员进行直接交互的。系统调用则不与程序员进行交互的,它是根据API函数,通过一个软中断机制向内核提交请求,以获取内核服务的接口。

         有时候,某些API所提供的功能会涉及到与内核空间进行交互。那么,这类API内部会封装系统调用。而不涉及与内核进行交互的API则不会封装系统调用。也就是说,API和系统调用并没有严格的一一对应关系,一个API可能恰好只对应一个系统调用,比如read()系统调用和read();一个API也可能由多个系统调用实现;有时候,一个API的功能可能并不需要内核提供的服务,那么此时这个API也就不需要任何的系统调用,比如abs()。另外,一个系统调用可能还被多个API内部调用。

       对于编程者来说系统调用和API都是一组函数,并无什么两样,二者关注的都是函数名、参数类型及返回值的含义但是事实上系统调用的实现是内核完成的,API则是在函数库中实现的

    例如:      在内核中实现了write系统调用。

                  在库函数中通过宏定义的方式实现write   API。可以在unistd.h中看到write到系统调用的转换。

       API是用户程序直接可以使用的函数接口,但如果每个操作系统都拥有只属于自己的API,那么应用程序的移植性将会很差。基于POSIX(Portable Operating System Interface)标准的API拥有很好的可移植性,它定义了一套POSIX兼容标准,这使得按这个标准实现的API可以在各种版本的UNIX中使用。现如今,它也可以在除UNIX之外的操作系统中使用,比如Linux,Windows NT等。

5、系统命令

       每一个系统命令其实就是一个可执行的程序,这些可执行程序的实现调用了某些系统调用。并且,这些可执行程序又分为普通用户可使用的命令和管理员可使用的命令。根据上述分类,普通用户可用的命令和管理可用的命令分别被存放于/bin和/sbin目录下。

6.内核函数

       内核函数和用户空间中函数并无两样,只不过内核函数是在内核中实现。虽然系统调用是用户进程进入内核的唯一途径,但是系统调用函数内部并不真正实现其功能,而是通过对内核函数的封装。也就是说,用户程序通过某个系统调用进入内核后,会接着去执行这个系统调用对应的内核函数。这个内核函数也称为系统调用的服务例程

       由于内核函数是在内核中实现的,因此它必须符合内核编程的规则,比如函数名以sys_开始,函数定义时候需加asmlinkage标识符等。

1.为什么用户程序不能直接访问系统内核模式提供的服务?

     在linux中,将程序的运行空间分为内核空间与用户空间(内核态和用户态),在逻辑上它们之间是相互隔离的,因此用户程序不能访问内核数据,也无法使用内核函数。当用户进程必须访问内核或使用某个内核函数时,就得使用系统调用(System Call)。在Linux中,系统调用是用户空间访问内核空间的唯一途径。

 

2.什么是系统调用?

答:系统调用就是一种特殊的接口。通过这个接口,用户可以访问内核空间。系统调用规定了用户进程进入内核的具体位置。

       系统调用是用户进程进入内核的接口层,它本身并非内核函数,但它是由内核函数实现,进入内核后,不同的系统调用会找到各自对应的内核函数,这些内核函数被称为系统调用的“服务例程”。比如系统调用getpid实际调用了服务例程为sys_getpid(),或者说系统调用getpid是服务例程sys_getpid()的“封装例程”。系统调用、API之间的关系(图)

       具体步骤:用户进程-->系统调用-->内核-->返回用户空间。

系统调用就是为了解决上述问题而引入的,是提供给用户的“特殊接口”。

    系统调用规定用户进程进入内核空间的具体位置。

   1.程序运行空间从用户空间进入内核空间。

   2.处理完后再返回用户空间。

 

3.什么是API

答:应用程序接口API(Application Programming Interface) ,是程序员在用户空间下可以直接使用的函数接口。是一些预定义的函数,比如常用的read()、malloc()、free()、abs()函数等,这些函数都具有一定功能,说明了如何获得一个给定的服务,跟内核没有必然的联系。提供应用程序与开发人员基于某软件或硬件的以访问一组例程的能力,而又无需访问源码,或理解内部工作机制的细节。

 

4.两者的区别。

答:区别:api是函数的定义,规定了这个函数的功能,跟内核无直接关系。而系统调用是通过中断向内核发请求,实现内核提供的某些服务。

      联系:程序员调用的是API(API函数),然后通过与系统调用共同完成函数的功能。   因此,API是一个提供给应用程序的接口,一组函数,是与程序员进行直接交互的。系统调用则不与程序员进行交互的,它是根据API函数,通过一个软中断机制向内核提交请求,以获取内核服务的接口。

         有时候,某些API所提供的功能会涉及到与内核空间进行交互。那么,这类API内部会封装系统调用。而不涉及与内核进行交互的API则不会封装系统调用。也就是说,API和系统调用并没有严格的一一对应关系,一个API可能恰好只对应一个系统调用,比如read()系统调用和read();一个API也可能由多个系统调用实现;有时候,一个API的功能可能并不需要内核提供的服务,那么此时这个API也就不需要任何的系统调用,比如abs()。另外,一个系统调用可能还被多个API内部调用。

       对于编程者来说系统调用和API都是一组函数,并无什么两样,二者关注的都是函数名、参数类型及返回值的含义但是事实上系统调用的实现是内核完成的,API则是在函数库中实现的

    例如:      在内核中实现了write系统调用。

                  在库函数中通过宏定义的方式实现write   API。可以在unistd.h中看到write到系统调用的转换。

       API是用户程序直接可以使用的函数接口,但如果每个操作系统都拥有只属于自己的API,那么应用程序的移植性将会很差。基于POSIX(Portable Operating System Interface)标准的API拥有很好的可移植性,它定义了一套POSIX兼容标准,这使得按这个标准实现的API可以在各种版本的UNIX中使用。现如今,它也可以在除UNIX之外的操作系统中使用,比如Linux,Windows NT等。

5、系统命令

       每一个系统命令其实就是一个可执行的程序,这些可执行程序的实现调用了某些系统调用。并且,这些可执行程序又分为普通用户可使用的命令和管理员可使用的命令。根据上述分类,普通用户可用的命令和管理可用的命令分别被存放于/bin和/sbin目录下。

6.内核函数

       内核函数和用户空间中函数并无两样,只不过内核函数是在内核中实现。虽然系统调用是用户进程进入内核的唯一途径,但是系统调用函数内部并不真正实现其功能,而是通过对内核函数的封装。也就是说,用户程序通过某个系统调用进入内核后,会接着去执行这个系统调用对应的内核函数。这个内核函数也称为系统调用的服务例程

       由于内核函数是在内核中实现的,因此它必须符合内核编程的规则,比如函数名以sys_开始,函数定义时候需加asmlinkage标识符等。