首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

LinuxLinux系统调用

---- 系统调用的实现 通过软件中断实现。 **软件中断:**它是通过软件指令触发的中断。Linux系统内核响应软件中断,从用户态切换到内核态,执行相应的系统调用。...系统调用控制程序执行软件中断的过程如下: 在进程的内核态堆栈中保存大多数寄存器的内容(即保存恢复进程到用户态执行所需要的上下文)。 根据用户态传递的系统调用号,确定系统调用执行程序。...调用相应的执行程序来处理系统调用。 从系统调用返回。 系统调用号: 每个系统调用被赋予一个系统调用号,与具体的系统调用相关联。...系统调用表: 内核维护系统调用表,保存系统调用函数的起始位置,系统调用号对应该系统调用调用表中的偏移量。 ---- 执行系统调用的方法 还有系统中断。...\n"); } return 0; } ---- 对比 ---- 如何高效执行系统调用 系统调用次数会影响程序的执行效率。

27.8K10
您找到你想要的搜索结果了吗?
是的
没有找到

Linux 系统调用

Linux 中,系统调用是用户空间访问内核的唯一手段﹔除异常和陷入外,它们是内核唯一的合法入口。实际上,其他的像设备文件和/proc之类的方式,最终也还是要通过系统调用进行访问的。...而有趣的是,Linux 提供的系统调用却比大部分操作系统都少得多。 要访问系统调用(在 Linux 中常称作 syscall),通常通过C库中定义的函数调用来进行。...系统调用在出现错误的时候C库会把错误码写人errno全局变量。通过调用perror()库函数,可以把该变量翻译成用户可以理解的错误字符串。 在 Linux 中,每个系统调用被赋予一个系统调用号。...这样,通过这个独一无二的号就可以关联系统调用。当用户空间的进程执行一个系统调用的时候,这个系统调用号就用来指明到底是要执行哪个系统调用;进程不会提及系统调用的名称。...假设系统调用在内核空间定义为 sys_ioctl,那么该系统调用的用户空间接口为 ioctl Linux kernel-5.18.8 有 440 个系统调用,这些系统调用讲究通用性,一旦固定,很少修改,

9.8K20

Linux系统调用原理

一、什么是系统调用 系统调用 跟用户自定义函数一样也是一个函数,不同的是 系统调用 运行在内核态,而用户自定义函数运行在用户态。...系统调用Linux 内核提供的一段代码(函数),其实现了一些特定的功能,用户可以通过 int 0x80 中断(x86 CPU)或者 syscall 指令(x64 CPU)来调用 系统调用。...二、进入系统调用 本文主要介绍的是 x86 CPU 进入系统调用的方式 Linux 提供了 int 0x80 中断来让用户程序进入 系统调用,我们来看看 Linux 对 int 0x80 中断的处理初始化过程...三、系统调用实现 当用户要调用 系统调用 时,需要通过向 eax 寄存器写入要调用系统调用 编号。...而 Linux 进入中断处理程序时,会把这些寄存器的值保存到内核栈中,这样 系统调用 就能通过内核栈来获取到参数。

4.2K30

Linux系统调用过程

2 系统调用过程 http://www.linuxidc.com/Linux/2015-04/116546.htm 系统调用是操作系统提供给用户(应用程序)的一组接口,每个系统调用都有一个对应的系统调用函数来完成相应的工作...在这些函数里将执行一个软中断 swi 指令,产生一个软中断,使CPU 陷入内核态,接着在内核中进行一系列的判断,判断出是哪个系统调用,再转到真正的系统调用函数,完成相应的功能。...下面举一个简单的例子说明从用户态调用一个“系统调用”,到内核处理的整个执行流程。   ... 了解了一个系统调用执行过程就可以试着添加一个自己的系统调用了: 内核: 1....说明我添加的系统调用可以使用。 至此,描述系统调用的实现机制和添加一个新的系统调用就完成了。 3 添加自己的系统调用 了解了一个系统调用执行过程就可以试着添加一个自己的系统调用了: 内核: 1.

4.8K70

详解linux系统调用原理

操作系统通过系统调用为运行于其上的进程提供服务。 当用户态进程发起一个系统调用, CPU 将切换到 内核态 并开始执行一个 内核函数 。...被 软中断 打断后,执行 中断处理函数 ,即 系统调用处理函数 ( system_call ); 系统调用处理函数 调用 系统调用服务例程 ( sys_xyz ),真正开始处理该系统调用执行态切换...而 库函数 与 系统调用处理函数 之间,由于涉及用户态与内核态的切换,要复杂一些。 Linux 通过 软中断 实现从 用户态 到 内核态 的切换。...因此,用户进程必须传递一个参数用于区分,这便是 系统调用号 ( system call number )。 在 Linux 中, 系统调用号 一般通过 eax 寄存器 来传递。...系统调用执行完毕后,内核将负责切换回用户态,应用程序继续执行之后的指令( 从 20 行开始 )。 第 20-24 行,调用 exit 系统调用,以便退出程序。

4.2K43

Linux 库函数与系统调用

函数库调用是与用户程序相联系,而系统调用是操作系统的一个进入点 函数库调用是在用户地址空间执行,而系统调用是在内核地址空间执行 函数库调用的运行时间属于「用户」时间,而系统调用的运行时间属于「系统」时间...比如上篇文章中关于文件 IO 函数 fread、fwrite、fputc、fgetc 等,这些函数通常情况下性能确实比系统调用高,原因在于这些库函数使用了缓冲区,减少了系统调用次数,因而显得性能比较高...当一个进程正在运行,遇到读写文件操作,会发生一个中断,中断后系统会把当前用户进程的一些寄存器信息保存在内核堆栈中,接着去处理中断服务程序,这里是要去执行系统调用Linux 中通过执行 int $0x80...来执行系统调用的中断,但内核实现了很多系统调用,这时需要传递「系统调用号」来指明需要哪个系统调用。.../a Time: 2018-05-06 03:23:46 首先通过 mov 0xd %%eax 来将系统调用放入 %eax 寄存器中,time() 的系统调用号是 13,然后执行 int 0x80 系统就会去执行

7.3K30

【高级编程】Linux read系统调用

比如 fork、clone、execve、exit等 那为什么一定要用系统调用来访问操作系统的内容呢,其实这可以看做对内核的保护,linux分为用户空间和内核空间,而用户空间是不允许访问内核空间的数据的...进入内核空间后,系统调用中枢处理代码(所有的系统调用都由一处中枢代码处理)根据传递的参数(参数是有寄存器传递的包括唯一的系统调用号)和一个静态表分别执行不同的函数。...例如read系统调用,0x80 中断处理程序接管执行后,先检查其系统调用号,然后根据系统调用号查找系统调用表,并从系统调用表中得到处理 read 系统调用的内核函数 sys_read ,最后传递参数并运行...当驱动再次处理该请求时,会根据本次数据传输的结果通知上层函数本次 IO 操作是否成功,如果成功,上层函数解锁 IO 操作所涉及的页面。...该页被解锁后, 就可以再次成功获得该锁(数据的同步点),并继续执行程序了。之后,函数 sys_read 可以返回了。最终 read 系统调用也可以返回了。

6K110

Linux系统编程:基本IO系统调用

open()系统调用 对文件进行读写之前,必须先打开文件。Linux提供了系统调用open()。...read()系统调用 文件打开后,就能够读文件了。read()是最基础、最常见的读取文件的机制。...对于普通文件,write基本能保证每次执行调用能够写入全部的内容。...系统调用write()时,数据从用户空间的缓冲区中拷贝到了内核空间的缓冲区,但并没有立即把数据写入磁盘中,这称为延迟写。延迟写的问题在于,如果在数据真正写入磁盘之前系统崩溃了,则数据可能丢失。...Linux系统也支持强制文件立即写入磁盘上,这在后面介绍。 close()系统调用 程序完成文件的读写后,调用close函数关闭文件描述符与文件之间的连接,使得文件描述符可以被重用。

3K30

说说Linux系统调用那些事儿

与函数调用相比,系统调用的开销要大一些,因为在执行系统调用时,Linux必须从运行用户代码切换到执行内核代码,然后再返回用户代码。...减少这种开销的一个好办法是,在程序中尽量减少系统调用次数,并且让每次系统调用完成尽可能多的工作。 下面我们通过几个简单的栗子来说明一下为什么会这样。 ....减少系统调用次数的例子 下面我们改变数据块的大小,再来测试一下,这样做可以减少系统调用次数,下面是这个程序: /*copy_system2.c*/ #include #include...; 如果不可避免的使用了系统调用,那么就充分利用这次系统调用,让它完成尽可能多的工作。...Linux 程序设计(第四版). 人民邮电出版社 https://www.jianshu.com/p/2c60d669c9fb

1.5K20

Python调用linux系统命令--使

在python 中调用系统命令,如果使用subprocess.Popen() 模块,按照命令参数的的形式,可以分两种: 把命令当作字符串传给subprocess.Popen()  把命令保存到一个元组,...如果args是一个元组或列表形式,序列的第一个元素就是命令的可执行文件。也可以使用executable 显式地指定可执行文件的路径。 stdin, stdout, stderr :用于和外部进行通信。...同时p.commucincate() 返回一个tuple 值 (stdout_some,  stderr_some) = p.communicate(stdin_some).所以,调用subprocess.Popen...() 创建子进程执行命令,可以很方便地和子进程进行通信,获取状态。...多条命令连通:      在linux 下,经常使用管道将多条命令连在一起,前一条指令的执行结果作为后一条指令的输入,使用Popen 也可以实现。 ? 首先,查看test.txt 文件的内容。

5.1K20

Linux 内核 内存管理】munmap 系统调用源码分析 ① ( munmap 系统调用函数执行流程 | munmap 函数源码 | vm_munmap 函数源码 )

文章目录 一、munmap 系统调用函数执行流程 二、munmap 系统调用函数源码 三、vm_munmap 函数源码 一、munmap 系统调用函数执行流程 ---- munmap 系统调用函数 的作用是..." , 该函数有 2 个参数 , 分别是 unsigned long addr 和 size_t, len , 前者是 内存映射 的 起始地址 , 后者是 内存映射 的 长度 ; munmap 系统调用函数...调用了 vm_munmap 函数 , 在 vm_munmap 函数 中 , 又调用了 do_munmap 函数 , do_munmap 函数 是 删除 内存映射 的 核心函数 ; 二、munmap 系统调用函数源码...---- munmap 系统调用函数 , 定义在 Linux 内核源码 linux-4.12\mm\mmap.c#2729 位置 ; munmap 系统调用函数源码如下 : SYSCALL_DEFINE2...-4.12\mm\mmap.c#2729 三、vm_munmap 函数源码 ---- vm_munmap 函数 , 定义在 Linux 内核源码 linux-4.12\mm\mmap.c#2713 位置

1.8K20

分析Linux系统执行过程

分析Linux系统执行过程 一、阅读理解task_struct数据结构 二、分析fork函数对应的内核处理过程do_fork 三、使用gdb跟踪分析一个fork系统调用内核处理函数do_fork 四、...do_execve ,验证您对Linux系统加载可执行程序所需处理过程的理解 七、特别关注新的可执行程序是从哪里开始执行的?...为什么execve系统调用返回后新的可执行程序能顺利执行?对于静态链接的可执行程序和动态链接的可执行程序execve系统调用返回时会有什么不同?...六、使用gdb跟踪分析一个execve系统调用内核处理函数do_execve ,验证您对Linux系统加载可执行程序所需处理过程的理解 $ b do_execve 由跟踪结果可知,当调用新的可执行程序时...从现在开始,next 进程就成为当前进程而真正开始执行 总结 Linux 系统中的fork系统调用。fork会创建一个新的进程,加载文件并进行执行。在这个过程中,涉及到了两个进程之间的切换。

89420

Linux 内核 内存管理】mmap 系统调用源码分析 ② ( sys_mmap_pgoff 系统调用函数执行流程 | sys_mmap_pgoff 函数源码 )

文章目录 一、sys_mmap_pgoff 系统调用函数执行流程 二、sys_mmap_pgoff 系统调用函数源码 调用 mmap 系统调用 , 先检查 " 偏移 " 是否是 " 内存页大小 " 的..." 整数倍 " , 如果偏移是内存页大小的整数倍 , 则调用 sys_mmap_pgoff 函数 , 继续向下执行 ; 一、sys_mmap_pgoff 系统调用函数执行流程 ---- 在 sys_mmap_pgoff...hugetlbfs 文件系统中 , 创建文件 " 巨型页 " , 即 anon_hugepage ; 最后 , 调用了 vm_mmap_pgoff 函数 , 继续向后执行 ; 二、sys_mmap_pgoff...系统调用函数源码 ---- 该 sys_mmap_pgoff 系统调用函数源码 , 定义在 Linux 内核源码的 linux-4.12\mm\mmap.c#1475 位置 ; sys_mmap_pgoff...vm_mmap_pgoff(file, addr, len, prot, flags, pgoff); out_fput: if (file) fput(file); return retval; } 源码路径 : linux

1.1K20
领券