谈谈从库函数API和C代码中嵌入汇编两种方式来实现系统调用

    xiaoxiao2021-03-25  117

      程  序 原创作品转载请注明出处 《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000

            先来谈谈什么是系统调用,系统调用中涉及到三个概念,分别是系统调用,系统调用函数,系统调用表。

           系统调用:是通过软件中断向内核发送一个明确的请求,系统调用实现是在内核完成的,而用户态的函数的是在函数中实现的。系统调用的实质是函数调用,只是调用的函数是系统调用,处于内核态而已。用户在调用系统调用时会向内核传递一个系统调用号,然后系统调用处理程序通过此号从系统调用表中找到相应的内核函数执行,最后返回。可以说,操作系统为用户态进程与硬件设备进行交互提供了一组接口。

     

           系统调用号:在Linux3.16中有382个函数调用,加上自己写的这个,一共有383个系统调用,Linux为每一个系统调用定义了唯一的编号,叫做系统调用号。它定义在arch/arm/include/asm/unistd.h。

     

           系统调用表:为了将系统调用号和相应的服务例程结合起来内核利用了系统调用表,这个表放在sys_call_table数组中,它是一个函数指针,每一个函数指针都指向系统调用的封装例程。它定义在arch/arm/kernel/call.S中。

     

           熟悉了系统调用的三个概念,接下来我们用图来说明系统调用是怎么回事?本次选择getpid(void)这个函数来进行说明,getpid(void)是用来获取进程的id值的一个函数。使用系统调用方法有两种,一种是通过库函数API进行调用,另一种是C代码中嵌入汇编代码进行调用。同时,一个单独的API可能调用几个系统调用,不同的API可能调用了同一个系统调用。

           系统调用的工作流程如下图所示:首先,我们调用系统函数,然后系统函数中执行到int 0x80语句的时候进行陷入系统调用,然后在系统调用表中找到系统调用功能函数,执行完功能函数依次返回,然后中断结束。

           

                                                                                    图1.系统调用执行流程

              了解完系统调用的流程,我们来看下系统调用在直接调用和c语言嵌入汇编两种使用方法的具体操作,编写文件chengxu.c。

    #include <stdio.h> #include <unistd.h> int main(){ int volatile clanguage_id,emberred_id; clanguage_id = getpid(); printf("clanguage_id = %u\n",clanguage_id);//输出直接调用系统函数的进程id asm volatile( "movl $0,%
    转载请注明原文地址: https://ju.6miu.com/read-9549.html

    最新回复(0)