首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往
您找到你想要的搜索结果了吗?
是的
没有找到

Linux系统调用原理

二、进入系统调用 本文主要介绍的是 x86 CPU 进入系统调用的方式 Linux 提供了 int 0x80 中断来让用户程序进入 系统调用,我们来看看 Linux 对 int 0x80 中断的处理初始化过程...SYMBOL_NAME(sys_exit) .long SYMBOL_NAME(sys_fork) .long SYMBOL_NAME(sys_read) .long SYMBOL_NAME(sys_write...翻译成 C 代码如下: long sys_call_table[] = { sys_ni_syscall, sys_exit, sys_fork, sys_read, sys_write...Linux 使用寄存器来传递参数,参数与寄存器的关系如下: 第1个参数放置在 ebx 寄存器。 第2个参数放置在 ecx 寄存器。 第3个参数放置在 edx 寄存器。...而 Linux 进入中断处理程序时,会把这些寄存器的值保存到内核栈中,这样 系统调用 就能通过内核栈来获取到参数。

4.2K30

Win32 Linux汇编语法区别

%ecx # 参数二:要显示的字符串 movl $1, %ebx # 参数一:文件描述符(stdout) movl $4, %eax # 系统调用号(sys_write...内核提供的 sys_write 来显示一个字符串,然后再调用 sys_exit 退出程序。...所有的系统调用功能号都可以在文件 /usr/include/bits/syscall.h 中找到,为了便于使用,它们是用 SYS_ 这样的宏来定义的,如 SYS_write、SYS_exit...例如,经常用到的 write 函数是如下定义的: ssize_t write(int fd, const void *buf, size_t count); 该函数的功能最终是通过 SYS_write...根据上面的约定,参数 fb、buf 和 count 分别存在寄存器 ebx、ecx 和 edx 中,而系统调用号 SYS_write 则放在寄存器 eax 中,当 int 0×80 指令执行完毕后,返回值可以从寄存器

2.4K40

xv6(6) 系统调用

$Linux$ 里面系统调用使用的向量号是 $0x80$,$xv6$ 里面使用的 $64$(不同 $xv6$ 版本可能不同)。...上述说的用户接口就会执行 INT 64 触发一个 $64$ 号中断,这里 $xv6$ 做了简化,按照以前版本的 $Linux$,用户接口是调用一个宏定义 $_SYSCALL$,这个宏再来执行 INT...事实也的确如此,同样的来随便看几个: extern int sys_fork(void); extern int sys_getpid(void); extern int sys_write(void)...举个例子来说明,在 $sys_write$ 这个内核功能函数中会调用 $argptr$: char *p; argptr(1, &p, n); /**如果用一级指针**/ argptr(1, p, n...); $sys_write()$ 调用 $argptr()$的本意是获取第一个参数,也就是用户接口 $write(fd, buf, size)$ 的 $buf$ 地址值,并将其赋给 $p$。

28810

Linux内核设备驱动之虚拟文件系统笔记整理

a.调用模型 write(): 用户空间 –> sys_write(): VFS –> 文件系统的写方法: 文件系统 –> 物理介质 (2)VFS采用的主要对象 VFS采用了面向对象的思路,采用一组数据结构来代表通用的文件对象...对于不基于磁盘的文件系统,比如基于内存的文件系统sysfs,linux会在使用现场创建超级块并将其保存到内存中。 超级块的结构体为super_block,定义在。...inode结构体定义在,其对应的操作函数结构体为inode_operations c.目录项对象dentry 每个目录项对象代表一个路径中的特定部分,比如路径/bin/vi,/、...dentry结构体定义在中,对应的目录项操作函数结构体dentry_operations也定义在中。...文件对象由file结构体表示,定义在中。file对象的操作函数结构体为file_operations,定义在中。

2.1K20

虚拟文件系统

Linux系统中,可以使用多种文件系统来挂载不同的设备,如 ext2、ext3、nfs等等。...虚拟文件系统抽象数据结构 Linux奉行了Unix的理念:一切皆文件,比如一个目录是一个文件,一个设备也是一个文件等,因而文件系统在Linux中占有非常重要的地位。...注册文件系统 Linux为了支持不同的文件系统而创造了虚拟文件系统,虚拟文件系统更像一个规范(或者说接口),真实的文件系统需要实现虚拟文件系统的规范(接口)才能接入到Linux内核中。...把内容写入到文件是通过调用 write() 系统调用实现,而 write() 系统调用最终会调用 sys_write() 内核函数,sys_write() 函数的实现如下: asmlinkage ssize_t...sys_write(unsigned int fd, const char * buf, size_t count) { ssize_t ret; struct file * file

1.5K30

内核中断体系概括

的中断机制 1、分类 Linux的中断分为硬件中断和软件中断 硬中断:由电脑中主机的 8259A 类似的硬件中断控制芯片发出的中断或 ARM 中断控制器发出的中断 软中断:称为异常 第一类:CPU...自行保留的中断 第二类:系统调用异常 2、代码结构 汇编文件 对应的c文件 linux/kernel/asm.s trap.c linux/kernel/system_call.s fork.c signal.c...跳转回正常工作的函数地址继续运行 2、Linux 中中断的工作流程 ①....,中断后的回复过程 中断的执行过程 硬件中断的处理过程 linux/kernel/asm.s traps.c 软件及系统调用的处理过程 linux/kernel/system_call.s fork.c...函数放到了一个统一的 sys_call_table 系统调用的操作码 fn_ptr sys_call_table[] = { sys_setup, sys_exit, sys_fork, sys_read, sys_write

10510

SRS5优化:如何将DVR性能提升一倍

再用perf工具对其中一个srs 进程进行性能采样分析,得到下面的火焰图: 可以发现,sys_write操作占用的时间消耗是最多的,对比上面用top看到的内核态消耗的时长占比可以得出的结论是一致的。...最后看火焰图: 系统调用的时间占比大幅度缩短了,在上图几乎找不到sys_write的位置了。 write Memory Disk SRS优化前,也可以挂载内存盘,使用write写入内存盘。...What's Next 在linux环境中,对于文件进行读写操作的时候,我们可以采用libc提供的fread/fwrite系列的一套函数,也可以采用操作系统提供的read/write系列的一套系统api...对于libc提供的文件读写函数,首先它可移植性比较好,因为libc为我们屏蔽了操作系统的底层差异,在linux、windows等不同的操作系统环境下面都有标准的接口实现,因此不需要我们为不同的操作系统进行适配...由于操作系统本身不支持epoll异步(linux下的ext4本身没有实现poll的回调),所以寄希望于epoll来实现文件i/o的异步操作是行不通的。

1.2K30
领券