隨筆 - 53, 文章 - 0, 評論 - 3, 引用 - 0
          數據加載中……

          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 閱讀(2605) 評論(0)  編輯  收藏


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          主站蜘蛛池模板: 井研县| 南汇区| 兰考县| 宁南县| 四川省| 东丰县| 亚东县| 诸暨市| 祁阳县| 阜康市| 齐齐哈尔市| 吉林市| 佳木斯市| 洛阳市| 天长市| 华容县| 华安县| 三明市| 克拉玛依市| 南投市| 博白县| 凌源市| 台中县| 嘉禾县| 饶河县| 革吉县| 金堂县| 磴口县| 长顺县| 平定县| 镇原县| 合肥市| 越西县| 博客| 大庆市| 汤阴县| 崇信县| 大名县| 安徽省| 虞城县| 莎车县|