<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    隨筆 - 53, 文章 - 0, 評(píng)論 - 3, 引用 - 0
    數(shù)據(jù)加載中……

    Linux 內(nèi)核源碼閱讀 - write 系統(tǒng)調(diào)用的實(shí)現(xiàn)

    最近在看write系統(tǒng)調(diào)用的實(shí)現(xiàn),雖然還有一下細(xì)節(jié)不是很清楚,但是大致的實(shí)現(xiàn)機(jī)理還是有一定的理解了??偨Y(jié)如下:
    這里假設(shè)最普通的情況,不考慮Direct IO 的情況。從全家的高度看,要往一個(gè)文件中寫入內(nèi)容,需要一下幾步。
    1. sys_write 將用戶進(jìn)程要寫的內(nèi)容寫入到內(nèi)核的文件頁(yè)面緩沖中。sys_write 本身到此就結(jié)束了。
    2. pdflush 內(nèi)核線程(定期或者由內(nèi)核閾值觸發(fā))刷新臟的頁(yè)面緩沖,其實(shí)只是提交IO請(qǐng)求給底層的驅(qū)動(dòng)。
    3. IO請(qǐng)求并不是同步執(zhí)行的,而是由底層的驅(qū)動(dòng)調(diào)度執(zhí)行,發(fā)出DMA操作指令。
    4. 物理IO完成之后會(huì)中斷并通知內(nèi)核,內(nèi)核負(fù)責(zé)更新IO的狀態(tài)。
    先要去陪兒子睡覺了。有空會(huì)繼續(xù)細(xì)化各個(gè)部分的實(shí)現(xiàn)。

    sys_write 的調(diào)用過(guò)程。(我的linux內(nèi)核版本為2.6.24,文件系統(tǒng)為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一個(gè)文件是初始化的函數(shù)指針,ext3文件系統(tǒng)對(duì)應(yīng)的函數(shù)為do_sync_write。
    下面是其實(shí)現(xiàn)的要點(diǎn)。
     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); 是實(shí)現(xiàn)的核心,其函數(shù)指針指向ext3_file_write。
    307行的作用在于等待IO的完成。這里的IO完成指的是進(jìn)入IO的隊(duì)列而已,不是物理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);

    以下的調(diào)用序列還很長(zhǎng),一時(shí)還消化不了。僅供自己參考。

    posted on 2008-06-02 21:43 InPractice 閱讀(2606) 評(píng)論(0)  編輯  收藏


    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 永久免费在线观看视频| 亚洲JLZZJLZZ少妇| a级毛片免费观看网站| 亚洲av日韩av欧v在线天堂| 亚洲成a人无码亚洲成av无码| 三年片在线观看免费大全| 亚洲av无码电影网| 黄色网址免费大全| 99久久婷婷国产综合亚洲| 看全色黄大色大片免费久久| 亚洲av无码成人精品区一本二本| 国产婷婷高清在线观看免费| 理论片在线观看免费| 伊伊人成亚洲综合人网7777| 久久这里只精品热免费99| 亚洲国产日韩在线| 日韩一区二区免费视频| 一级毛片**免费看试看20分钟| 日韩亚洲一区二区三区| 日韩在线播放全免费| 亚洲av无码专区在线观看亚| 亚洲一区二区三区在线播放| 精品在线免费观看| 91丁香亚洲综合社区| 亚洲国产a级视频| 全免费a级毛片免费看| 亚洲AV成人无码天堂| 亚洲精品久久久www| 99久久精品免费精品国产| 亚洲电影在线免费观看| 永久免费无码网站在线观看| 成人免费乱码大片A毛片| 亚洲成a人片在线网站| 亚洲AV成人精品日韩一区18p| 久久免费视频网站| 亚洲狠狠色丁香婷婷综合| 精品国产亚洲一区二区三区| 毛片免费观看网址| 一个人免费视频观看在线www | 亚洲综合久久成人69| 免费毛片网站在线观看|