日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > linux >内容正文

linux

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

發(fā)布時(shí)間:2025/3/8 linux 37 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux实现自己的write函数,Linux 内核源码阅读 - write 系统调用的实现 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

最近在看write系統(tǒng)調(diào)用的實(shí)現(xiàn),雖然還有一下細(xì)節(jié)不是很清楚,但是大致的實(shí)現(xiàn)機(jī)理還是有一定的理解了。總結(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)。

先要去陪兒子睡覺(jué)了。有空會(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 閱讀(2385) 評(píng)論(0) ?編輯 ?收藏

創(chuàng)作挑戰(zhàn)賽新人創(chuàng)作獎(jiǎng)勵(lì)來(lái)咯,堅(jiān)持創(chuàng)作打卡瓜分現(xiàn)金大獎(jiǎng)

總結(jié)

以上是生活随笔為你收集整理的linux实现自己的write函数,Linux 内核源码阅读 - write 系统调用的实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。