精华内容
下载资源
问答
  • 【Linux系统编程】Linux系统调用

    千次阅读 多人点赞 2019-09-22 20:52:34
    用户程序可以通过这组“特殊”接口来获得操作系统内核提供的服务,比如用户可以通过文件系统相关的调用请求系统打开文件、关闭文件或读写文件,可以通过时钟相关的系统调用获得系统时间或设置定时器等。 ...

    00. 目录

    01. 系统调用概述

    系统调用顾名思义,说的是操作系统提供给用户程序调用的一组“特殊”接口。用户程序可以通过这组“特殊”接口来获得操作系统内核提供的服务,比如用户可以通过文件系统相关的调用请求系统打开文件、关闭文件或读写文件,可以通过时钟相关的系统调用获得系统时间或设置定时器等。

    从逻辑上来说,系统调用可被看成是一个内核与用户空间程序交互的接口——它好比一个中间人,把用户进程的请求传达给内核,待内核把请求处理完毕后再将处理结果送回给用户空间。
    在这里插入图片描述

    系统服务之所以需要通过系统调用来提供给用户空间的根本原因是为了对系统进行“保护”,因为我们知道 Linux 的运行空间分为内核空间用户空间,它们各自运行在不同的级别中,逻辑上相互隔离。所以用户进程在通常情况下不允许访问内核数据,也无法使用内核函数,它们只能在用户空间操作用户数据,调用用户空间函数。比如我们熟悉的“hello world”程序(执行时)就是标准的用户空间进程,它使用的打印函数 printf 就属于用户空间函数,打印的字符“hello word”字符串也属于用户空间数据。

    但是很多情况下,用户进程需要获得系统服务(调用系统程序),这时就必须利用系统提供给用户的“特殊接口”——系统调用了,它的特殊性主要在于规定了用户进程进入内核的具体位置;换句话说,用户访问内核的路径是事先规定好的,只能从规定位置进入内核,而不准许肆意跳入内核。有了这样的陷入内核的统一访问路径限制才能保证内核安全无误。我们可以形象地描述这种机制:作为一个游客,你可以买票要求进入野生动物园,但你必须老老实实地坐在观光车上,按照规定的路线观光游览。当然,不准下车,因为那样太危险,不是让你丢掉小命,就是让你吓坏了野生动物。

    02. 系统调用实现

    系统调用是属于操作系统内核的一部分的,必须以某种方式提供给进程让它们去调用。CPU 可以在不同的特权级别下运行,而相应的操作系统也有不同的运行级别,用户态和内核态。运行在内核态的进程可以毫无限制的访问各种资源,而在用户态下的用户进程的各种操作都有着限制,比如不能随意的访问内存、不能开闭中断以及切换运行的特权级别。显然,属于内核的系统调用一定是运行在内核态下,但是如何切换到内核态呢?

    答案是软件中断。软件中断和我们常说的中断(硬件中断)不同之处在于,它是通过软件指令触发而并非外设引发的中断,也就是说,又是编程人员开发出的一种异常(该异常为正常的异常)。操作系统一般是通过软件中断从用户态切换到内核态。

    中断有两个重要的属性,中断号和中断处理程序。中断号用来标识不同的中断,不同的中断具有不同的中断处理程序。在操作系统内核中维护着一个中断向量表(Interrupt Vector Table),这个数组存储了所有中断处理程序的地址,而中断号就是相应中断在中断向量表中的偏移量。更多详细说明请看《系统调用的实现原理》。

    03. 系统调用和库函数的区别

    Linux 下对文件操作有两种方式:系统调用(system call)和库函数调用(Library functions)。

    库函数由两类函数组成:

    1) 不需要调用系统调用

    不需要切换到内核空间即可完成函数全部功能,并且将结果反馈给应用程序,如strcpy、bzero 等字符串操作函数。

    2)需要调用系统调用

    需要切换到内核空间,这类函数通过封装系统调用去实现相应功能,如 printf、fread等。

    在这里插入图片描述

    系统调用是需要时间的,程序中频繁的使用系统调用会降低程序的运行效率。当运行内核代码时,CPU工作在内核态,在系统调用发生前需要保存用户态的栈和内存环境,然后转入内核态工作。系统调用结束后,又要切换回用户态。这种环境的切换会消耗掉许多时间。

    库函数访问文件的时候根据需要,设置不同类型的缓冲区,从而减少了直接调用 IO 系统调用的次数,提高了访问效率。缓冲区详情请看《浅谈标准I/O缓冲区》。

    这个过程类似于快递员给某个区域(内核空间)送快递一样,快递员有两种方式送:

    1. 来一件快递就马上送到目的地,来一件送一件,这样导致来回走比较频繁(系统调用

    2. 等快递攒着差不多后(缓冲区),才一次性送到目的地(库函数调用

    04. 附录

    参考:【Linux】一步一步学Linux系统编程教程汇总

    展开全文
  • 系统调用

    千次阅读 2020-04-15 21:38:25
    系统调用是如何实现的呢? 这个系统叫什么名字也在内核里,而且系统函数也在内核里。既然内核里的函数也是函数,也在内存里,为什么上层应用不能直接去调用它呢? 不能,不能跳到内核里,否则就是程序调用了,而...

    操作系统全部笔记目录 见:操作系统笔记整理

    系统调用是如何实现的呢?

    这个系统叫什么名字也在内核里,而且系统函数也在内核里。既然内核里的函数也是函数,也在内存里,为什么上层应用不能直接去调用它呢?

    不能,不能跳到内核里,否则就是程序调用了,而不是内核调用。为什么不能呢?因为操作系统里有很多很重要的东西,一旦能随意访问,会有安全问题,比如密码可能就会泄露。

    不能jmp到内核程序是硬件决定的。操作系统把内存分为两个区域,内核段和用户段,对应两个态:内核态和用户态。处于用户态的程序不能进入内核态。

    DPL描述要访问的目标段的特权级,初始化的时候GDT表中的DPL就是0。

    CPL:当前的特权级,执行用户程序的时候表示,用户态的时候设置为3。

    在mov的时候,只有mov后的特权级大于或等于当前的特权级的时候,才会跳转。

    初始化操作系统的时候,建立gdt表,设置DPL为0。每次跳转的时候都要访问gdt表,所以当在用户态的时候,CPL=3,如果大于操作系统的DPL,则不会跳转到内核。

    那么如何进入内核执行内核程序呢?答案是通过中断。

    比如你调用了Open函数,用户程序产生了中断,操作系统处理中断,然后根据中断的类型去执行相应的调用。

    注意上图中的int 0x80,就会去进行中断,然后调用系统的相关函数。

    注意里面的

    type name(atype a, btype b, ctype c)

    把前面的参数带进来,表示为

    int write(int fd,char*……)

    =a"(__res):" 输出等于a,即把es置给 __res 

    然后后面的 __NR_##name 表示 mov __NR_write, %eax

    然后”b”((long)(a)),a是fd,把fd置给ebx。

    因为很多中断都是int 0x80,要想知道是哪个,就要靠这个系统调用号了。

    执行完以后,把es置给 __res,然后返回 __res ,最后返回write的返回值 int 。

    那么现在看一下int 0x80到底做了些什么:

    void sched_init(void) 就是系统初始化函数。里面要设置gate,即“中断处理门”,就是把上图底下那个表初始化好。

    _set_gate(&idt[n],15,3,addr); 第一个参数找到idt表索引80的位置,idt是一个全局的变量。15传到下面的type,3传到下面的dpl,addr就是system_call,movl %%eax,%1 就是把eax弄到为1的地方,即 “o”(*((char*)(gate_addr))),也就是地址的低四位。

    movl %%edx,%2就是把edx弄到为2的地方,即”o”(*(4+(char*)(gate_addr))),也就是地址的高四位。

    ”a”(0x00080000) 会把0008组装到 段选择符 这里,CS=0x0008,  IP = system_call,回想之前的 jmpi 0,8 ,8是gdt表的值,也就是去gdt表中找到内核代码段,然后偏移是system_call。CS=8,则相当于CS最后两位即CPL就是0,即当前特权级为0,所以执行内核代码。

    等执行完内核代码以后,DPL再重新置为3,我们就可以直接跳回用户态(DPL>=CPL则可以直接跳过去)。

    然后说明一下system_call要做什么事情:

    movl $0x10,%edx mov %dx,%ds mov %dx,%es //内核数据 执行完以后,dx和es都变为 0x10 了,表示是内核的数据段。

    现在的数据段代码段都是内核的,所以真正开始执行内核程序。

    call _sys_call_table(,%eax,4) eax是 __NR_write ,即_sys_call_table+4*%eax就是相应系统调用处理函数入口,这里的4表示每个系统调用占4个字节。

    可以看到sys_write正好是第四个。

    整体流程如下:

    展开全文
  • Linux系统编程——Linux系统调用

    千次阅读 多人点赞 2015-04-17 20:40:33
    系统调用概述 系统调用,顾名思义,说的是操作系统提供给用户程序调用的一组“特殊”接口。用户程序可以通过这组“特殊”接口来获得操作系统内核提供的服务,比如用户可以通过文件系统相关的调用请求系统打开文件、...

    系统调用概述

    系统调用,顾名思义,说的是操作系统提供给用户程序调用的一组“特殊”接口。用户程序可以通过这组“特殊”接口来获得操作系统内核提供的服务,比如用户可以通过文件系统相关的调用请求系统打开文件、关闭文件或读写文件,可以通过时钟相关的系统调用获得系统时间或设置定时器等。


    从逻辑上来说,系统调用可被看成是一个内核与用户空间程序交互的接口——它好比一个中间人,把用户进程的请求传达给内核,待内核把请求处理完毕后再将处理结果送回给用户空间。


    系统服务之所以需要通过系统调用来提供给用户空间的根本原因是为了对系统进行“保护”,因为我们知道 Linux 的运行空间分为内核空间用户空间,它们各自运行在不同的级别中,逻辑上相互隔离。所以用户进程在通常情况下不允许访问内核数据,也无法使用内核函数,它们只能在用户空间操作用户数据,调用用户空间函数。比如我们熟悉的“hello world”程序(执行时)就是标准的用户空间进程,它使用的打印函数 printf 就属于用户空间函数,打印的字符“hello word”字符串也属于用户空间数据。

    但是很多情况下,用户进程需要获得系统服务(调用系统程序),这时就必须利用系统提供给用户的“特殊接口”——系统调用了,它的特殊性主要在于规定了用户进程进入内核的具体位置;换句话说,用户访问内核的路径是事先规定好的,只能从规定位置进入内核,而不准许肆意跳入内核。有了这样的陷入内核的统一访问路径限制才能保证内核安全无误。我们可以形象地描述这种机制:作为一个游客,你可以买票要求进入野生动物园,但你必须老老实实地坐在观光车上,按照规定的路线观光游览。当然,不准下车,因为那样太危险,不是让你丢掉小命,就是让你吓坏了野生动物。


    系统调用的实现

    系统调用是属于操作系统内核的一部分的,必须以某种方式提供给进程让它们去调用。CPU 可以在不同的特权级别下运行,而相应的操作系统也有不同的运行级别,用户态和内核态。运行在内核态的进程可以毫无限制的访问各种资源,而在用户态下的用户进程的各种操作都有着限制,比如不能随意的访问内存、不能开闭中断以及切换运行的特权级别。显然,属于内核的系统调用一定是运行在内核态下,但是如何切换到内核态呢


    答案是软件中断。软件中断和我们常说的中断(硬件中断)不同之处在于,它是通过软件指令触发而并非外设引发的中断,也就是说,又是编程人员开发出的一种异常(该异常为正常的异常)。操作系统一般是通过软件中断从用户态切换到内核态。
            

    中断有两个重要的属性,中断号和中断处理程序。中断号用来标识不同的中断,不同的中断具有不同的中断处理程序。在操作系统内核中维护着一个中断向量表(Interrupt Vector Table),这个数组存储了所有中断处理程序的地址,而中断号就是相应中断在中断向量表中的偏移量。更多详细说明请看《系统调用的实现原理》


    系统调用和库函数的区别

    Linux 下对文件操作有两种方式:系统调用(system call)和库函数调用(Library functions)。


    库函数由两类函数组成:

    1)不需要调用系统调用

    不需要切换到内核空间即可完成函数全部功能,并且将结果反馈给应用程序,如strcpy、bzero 等字符串操作函数。

    2)需要调用系统调用

    需要切换到内核空间,这类函数通过封装系统调用去实现相应功能,如 printf、fread等。



    系统调用是需要时间的,程序中频繁的使用系统调用会降低程序的运行效率。当运行内核代码时,CPU工作在内核态,在系统调用发生前需要保存用户态的栈和内存环境,然后转入内核态工作。系统调用结束后,又要切换回用户态。这种环境的切换会消耗掉许多时间。


    库函数访问文件的时候根据需要,设置不同类型的缓冲区,从而减少了直接调用 IO 系统调用的次数,提高了访问效率。缓冲区详情请看《浅谈标准I/O缓冲区》



    这个过程类似于快递员给某个区域(内核空间)送快递一样,快递员有两种方式送:

    1)来一件快递就马上送到目的地,来一件送一件,这样导致来回走比较频繁(系统调用

    2)等快递攒着差不多后(缓冲区),才一次性送到目的地(库函数调用


    资料参考:http://blog.csdn.net/orange_os

    展开全文
  • 系统调用、函数调用

    千次阅读 2015-04-16 08:43:23
    1、系统调用 操作系统的主要功能是为管理硬件资源和为应用程序开发人员提供良好的环境来使应用程序具有更好的兼容性,为了达到这个目的,内核提供一系列具备预定功能的多内核函数,通过一组称为系统调用(system ...

    1、系统调用

    操作系统的主要功能是为管理硬件资源和为应用程序开发人员提供良好的环境来使应用程序具有更好的兼容性,为了达到这个目的,

    内核提供一系列具备预定功能的多内核函数,通过一组称为系统调用(system call)的接口呈现给用户。系统调用把应用程序的请求

    传给内核,调用相应的的内核函数完成所需的处理,将处理结果返回给应用程序。

    现代的操作系统通常都具有多任务处理的功能,通常靠进程来实现。由于操作系统快速的在每个进程间切换执行,所以一切看起来就

    会像是同时的。同时这也带来了很多安全问题,例如,一个进程可以轻易的修改进程的内存空间中的数据来使另一个进程异常或达到

    一些目的,因此操作系统必须保证每一个进程都能安全的执行。这一问题的解决方法是在处理器中加入基址寄存器界限寄存器。这

    两个寄存器中的内容用硬件限制了对储存器的存取指令所访问的储存器的地址。这样就可以在系统切换进程时写入这两个寄存器的内

    容到该进程被分配的地址范围,从而避免恶意软件。

    为了防止用户程序修改基址寄存器和界限寄存器中的内容来达到访问其他内存空间的目的,这两个寄存器必须通过一些特殊的指令来

    访问。通常,处理器设有两种模式:“用户模式”与“内核模式”,通过一个标签位来鉴别当前正处于什么模式。一些诸如修改基址寄存器

    内容的指令只有在内核模式中可以执行,而处于用户模式的时候硬件会直接跳过这个指令并继续执行下一个。

    同样,为了安全问题,一些I/O操作的指令都被限制在只有内核模式可以执行,因此操作系统有必要提供接口来为应用程序提供诸如读

    取磁盘某位置的数据的接口,这些接口就被称为系统调用

    当操作系统接收到系统调用请求后,会让处理器进入内核模式,从而执行诸如I/O操作,修改基址寄存器内容等指令,而当处理完系统

    调用内容后,操作系统会让处理器返回用户模式,来执行用户代码。

    2、系统调用原理

    操作系统中的状态分为管态(核心态)和目态(用户态)。特权指令:一类只能在核心态下运行而不能在用户态下运行的特殊指令。

    不同的操作系统特权指令会有所差异,但是一般来说主要是和硬件相关的一些指令。访管指令:本身是一条特殊的指令,但不是特权指令。

    (trap指令)。基本功能:“自愿进管”,能引起访管异常。

    用户程序只在用户态下运行,有时需要访问系统核心功能,这时通过系统调用接口使用系统调用。

    3、系统调用与过程(函数)调用的区别

    程序中执行系统调用或过程(函数)调用,虽然都是对某种功能或服务的需求,但两者从调用形式到具体实现都有很大区别。

    (1)调用形式不同。

    过程(函数)使用一般调用指令,其转向地址是固定不变的,包含在跳转语句中;但系统调用中不包含处理程序入口,而仅仅提供功能号,

    按功能号调用。

    (2)被调用代码的位置不同。

    过程(函数)调用是一种静态调用,调用者和被调用代码在同一程序内,经过连接编辑后作为目标代码的一部份。当过程(函数)升级或

    修改时,必须重新编译连结。而系统调用是一种动态调用,系统调用的处理代码在调用程序之外(在操作系统中),这样一来,系统调用

    处理代码升级或修改时,与调用程序无关。而且,调用程序的长度也大大缩短,减少了调用程序占用的存储空间。

    (3)提供方式不同。

    过程(函数)往往由编译系统提供,不同编译系统提供的过程(函数)可以不同;系统调用由操作系统提供,一旦操作系统设计好,

    系统调用的功能、种类与数量便固定不变了。

    (4)调用的实现不同。

    程序使用一般机器指令(跳转指令)来调用过程(函数),是在用户态运行的;程序执行系统调用,是通过中断机构来实现,需要从

    用户态转变到核心态,在管理状态执行,因此,安全性好。


    4、库函数调用与系统调用的区别

    函数库调用是语言或应用程序的一部分,而系统调用是操作系统的一部分。

    库函数调用通常比行内展开的代码慢,因为它需要付出函数调用的开销。但系统调用比库函数调用还要慢很多,因为它需要把上下文环

    境切换到内核模式。







    说明:本文内容来自百度百科,以及操作系统书中。


    展开全文
  • Linux系统调用

    千次阅读 2013-03-22 14:19:11
    系统调用意义 linux内核中设置了一组用于实现系统功能的子程序,称为系统调用系统调用和普通库函数调用非常相似,只是系统调用由操作系统核心提供,运行于核心态,而普通的函数调用由函数库或用户自己提供,...
  • 系统调用接口

    千次阅读 2018-11-27 09:53:59
    1、系统调用 操作系统作为系统软件,它的任务是为用户的应用程序提供良好的运行环境。因此,由操作系统内核提供一系列内核函数,通过一组称为系统调用的接口提供给用户使用。系统调用的作用是把应用程序的请求传递...
  • C++ 函数调用和系统调用的区别

    千次阅读 2018-02-06 10:59:27
     所谓系统调用就是用户在程序中调用操作系统所提供的一个子功能,也就是系统API,系统调用可以被看做特殊的公共子程序。系统中的各种共享资源都由操作系统统一掌管,因此在用户程序中,凡是与资源有关的操作(如...
  • read 系统调用剖析

    千次阅读 2015-11-20 17:27:37
    Read 系统调用在用户空间中的处理过程 Linux 系统调用(SCI,system call interface)的实现机制实际上是一个多路汇聚以及分解的过程,该汇聚点就是 0x80 中断这个入口点(X86 系统结构)。也就是说,所有系统调用...
  • 什么是系统调用? Linux内核中设置了一组用于实现各种系统功能的子程序,称为系统调用。用户可以通过系统调用命令在自己的应用程序中调用它们。从某种角度来看,系统调用和普通的函数调用非常相似。区别仅仅在于,...
  • 系统调用基本概念

    千次阅读 2016-01-18 16:17:37
    用户在调用系统调用时会向内核传递一个系统调用号,然后系统调用处理程序通过此号从系统调用表中找到相应的内核函数执行(系统调用服务例程),最后返回。 1.系统调用号 linux系统有几百个系统调用号,为了唯一的...
  • 本文将介绍Linux使用内核模块添加系统调用的方法(无需编译内核),思路就是修改映射在内存中的系统调用表,把一个空闲的系统调用表项指向自己写的模块中的函数,如果是已使用的项,甚至可以实现系统调用劫持。...
  • Linux系统添加系统调用

    千次阅读 2018-05-23 12:37:14
    参考链接:Ubuntu 16.10添加系统调用点击打开链接
  • 系统调用实现

    千次阅读 2016-01-20 11:51:20
    当用户态的进程调用一个系统调用时,CPU从用户态切换到内核态并开始执行一个内核函数。Linux通过由向量为128(0x80)的编程异常实现CPU由用户态到内核态的转换。 因为内核实现了许多不同的系统调用,为了区别他们,...
  • 用户地址空间和内核地址空间每个进程都会有一个固定大小的虚拟地址空间,大小较固定,视操作系统位数而...但每个程序又会因系统调用或中断而陷入内核执行内核的操作。为了安全,我们就把虚拟地址空间划分出一块独立的部
  • Linux系统调用解析

    千次阅读 2013-01-23 19:57:37
    什么是系统调用?  Linux内核中设置了一组用于实现各种系统功能的子程序,称为系统调用。用户可以通过系统调用命令在自己的应用程序中调用它们。从某种角度来看,系统调用和普通的函数调用非常相似。区别仅仅...
  • syscall 系统调用

    万次阅读 2015-07-28 15:04:12
    5.1.5 如何使用系统调用 如图5.2所示,用户应用可以通过两种方式使用系统调用。第一种方式是通过C库函数,包括系统调用在C库中的封装函数和其他普通函数。   图5.2 使用系统调用的两种方式 ...
  • 操作系统概念学习笔记 6 系统调用

    千次阅读 2015-04-29 11:02:38
    操作系统概念学习笔记 6系统调用系统调用系统调用(system call),通常用c或c++编写,对底层任务(如需直接访问硬件)可能以汇编语言指令的形式提供。一个系统调用的例子: 编写一个从一个文件读取数据并复制到另一个...
  • 系统调用与过程调用

    万次阅读 多人点赞 2010-06-12 11:35:00
    程序中执行系统调用或过程(函数)调用,虽然都是对某种功能或服务的需求,但两者从调用形式到具体实现都有很大区别。(1)调用形式不同。过程(函数)使用一般调用指令,其转向地址是固定不变的,包含在跳转语句中;...
  • Linux如何动态添加新的系统调用

    千次阅读 2020-05-06 22:25:04
    先来个满满的回忆: ...2011年写这篇文章的时候,我的女儿小小还没有出生。 评价一下这篇文章,总体写得还不错,时间如白驹过隙...前段时间折腾Rootkit的时候,我有意避开类似HOOK劫持系统调用的话题,我主要是想来点新...
  • 库函数与系统调用的区别

    千次阅读 2016-12-23 21:36:13
    Linux对文件操作有两种形式:系统调用与库函数调用。;而库函数调用则是面向应用开发的。 一、系统调用 系统调用是通向操作系统本身的接口,是面向底层硬件的。通过系统调用,可以使得用户态运行的进程与硬件...
  • 系统调用过程详解

    千次阅读 2016-12-04 21:11:01
    整个过程如下:首先指令流执行到系统调用函数时,系统调用函数通过int 0x80指令进入系统调用入口程序,并且把系统调用号放入%eax中,如果需要传递参数,则把参数放入%ebx,%ecx和%edx中。进入系统调用入口程序...
  •  系统调用是内核和应用程序间的接口,应用程序要访问硬件设备和其他操作系统资源,必须通过系统调用来完成。  在linux中,系统调用是用户空间访问内核的唯一手段,除异常和中断外,他们是内核唯一>的合法入口。...
  • 使用内核模块的方式添加系统调用 1,为什么? 编译内核的方式费时间,一般的PC机都要两三个小时,而且不方便调试,一旦出现问题前面的工作都前功尽弃,所以我使用内核模块的方式添加... 找系统调用表在内存中的位置
  • 还是菜鸟,可能表述有误,仅供参考。 名字看起来很接近,先看一下调用的流程图: 用户程序通过int 0x80软中断陷入内核态,这个陷入(trap)具体意思不明,int 0x80...进入system_call(系统调用处理程序,或名为系
  • Linux系统调用过程分析

    千次阅读 2014-10-21 10:23:33
    linux的系统调用过程: 层次如下: 用户程序------>C库(即API):INT 0x80 ----->system_call------->系统调用服务例程-------->内核程序 先说明一下,我们常说的用户API其实就是系统提供的C库。 系统调用是通过软...
  • linux 系统调用

    万次阅读 2011-01-13 22:16:00
    5.1.5 如何使用系统调用 如图5.2所示,用户应用可以通过两种方式使用系统调用。第一种方式是通过C库函数,包括系统调用在C库中的封装函数和其他普通函数。 图5.2 使用系统调用的两种方式 第二种...
  • 操作系统 之 库函数和系统调用

    千次阅读 2016-03-09 22:44:03
    系统调用(英语:system call),指运行在用户空间的应用程序向操作系统内核请求某些服务的调用过程。 系统调用提供了用户程序与操作系统之间的接口。一般来说,系统调用都在内核态执行。由于系统调用不考虑平台...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,052,714
精华内容 421,085
关键字:

系统调用表位置