read、write等系统调用

nachos系统调用实现Write、Read、Exec、Join 了解nachos系统调用的原理: 1.要实现nachos的系统调用,首先查看syscall.h当中声明的系统调用函数 可以发现Nachos已经为我们在syscall.h中声明好了这些系统调用函数。 2.观察Start.s中的汇编代码,定义了系统调用函数的实现 我们可以观察到Halt函数的实现是将系统调用类型(type)SC_Halt放入了2号寄存器中,然后执行sysc... 阅读详情

用户态的read、write等系统调用,陷入内核态,会首先调用到 SyS_read、SyS_write函数

1、write

用户态的系统调用:write
SyS_write
vfs_write
__vfs_write
fops->write

先看看 SyS_write 的定义

// fs/read_write.c
 577 SYSCALL_DEFINE3(write, unsigned int, fd, const char __user *, buf,
 578         size_t, count)
 579 {
 580     struct fd f = fdget_pos(fd);
 581     ssize_t ret = -EBADF;
 582
 583     if (f.file) {
 584         loff_t pos = file_pos_read(f.file);
 585         ret = vfs_write(f.file, buf, count, &pos);
 586         if (ret >= 0)
 587             file_pos_write(f.file, pos);
 588         fdput_pos(f);
 589     }
 590
 591     return ret;
 592 }

SYSCALL_DEFINE3 的定义

// include/linux/syscalls.h
184 #define SYSCALL_DEFINE3(name, ...) SYSCALL_DEFINEx(3, _##name, __VA_ARGS__)


189 #define SYSCALL_DEFINEx(x, sname, ...)              \
190     SYSCALL_METADATA(sname, x, __VA_ARGS__)         \
191     __SYSCALL_DEFINEx(x, sname, __VA_ARGS__)



194 #define __SYSCALL_DEFINEx(x, name, ...)                 \
195     asmlinkage long sys##name(__MAP(x,__SC_DECL,__VA_ARGS__))   \
196         __attribute__((alias(__stringify(SyS##name))));     \
197     static inline long SYSC##name(__MAP(x,__SC_DECL,__VA_ARGS__));  \
198     asmlinkage long SyS##name(__MAP(x,__SC_LONG,__VA_ARGS__));  \
		// 此处产生 SyS_xx 函数的定义
199     asmlinkage long SyS##name(__MAP(x,__SC_LONG,__VA_ARGS__))   \
200     {                               \
201         long ret = SYSC##name(__MAP(x,__SC_CAST,__VA_ARGS__));  \
202         __MAP(x,__SC_TEST,__VA_ARGS__);             \
203         __PROTECT(x, ret,__MAP(x,__SC_ARGS,__VA_ARGS__));   \
204         return ret;                     \
205     }                               \
206     static inline long SYSC##name(__MAP(x,__SC_DECL,__VA_ARGS__))
		// 注意,上面的这个 SYSC##name 内联函数正好接上第一个函数块中的函数实现,形成完整的内联函数定义

从用户态的 write 到 内核态的 SyS_write 这一步是通过 compat_sys_call_table 这个函数数组 和 宏__SYSCALL实现的,详见博客
ARM64系统中兼容系统调用表compat_sys_call_table的定义和初始化

最终 compat_sys_call_table 对应一个个函数指针元素

通过c库函数 syscall(int a) syscall.h 执行数组的a元素

2、read

SyS_read
vfs_read
__vfs_read
fops->read

3、io_submit

SyS_io_submit
do_io_submit
aio_write / aio_write
fops->write_iter / fops->read_iter

write、read系统调用 •【write系统调用】 •功能描述: 向指定文件写数据 •用法: #include ssize_t write( int fd, //file descriptor const void *buf, //data to write size_t nbytes  //amount to write ) •说明: •write函数将buf中的nbytes字节内容写 阅读详情

相关推荐

Linux VFS与Read/Write系统调用

一、引言VFS(虚拟文件系统,Virtual File System)是物理文件系统与服务之间的接口层,向下对文件系统提供标准接口,方便其他文件系统移植,向上对应用层提供标准文件操作接口,使open()、read()、write()等系统调用可以跨越各种文件系统和不同介质执行。 二、VFS对象及数据结构超级块对象super_block,对应已装载的文件系统 索引节点对象inode,对应介质上的一

shaomingshan的博客 4175

《UNIX环境高级编程》笔记--read函数,write函数,lseek函数

1.函数说明 每个打开的文件都有一个关联的“当前偏移量”,用于记录从文件到当前当前位置的偏移字节数,lseek函数是设置这个当前偏移量 的函数,函数的声明如下: #include

TODD911的专栏 1万+

VFS中的read/write系统调用

VFS中的read/write系统调用 ​ VFS所隐含的主要思想在于引入了一个通用的文件模型(common file model),这个模型能够表示所有支持的文件系统。VFS是所有文件系统的抽象。 ​ linux内核对每个文件读写操作都必须使用一个指针,指向要访问的具体文件系统的适当函数。换句话说,当应用程序对read()或是write()调用引起内核调用相应的sys_read()或...

jasonLee的博客 1729

ARM嵌入式笔记1

ARM中的RO、RW和ZI DATA说明: http://blog.youkuaiyun.com/jamestaosh/article/details/4348385 OK6410一键烧写的时候,SD卡上放入的文件系统应该是FORLINX_6410_touch_nand2g.yaffs2更名为rootfs.yaffs2,按照官方指导书的做法放入FORLINX_6410_touch.cramfs更名为c

wu55uw的专栏 1274

汇编语言调用Linux系统调用read和write

.section .data UserMsg: .ascii "Please input the message:" LenOfUserMsg: .equ lenMsg,  LenOfUserMsg - UserMsg #.section .bss # .lcomm resb, 200 OutputMsg: .ascii "This is your input:" LenOfOu

认真就赢了 4952

《Linux系统调用:read,write,lseek》

一、接口介绍 #include <unistd.h> ssize_t read(int fd, void *buf, size_t count); 参数: fd: open 返回的文件描述符 buf: 读取存放数据 count:读取的数据大小 ssize_t write(int fd, const void *buf, size_t count); 参数: fd: ...

yexiang优快云的专栏 395

ARM学习笔记4-UART_READ操作

                            ARM学习笔记4-UART_READ操作   #include &lt;stdio.h&gt; #include &lt;string.h&gt; #include &lt;unistd.h&gt; #include &lt;sys/types.h&gt; #include &lt;sys/stat.h&gt; #include &lt...

JT Blog 1815

HR效率翻倍!用Dify+飞书AI表格打造自动化简历处理流水线(附完整代码)

本文详细介绍了如何利用Dify工作流和飞书多维表格构建自动化简历处理系统,实现简历上传、AI智能解析与结构化数据入库的全流程自动化。通过整合大语言模型进行信息抽取,该系统能显著提升HR处理简历的效率与准确性,将HR从重复劳动中解放出来。

1a2s3d4f5g的博客 1023

基于read函数分析linux系统调用流程

这里名称变掉了,但是我们理解还是sys_read其实在老版本的linux内核里面,确实还是sys_read,但是由于在09年,随着大批量的64位处理器的出现,很多用户在调用的时候,无法填充64位的系统调用,就会被黑客利用,导致系统奔溃和权限升级,所以linux大牛们相处了一套通用的方法,开发出了这一套宏来避免这个bug,这个宏会对参数和系统调用名进行展开解析,从而变成我们需要的sys_read,具体如何做到的,网上有帖子,可以去参看。这里面也包含了各个系统调用的系统调用号,和calls.S是一致的。...

生活需要深度 3464

【全网最新】使用 1panel面板 部署若依系统( springboot 和 vue)项目

打开前端项目的vue.config.js文件,检查devServer下的proxy代理部分,然后将下面这个端口修改为你要在打包后访问的端口,即使用nginx代理前的接口。这个端口默认是80端口,这里把其修改为不会冲突的8010端口,后台接口的地址配置为9080,不过感觉这里设置的8010和9080可能没有用,因为部署前端静态页面是,也配置了一次网页的外部接口和api的接口,后期有空了再验证。打开右侧的Maven,点击:生存期->package,然后点击运行,等待打包成功,包在如图所示的文件夹中。

老薛的专栏 1754

单机多环境部署apollo 2.3.0

理解apollo的整体架构后,对比nacos配置中心功能点,其设计的复杂度以及完整度相较nacos而言更为丰富 对于不同的环境,例如 FAT, PRO 在部署时进程已经完全物理隔离,并且每个环境config/adminservice依赖的数据也完全物理隔离(连接不同的db),在数据隔离与安全方面做的很完善,但同时也提升了架构的复杂度 而 portal 可以管理多个环境,单节点部署虽然有单点问题,但并不会影响业务从configservice读取配置, 挂掉只要重启就可以,只是在

Life is a starting point everywhere 1299

ARM学习笔记2-文件IO操作

                                           ARM学习笔记2-文件IO操作 int fd = creat(路径,权限); ssize_t  fd2 = write(句柄,数据,数据长度); ssize_t  fd2 = write(句柄,数据,数据长度);   int main(void){ int fd = 100; #句柄 ...

JT Blog 367

【SystemVerilog笔记(一)】数据类型

(一)内建数据类型 1.按照四值逻辑和二值逻辑分类 四值逻辑类型:integer、logic、reg、wire等线网类型 二值逻辑类型:byte、shortint、int、longint、bit 2.按照有符号和无符号分类 有符号类型:byte、shortint、int、longint、integer 无符号类型:bit、logic、reg、wire等线网类型 ※记忆:按位定义的变量是无符号的。 (二)软件常用类型 1.定宽数组 在这里插入代码片 ...

cc__cc__的博客 1万+

系统调用——open、write、read和close

一、文件描述符 每一个进程都有一个与之相关的文件描述符,它们是一些小值整数,我们可以通过这些文件描述符来访问打开的文件。 一般地,一个程序开始运行时,会自动打开3个文件描述符: 0——–标准输入———-stdin 1——–标准输出———-stdout 2——–标准错误———-二、write系统调用1.write系统调用的原型:#include <unistd.h>size_t write(

帅气的羊的博客 1万+

ABB机器人与西门子PLC、工业相机联合实现无序抓取的完整调试方案

将此方案导入系统后,逐步执行调试,确保各环节信号正常触发,即可实现高效无序抓取!

CHUXUEZHE8210的博客 1991

【报错】ImportError: libpython3.10.so.1.0: cannot open shared object file: No such file or directory

ImportError: libpython3.10.so.1.0: cannot open shared object file: No such file or directory

静谧、淡雅 859

Linux系统调用之read、write函数

通过这个实战例子,我相信大家都可以熟练掌握read、write这两个系统API的用法。

weixin_49503250的博客 4398

Python爬虫教程:抓取社交媒体内容(以Facebook和Instagram为例)

为什么抓取社交媒体内容?品牌分析与监测:通过抓取品牌、产品或服务相关的社交媒体数据,可以获得公众对其的评价,识别市场趋势,制定营销策略。情感分析:分析用户在社交平台上的情感倾向,如对某事件、产品、服务的正面或负面情绪。舆情监控:通过抓取大量社交媒体内容,监测公众对热点事件的反应,发现潜在的社会问题。用户行为分析社交媒体的数据类型:帖子和内容:包括用户发布的文本、图片、视频等。用户互动用户信息:包括用户名、粉丝数、关注数等社交信息。社交媒体的反爬虫机制:API限制。

2201_76125261的博客 1337

Linux中open、write、read、close系统调用

个人学习整理 如有不足之处 请不吝指教 open系统调用 open函数的三个参数: (1)path是已经存在的文件的路径; (2)oflags参数:若值为 O_RDONLY ,就以只读方式打开文件;                若值为 O_WDONLY,就以只写方式打开文件;                若值为 O_RDWR,就以读写方式打开文件; (3)

MOON5555的博客 1万+

实验7:机器学习油田产量预测-代码数据-完整代码数据可直接运行-计算机毕设

实验7:机器学习油田产量预测-代码数据-完整代码数据可直接运行-计算机毕设

机器学习深度学习业余选手 477

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

read和write系统调用

http://blog.chinaunix.net/space.php?uid=12567959&do=blog&id=161002 read()和write()系统调用 read()和write()系统调用非常相似。它们都需要三个参数:一个文件描述符fd,一个内存区的地址buf(该缓冲区包含接受的数据或者要传送的数据的存放位置),以及一个数count(指定应该传送多少字节)。两个系统调

wosiwozaiwhy的专栏 1323

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

系统调用:write、open、read

一、open      简单来说,open建立了一条到文件或设备的访问路径。如果调用成功,它则返回一个可以被read、write和其他系统调用使用的文件描述符。这个文件描述符是惟一的,它不会与其他任何运行中的进程共享,如果两个程序同时打开同一个文件,他们会分别得到两个不同的文件描述符。如果他们都对文件进行写操作,那么它们会各写各的,它们分别接着上次离开的位置继续往下写。它们的数据不会交织在一起,...

qq_41727218的博客 1548

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

linux 系统调用 read,write和lseek 使用

read系统调用 头文件 #include <unistd.h> 函数使用 ssize_t read(int fd, void *buf, size_t count) read 函数会从文件描述符fd中读取指定的count长度的内容,并且将读到的结果放入到buf缓冲区中 返回值 count 读取成功,则会返回读到的字节数 小于count 表示同样读取成功,只是fd从current o...

天行健,地势坤 3007

Linux系统调用read、write

​ 《Linux系统调用》整体介绍了系统调用,本文重点分析其中read、write的实现与使用方法。

OneSea 654

Linux的系统调用open,write,read,close,及相关总结

在进行C语言学习的时候我们了解到了C语言相关的一些IO操作,如fopen,fwrite,fread,fprintf,fclose等相关函数,他们都是由C库函数提供的一些函数,是将操作系统的系统调用加以封装,虽说Linux是由C语言实现的,但为了使我们更加的了解Linux,就需要了解更接近与底层的一些IO操作,因此就需要来了解下基本的系统调用—open,write,read,close 首先我们来...

erwuhuoche的博客 1211
上一篇: 关于might_sleep的一点说明---CONFIG_DEBUG_ATOMIC_SLEEP【转】
下一篇: gic驱动
你板子冒烟了
博客等级 码龄8年 1278粉丝 582原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值