linux实现自己的write函数,Linux 内核源码阅读 - write 系统调用的实现

最近在看write系统调用的实现,虽然还有一下细节不是很清楚,但是大致的实现机理还是有一定的理解了。总结如下:

这里假设最普通的情况,不考虑Direct IO 的情况。从全家的高度看,要往一个文件中写入内容,需要一下几步。

1. sys_write 将用户进程要写的内容写入到内核的文件页面缓冲中。sys_write 本身到此就结束了。

2. pdflush 内核线程(定期或者由内核阈值触发)刷新脏的页面缓冲,其实只是提交IO请求给底层的驱动。

3. IO请求并不是同步执行的,而是由底层的驱动调度执行,发出DMA操作指令。

4. 物理IO完成之后会中断并通知内核,内核负责更新IO的状态。

先要去陪儿子睡觉了。有空会继续细化各个部分的实现。

sys_write 的调用过程。(我的linux内核版本为2.6.24,文件系统为ext3)

asmlinkage ssize_t sys_write(unsigned int fd, const char __user * buf, size_t count)

vfs_write(file, buf, count, &pos);

file->f_op->write(file, buf, count, pos);

这里的file->fop 是在open一个文件是初始化的函数指针,ext3文件系统对应的函数为do_sync_write。

下面是其实现的要点。

for (;;) {

300                 ret = filp->f_op->aio_write(&kiocb, &iov, 1, kiocb.ki_pos);

301                 if (ret != -EIOCBRETRY)

302                         break;

303                 wait_on_retry_sync_kiocb(&kiocb);

304         }

305

306         if (-EIOCBQUEUED == ret)

307                 ret = wait_on_sync_kiocb(&kiocb);

filp->f_op->aio_write(&kiocb, &iov, 1, kiocb.ki_pos); 是实现的核心,其函数指针指向ext3_file_write。

307行的作用在于等待IO的完成。这里的IO完成指的是进入IO的队列而已,不是物理IO的完成。

generic_file_aio_write(iocb, iov, nr_segs, pos);

__generic_file_aio_write_nolock(iocb, iov, nr_segs,  &iocb->ki_pos);

generic_segment_checks(iov, &nr_segs, &ocount, VERIFY_READ);

generic_file_buffered_write(iocb, iov, nr_segs, pos,ppos,count,written);

generic_file_direct_IO(WRITE, iocb, iov, pos, *nr_segs);

以下的调用序列还很长,一时还消化不了。仅供自己参考。

posted on 2008-06-02 21:43 InPractice 阅读(2385) 评论(0)  编辑  收藏

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/533172.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux7.0使用教程,CentOS7.0使用手册精编.pdf

CentOS7.0 手册第一部分:显卡驱动安装篇 (针对单显卡而言)或许CentOS7.0 版本是遇到的装显卡驱动最烦的一个,相比Ubuntu 、CentOS7.0 之前版本(如:CentOS6.5、CentOS6.4 )而言,操作步骤如下:由于笔者我的显卡是华硕圣骑…

linux中s权限大小写的区别,Linux中的权限

1.文件与目录权限1)UID与GIDUIDUID是一个数值,是Linux系统中唯一的用户标识,用于区别不同的用户。在系统内部管理进程和文件保护时使用UID字段。在Linux系统中,注册名和UID都可以用于标识用户,只不过对于系统来说UID更为重要&…

linux中shell自动对齐代码,linux – Shell编程 – 如何printf像表一样对齐我的输出?...

如何printf像表格一样对齐我的输出?Title AuthorBaokyBook Baoky2Use basename commandUse basename command .. Baoky我的部分代码是这样的titlelength${#title};首先我获得标题长度,然后我就像这样打印titlespaceexpr 60 - titlelength;printf "%s %${titles…

linux的安装组和管理组的区别吗,Linux用户和组管理

Linux用户和组管理安装上下文:进程以其发起者的身份运行;进程对文件的访问权限,取决于发起此进程的用户的权限;系统用户:为了能够让那后台进程或服务类进程以非管理员的身份运行,通常需要为此创建多个普通用…

在linux下vcd光盘提取,linux下抓取Vcd的视频文件[Linux安全]

赞助商链接本文“linux下抓取Vcd的视频文件[Linux安全]”是由七道奇为您精心收集,来源于网络转载,文章版权归文章作者所有,本站不对其观点以及内容做任何评价,请读者自行判断,以下是其具体内容:LP的瑜伽碟需…

Linux清mysql磁盘,mysql与linux ~ 磁盘分析与调优

一 简介 谈谈磁盘IO的问题二 目的:如何进行IO性能问题的排查二 linux角度一 机械硬盘基本定义寻道时间,表示磁头在不同磁道之间移动的时间(最耗时)。旋转延迟,表示在磁道找到时,中轴带动盘面旋转到合适的扇区开头处。传输时间,表…

arm与linux的些许问题,《ARM与Linux些许问题》第一章:ARM工作模式

早期的ARM核有状态(ARM或Thumb)切换(通过BX等指令修改CPSR寄存器(当前程序状态寄存器,存放条件码标志,中断禁止位,当前处理器模式以及其他状态和控制信息)中T的控制位完成程序状态的切换),现在ARM都只使用Thumb状态了。所以&#…

c语言给定一个字符串匹配,使用C语言解决字符串匹配问题的方法

最常想到的方法是使用KMP字符串匹配算法&#xff1a;#include #include #include int get_nextval(char *pattern,int next[]){//get the next value of the patternint i 0,j -1;next[0] -1;int patlen strlen(pattern);while ( i < patlen - 1){if ( j -1 || pattern…

c语言比较大小 谁大选谁,C语言比较优先级

满意答案wanggq2222018.03.14采纳率&#xff1a;42% 等级&#xff1a;7已帮助&#xff1a;57人#pragma once#include#include#include #includeusing namespace std;typedef struct SymKeyVal{string key;int val;};static SymKeyVal KeyValTable[]{{"",0},{"…

c语言ip地址吗,C语言:判断IP地址是否合法

int is_valid_ip(const char *ip){int section 0; //每一节的十进制值int dot 0; //几个点分隔符int last -1; //每一节中上一个字符while(*ip){if(*ip .){dot;if(dot > 3){return 0;}if(section > 0 && section <255){section 0;}else{retur…

10100的素数c语言程序,C语言基础题目及代码.doc

/*读入一个自然数n&#xff0c;计算其各位数字之和&#xff0c;用汉语拼音写出和的每一位数字。输入格式&#xff1a;每个测试输入包含1个测试用例&#xff0c;即给出自然数n的值。这里保证n小于10100。输出格式&#xff1a;在一行内输出n的各位数字之和的每一位&#xff0c;拼…

c语言闰年的判断条件DS1302,DS1302驱动程序(平年和闰年天数自动调整)

/*********************************************************************************1.本程序能够显示年&#xff0c;月&#xff0c;日&#xff0c;时&#xff0c;分&#xff0c;秒&#xff0c;星期七个参数.2.时间和日期可调。可分别完成年&#xff0c;月&#xff0c;日&am…

android 图片切割代码,Android用clip剪切图像资源

使用clip剪切图像资源可以做进度条&#xff0c;图像慢慢展开的效果&#xff0c;他使用以下几个属性来控制效果&#xff1a;android:drawable&#xff1a;指定要剪切的原图像。android:clipOrientation&#xff1a;截取的方向。可取的值&#xff1a;horizontal和vertical。分别表…

android gradle错误,Android studio gradle错误与顶级异常

我最近更新了我的Android Studio,从那以后我的项目没有构建...我得到错误,如下面的错误:Error Code:1Output:UNEXPECTED TOP-LEVEL EXCEPTION:com.android.dx.cf.iface.ParseException:class name (org/pervasivesystems/mobilehealth/activities/AppSettingsActivity$AppSetti…

Android中列表动态删除item,如何删除Android ExpandableListView中某个group item的child item?...

自定义了一个expandablelistview 想要删除其中的子项list使用remove方法把list中的指定项删除了11-09 21:04:20.585: I/MainActivity(13557): childData[{child_textsecond}, {child_textthird}]但是在expandablelistview界面显示中&#xff0c;并没有变化,并且还有list溢出报错…

android 首页广告显示不出来的,android – Admob插页式广告(全屏)不会显示

您没有为interstitialAd调用loadAd().广告插播广告应在您展示广告之前加载.interstitialAd.loadAd(adRequest);你也应该在调用show()之前检查它是否已加载.它可能无法立即使用,您可能希望在调用show之前提前加载它.if(mInterstitial.isLoaded()){mInterstitial.show();AdReques…

android新建项目错误,新建Android项目出错

新建Android项目出以下的错误&#xff1a;C:\Users\txxs\workspace\4sd\res\values\styles.xml:7: error: Error retrieving parent for item: No resource found that matches the given name Theme.AppCompat.Light.[2016-11-23 11:57:46 - 4sd][2016-11-23 11:57:46 - 4sd] …

android 图片 切换,Android 应用开发笔记 - 切换图片(ImageSwitcher)

在面板拖拽图标&#xff0c;然后更改相关属性(Properties)&#xff0c;如下&#xff1a;android:id"id/imgSwit01"android:layout_width"wrap_content"android:layout_height"wrap_content" />ImageSwitcher使用的是setFactory()方法&#xf…

android layout.inflater,Android - LayoutInflater

在实际开发中LayoutInflater这个类还是非常有用的&#xff0c;它的作用类似于findViewById()。不同点是LayoutInflater是用来找res/layout/下的xml布局文件&#xff0c;并且实例化&#xff1b;而findViewById()是找xml布局文件下的具体widget控件(如Button、TextView等)。具体作…

android preferenceactivity 源码,PreferenceActivity PreferenceScreen (3.0/API 11 以前)

Android提供了一个XML驱动的框架&#xff0c;用于为应用程序创建系统样式的PreferenceScreen.(3.0/API 11 以前)是这样使用的看代码&#xff1a;mypreference.xmlandroid:key"PREF_AUTO_REFRESH"android:defaultValue"true"android:summary"select to…