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

【Linux】Linux系统调用

Linux系统调用 前言 操作系统——管理计算机硬件与软件资源的软件,是用户和系统交互的操作接口,为它上面运行的程序提供服务。...操作系统内核——操作系统的内核,负责管理系统的进程、内存、设备驱动程序、文件和网络系统。一个内核不是一套完整的操作系统。例如Linux。 Linux操作系统——基于Linux内核的操作系统。...调用相应的执行程序来处理系统调用。 从系统调用返回。 系统调用号: 每个系统调用被赋予一个系统调用号,与具体的系统调用相关联。...系统调用表: 内核维护系统调用表,保存系统调用函数的起始位置,系统调用号对应该系统调用在调用表中的偏移量。 ---- 执行系统调用的方法 还有系统中断。...,唯一标识系统调用号,详见sys/syscall.h …为剩余可变长的参数,为系统调用所带的参数,根据系统调用的不同,可带0~5个不等的参数,如果超过特定系统调用能带的参数,多余的参数被忽略。

27.9K10

Linux 系统调用

与内核通信 系统调用在用户空间进程和硬件设备之间添加了一个中间层。该层主要作用有三个。 首先,它为用户空间提供了一种硬件的抽象接口。...在 Linux 中,系统调用是用户空间访问内核的唯一手段﹔除异常和陷入外,它们是内核唯一的合法入口。实际上,其他的像设备文件和/proc之类的方式,最终也还是要通过系统调用进行访问的。...而有趣的是,Linux 提供的系统调用却比大部分操作系统都少得多。 要访问系统调用(在 Linux 中常称作 syscall),通常通过C库中定义的函数调用来进行。...通过调用perror()库函数,可以把该变量翻译成用户可以理解的错误字符串。 在 Linux 中,每个系统调用被赋予一个系统调用号。这样,通过这个独一无二的号就可以关联系统调用。...当用户空间的进程执行一个系统调用的时候,这个系统调用号就用来指明到底是要执行哪个系统调用;进程不会提及系统调用的名称。

9.9K20
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    Linux系统调用原理

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

    4.2K30

    Linux中的主要系统调用

    Linux 操作系统中就是创建进程。创建进程的系统调用叫fork。...对于 fork 系统调用的返回值,如果当前进程是子进程,就返回 0;如果当前进程是父进程,就返回子进程的进程号。...有个系统调用waitpid,父进程可以调用它,将子进程的进程号作为参数传给它,这样父进程就知道子进程运行完了没有,成功与否。在操作系统中,每个进程都有自己的内存,互相之间不干扰,有独立的进程内存空间。...其中局部变量的部分,在当前函数执行的时候起作用,当进入另一个函数时,这个变量就释放了;也有动态分配的,会较长时间保存,指明才销毁的,这部分称为堆(Heap)。...进程运行起来,要想看到进程运行的情况,会在 /proc 下面有对应的进程号,还是一系列文件。每个文件,Linux 都会分配一个文件描述符(File Descriptor),这是一个整数。

    3400

    详解Linux的系统调用fork()函数

    在Linux系统中,fork()是一个非常重要的系统调用,它的作用是创建一个新的进程。...fork()函数的本质是在内核中创建一个新的进程控制块(PCB),然后将原来进程的PCB中的大部分内容都复制到新的PCB中去,然后让两个进程同时运行。...由于新的进程是从原来的进程所复制而来的,因此新进程会继承原来进程的所有资源和信息,包括内存、文件描述符、信号处理方式等。 需要注意的是,fork()函数并不保证父进程和子进程的执行顺序。...在fork()之后,操作系统可能会先执行父进程,也可能会先执行子进程,这完全取决于系统的调度算法。...一般情况下,父进程和子进程之间是相互独立的,它们各自运行各自的代码,共享的只有一部分内存空间,而其他资源则是分别使用的。

    1.5K30

    linux 系统调用 write 的原子性

    那么对于不同类型的文件与不同的系统实现 write 究竟是怎么处理的呢? 3.1. 普通文件 有三种情况可能导致文件写入失败: 1. 磁盘已满 2. 写入文件大小超出系统限制 3....linux 系统默认使用 O_NONBLOCK 标识打开文件,而 bsd 等 unix 系统则恰恰相反。 3.2....3.3. socket linux 2.6.14 内核对 tcp socket 写操作进行了说明,他并不是原子的。...在用户进程中使用互斥锁加锁,内核首先需要从用户态陷入内核态,调用系统调用,操作堆栈,然后进行文件操作,然后清理堆栈,再从内核态回到用户态,这个过程是很慢的,而对于用户实现的互斥锁,在这个过程中,其他进程是无法进行文件操作的...而对于操作系统来说,内核对文件加锁是在系统调用内实现的,也就是已经陷入内核态实现,这个过程只需几个汇编指令即可,也无需对堆栈进行操作: mutex_lock: TSL REGISTER, MUTEX

    1.7K60

    Linux系统调用过程

    1 系统调用的作用 系统调用是操作系统提供给用户(应用程序)的一组接口,每个系统调用都有一个对应的系统调用函数来完成相应的工作。用户通过这个接口向操作系统申请服务,如访问硬件,管理进程等等。...2 系统调用过程 http://www.linuxidc.com/Linux/2015-04/116546.htm 系统调用是操作系统提供给用户(应用程序)的一组接口,每个系统调用都有一个对应的系统调用函数来完成相应的工作...pk()事实上就可以类比于平时我们在用户程序里调用的 open() 等函数,这个函数只做了一件简单的事:将系统调用号传给 r7 ,,然后产生一软中断。...2.根据系统调用号取出系统调用函数在系统调用表的基地址,得到一个系统调用函数的函数指针 3....根据系统调用表的基地址和系统调用号,得到这个系统调用表里的项,每一个表项都是一个函数指针,把这个函数指针赋给PC , 则实现了跳转到系统调用函数。

    4.8K70

    从内核角度分析 listen() 系统调用的 backlog 参数作用

    编写服务端程序时,需要调用 listen() 系统调用来开始监听请求连接,listen() 系统调用的原型如下: int listen(int sockfd, int backlog); 可以看到,listen...() 系统调用需要传入两个参数,第一个 sockfd 表示监听的 socket 句柄,而 backlog 参数表示接收请求队列的长度。...对于第一个参数比较容易理解,那么第二个参数的作用是什么呢?下面我们来分析一下。...listen() 系统调用在内核的实现 当我们在程序中调用 listen() 系统调用时,会触发调用内核的 sys_listen() 函数,sys_listen() 函数的实现如下: asmlinkage...,最后调用的函数是 tcp_v4_syn_recv_sock(),tcp_v4_syn_recv_sock() 函数的作用是当对端连接完成 TCP三次握手 后,将创建一个新的 socket 连接对象。

    1.1K20

    从内核角度分析 listen() 系统调用的 backlog 参数作用

    编写服务端程序时,需要调用 listen() 系统调用来开始监听请求连接,listen() 系统调用的原型如下: int listen(int sockfd, int backlog); 可以看到,listen...() 系统调用需要传入两个参数,第一个 sockfd 表示监听的 socket 句柄,而 backlog 参数表示接收请求队列的长度。...对于第一个参数比较容易理解,那么第二个参数的作用是什么呢?下面我们来分析一下。...listen() 系统调用在内核的实现 当我们在程序中调用 listen() 系统调用时,会触发调用内核的 sys_listen() 函数,sys_listen() 函数的实现如下: asmlinkage...,最后调用的函数是 tcp_v4_syn_recv_sock(),tcp_v4_syn_recv_sock() 函数的作用是当对端连接完成 TCP三次握手 后,将创建一个新的 socket 连接对象。

    1.3K10

    【Linux 内核 内存管理】mmap 系统调用源码分析 ① ( mmap 与 mmap2 系统调用 | Linux 内核中的 mmap 系统调用源码 )

    文章目录 一、mmap 与 mmap2 系统调用 二、Linux 内核中的 mmap 系统调用源码 一、mmap 与 mmap2 系统调用 ---- mmap 创建 " 内存映射 " 的 系统调用 有...mmap2 ; 2 者区别是 : mmap 偏移单位是 " 字节 " , mmap2 偏移单位是 " 页 " , 但是在 arm 64 体系架构中 , 没有实现 mmap2 , 只实现了 mmap 系统调用...; 二、Linux 内核中的 mmap 系统调用源码 ---- arm64 架构体系中 , 使用 mmap 系统调用 创建 " 内存映射 " , 调用 mmap 系统调用函数 , 执行如下操作 : 先检查..." 偏移 " 是否是 " 内存页大小 " 的 " 整数倍 " , 如果偏移不是内存页大小的整数倍 , 返回 -EINVAL 错误 ; 如果偏移是内存页大小的整数倍 , 则调用 sys_mmap_pgoff...函数 , 继续向下执行 ; mmap 系统调用代码如下 : SYSCALL_DEFINE1(old_mmap, struct mmap_arg_struct __user *, arg) { struct

    10.6K40

    Linux 库函数与系统调用

    一、系统调用 系统调用,我们可以理解是操作系统为用户提供的一系列操作的接口(API),这些接口提供了对系统硬件设备功能的操作。...所有 C 函数库是相同的,而各个操作系统的系统调用是不同的。 函数库调用是调用函数库中的一个程序,而系统调用是调用系统内核的服务。...当一个进程正在运行,遇到读写文件操作,会发生一个中断,中断后系统会把当前用户进程的一些寄存器信息保存在内核堆栈中,接着去处理中断服务程序,这里是要去执行系统调用,Linux 中通过执行 int $0x80...来执行系统调用的中断,但内核实现了很多系统调用,这时需要传递「系统调用号」来指明需要哪个系统调用。.../a Time: 2018-05-06 03:23:46 首先通过 mov 0xd %%eax 来将系统调用放入 %eax 寄存器中,time() 的系统调用号是 13,然后执行 int 0x80 系统就会去执行

    7.4K30

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

    比如 fork、clone、execve、exit等 那为什么一定要用系统调用来访问操作系统的内容呢,其实这可以看做对内核的保护,linux分为用户空间和内核空间,而用户空间是不允许访问内核空间的数据的...进入内核空间后,系统调用中枢处理代码(所有的系统调用都由一处中枢代码处理)根据传递的参数(参数是有寄存器传递的包括唯一的系统调用号)和一个静态表分别执行不同的函数。...例如read系统调用,0x80 中断处理程序接管执行后,先检查其系统调用号,然后根据系统调用号查找系统调用表,并从系统调用表中得到处理 read 系统调用的内核函数 sys_read ,最后传递参数并运行...虚拟文件系统层的作用:屏蔽下层具体文件系统操作的差异,为上层的操作提供一个统一的接口。正是因为有了这个层次,所以可以把设备抽象成文件,使得操作设备就像操作文件一样简单。...引入 cache 层的目的是为了提高 linux 操作系统对磁盘访问的性能。 Cache 层在内存中缓存了磁盘上的部分数据。

    6.2K110

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

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

    3.1K30

    说说Linux系统调用那些事儿

    与函数调用相比,系统调用的开销要大一些,因为在执行系统调用时,Linux必须从运行用户代码切换到执行内核代码,然后再返回用户代码。...减少这种开销的一个好办法是,在程序中尽量减少系统调用的次数,并且让每次系统调用完成尽可能多的工作。 下面我们通过几个简单的栗子来说明一下为什么会这样。 ....频繁使用系统调用的例子 下面是一个关于文件复制的程序,看起来非常的简单,我们首先使用系统调用来完成文件复制的操作,为了体现频繁的系统调用,程序中将每次读写的数据块大小设为1byte,被复制的文件大小为1M...不使用系统调用的例子 为了体现不使用系统调用的优势,我们再来写一个不使用系统调用的程序: /*copy_system3.c*/ #include #include <stdlib.h...; 如果不可避免的使用了系统调用,那么就充分利用这次系统调用,让它完成尽可能多的工作。

    1.6K20

    Python调用linux系统命令--使

    在python 中调用系统命令,如果使用subprocess.Popen() 模块,按照命令参数的的形式,可以分两种: 把命令当作字符串传给subprocess.Popen()  把命令保存到一个元组,...同时p.commucincate() 返回一个tuple 值 (stdout_some,  stderr_some) = p.communicate(stdin_some).所以,调用subprocess.Popen...Popen.pid  : 返回进程pid 号 Popen.kill() : 杀死进程 举例: 1. 以字符串方式传入,shell=True: ?...多条命令连通:      在linux 下,经常使用管道将多条命令连在一起,前一条指令的执行结果作为后一条指令的输入,使用Popen 也可以实现。 ? 首先,查看test.txt 文件的内容。...然后,子进程pb 的标准输入stdin 用pa.stdout 进行初始化,实现了管道的功能,pa 进程的输出编程了pb进程的输入,最后的输出结果。

    5.1K20

    Linux操作系统下文件作用

    linux下的文件结构,看看每个文件夹都是干吗用的 /bin 二进制可执行命令 /dev 设备特殊文件 /etc 系统管理和配置文件 /etc/rc.d 启动的配置文件和脚本 /home 用户主目录的基点...,比如用户user的主目录就是/home/user,可以用~user表示 /lib 标准程序设计库,又叫动态链接共享库,作用类似windows里的.dll文件 /sbin 系统管理命令,这里存放的是系统管理员使用的管理程序...linux下开发和编译应用程序所需要的头文件 /usr/lib 常用的动态链接库和软件包的配置文件 /usr/man 帮助文档 /usr/src 源代码,linux内核的源代码就放在/usr/src...这个目录用于提 供关于系统的信息。下面说明一些最重要的文件和目录(/proc 文件系统在proc man页中有更详 细的说明)。 /proc/x 关于进程x的信息目录,这一x是这一进程的标识号。...每个进程在/proc 下有一个名为自 己进程号的目录。 /proc/cpuinfo 存放处理器( c p u )的信息,如c p u的类型、制造商、型号和性能等。

    81910
    领券