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)  编辑  收藏

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值