国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Linux-0.11 文件系統(tǒng)file_dev.c詳解

這篇具有很好參考價值的文章主要介紹了Linux-0.11 文件系統(tǒng)file_dev.c詳解。希望對大家有所幫助。如果存在錯誤或未考慮完全的地方,請大家不吝賜教,您也可以點擊"舉報違法"按鈕提交疑問。

Linux-0.11 文件系統(tǒng)file_dev.c詳解

模塊簡介

該文件主要提供了普通文件的讀寫方法file_readfile_write,這兩個函數(shù)在系統(tǒng)調(diào)用_sys_read和sys_write中被調(diào)用。

函數(shù)詳解

file_read

int file_read(struct m_inode * inode, struct file * filp, char * buf, int count)

該函數(shù)是文件讀的函數(shù)。

首先定義了一些參數(shù),這里不做介紹,下面用到時,再詳解。

int left,chars,nr;
struct buffer_head * bh;

接著進行參數(shù)的校驗, 如果入?yún)ount等于0, 代表不讀任何數(shù)據(jù),則直接返回0。

if ((left=count)<=0)
    return 0;

接下來,只要left值不為0,那么首先調(diào)用bmap函數(shù)(inode.c)獲取當(dāng)前文件指針指向的數(shù)據(jù)塊磁盤上的位置nr(nr是絕對位置)。得到nr值之后,調(diào)用bread函數(shù)讀取一個盤塊的數(shù)據(jù)到bh塊中。

while (left) {
    if ((nr = bmap(inode,(filp->f_pos)/BLOCK_SIZE))) {
        if (!(bh=bread(inode->i_dev,nr)))
            break;
    } else
        bh = NULL;

接下來計算文件指針指向的數(shù)據(jù)塊中還剩下多少內(nèi)容,將其和left相比,計算出兩者較小值賦值給chars。接著將文件指針加上chars,將left減去chars。

nr = filp->f_pos % BLOCK_SIZE;
chars = MIN( BLOCK_SIZE-nr , left );
filp->f_pos += chars;
left -= chars;

接下來便開始本輪的文件讀,調(diào)用put_fs_bytes拷貝數(shù)據(jù)到buf中。本輪讀寫之后,如果left不為0,則還會進入下一輪循環(huán)。

if (bh) {
    char * p = nr + bh->b_data;
    while (chars-->0)
        put_fs_byte(*(p++),buf++);
    brelse(bh);
} else {
    while (chars-->0)
        put_fs_byte(0,buf++);
}

程序運行到此,代表已經(jīng)讀完了要讀的數(shù)據(jù)。最后修改了文件的atime屬性。返回讀取的字節(jié)數(shù)。

    inode->i_atime = CURRENT_TIME;//更新訪問時間
    return (count-left)?(count-left):-ERROR;

file_write

int file_write(struct m_inode * inode, struct file * filp, char * buf, int count)

該函數(shù)是文件寫的函數(shù)。

首先定義了一些參數(shù),這里不做介紹,下面用到時,再詳解。

    off_t pos;
    int block,c;
    struct buffer_head * bh;
    char * p;
    int i=0;

當(dāng)flag中設(shè)置了O_APPEND參數(shù)時,將pos指針指向文件尾。否則指向當(dāng)前文件指針的位置。

    if (filp->f_flags & O_APPEND)
        pos = inode->i_size;
    else
        pos = filp->f_pos;

接下來,當(dāng)i小于count時進入循環(huán),首先調(diào)用create_block從磁盤上獲取一個邏輯塊號,調(diào)用bread將磁盤塊中的內(nèi)容拷貝到bh中。

    while (i<count) {
        if (!(block = create_block(inode,pos/BLOCK_SIZE)))//該block是絕對位置
            break;
        if (!(bh=bread(inode->i_dev,block)))
            break;

對于當(dāng)前的邏輯塊,其已經(jīng)寫 pos % BLOCK_SIZE個字節(jié), 其距離數(shù)據(jù)塊的末尾還有(BLOCK_SIZE - c)個字節(jié)。

    c = pos % BLOCK_SIZE;  
    p = c + bh->b_data;
    bh->b_dirt = 1;
    c = BLOCK_SIZE-c;//當(dāng)前數(shù)據(jù)塊還剩多少空間
    if (c > count-i) c = count-i;
    pos += c;
    if (pos > inode->i_size) {
        inode->i_size = pos;
        inode->i_dirt = 1;
    }
    i += c;

最后調(diào)用get_fs_bytes指針將buf中的數(shù)據(jù)拷貝到bh塊中。

    while (c-->0)
        *(p++) = get_fs_byte(buf++);
    brelse(bh);

程序的最后,更新i節(jié)點的m_time。如果本次操作不是在文件尾添加數(shù)據(jù),則將讀寫指針調(diào)整到當(dāng)前讀寫位置pos處。修改i節(jié)點的change time為當(dāng)前時間。

    inode->i_mtime = CURRENT_TIME;
    if (!(filp->f_flags & O_APPEND)) {
        filp->f_pos = pos;
        inode->i_ctime = CURRENT_TIME;
    }

Q & A

1.i_atime/i_ctime/i_mtime的區(qū)別是什么?

i_atime:文件最后訪問時間,即是文件最后的讀取時間,例如:用命令cat filename,此時間修改,其他兩個時間不修改。

i_ctime:結(jié)點最后修改時間,即是修改inode結(jié)構(gòu)的時間,例如:用命令ln filename1 filename2,此時間修改,其他兩個時間不修改。

i_mtime:文件最后修改時間,即是對文件內(nèi)容的修改時間,例如:用命令echo aaa >filename,以上三個時間都修改。文章來源地址http://www.zghlxwxcb.cn/news/detail-464694.html

到了這里,關(guān)于Linux-0.11 文件系統(tǒng)file_dev.c詳解的文章就介紹完了。如果您還想了解更多內(nèi)容,請在右上角搜索TOY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實不符,請點擊違法舉報進行投訴反饋,一經(jīng)查實,立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費用

相關(guān)文章

  • 操作系統(tǒng)實驗 2.3系統(tǒng)調(diào)用:linux-0.11-lab “為版本0內(nèi)核增加一個系統(tǒng)調(diào)用getjiffies” 和 “在用戶程序中使用新增的系統(tǒng)調(diào)用”

    操作系統(tǒng)實驗 2.3系統(tǒng)調(diào)用:linux-0.11-lab “為版本0內(nèi)核增加一個系統(tǒng)調(diào)用getjiffies” 和 “在用戶程序中使用新增的系統(tǒng)調(diào)用”

    打開 vscode ,在如圖所示位置打開 ~/os/linux-0.11-lab/0 文件夾 1.定義getjiffies系統(tǒng)調(diào)用 題目中給的提示:進入到 unistd.h 文件中 閱讀代碼,可以發(fā)現(xiàn)上圖劃線處有個系統(tǒng)調(diào)用名為 getpid :返回當(dāng)前進程號——這與我們期望實現(xiàn)的功能類似:通過系統(tǒng)調(diào)用返回jiffies值。 于是此時希望

    2023年04月08日
    瀏覽(109)
  • Linux 0.11: 從開機到執(zhí)行shell

    Linux 0.11: 從開機到執(zhí)行shell

    參考閃客的系列,將開機到執(zhí)行shell的整個過程濃縮成本文。 https://github.com/dibingfa/flash-linux0.11-talk 當(dāng)按下開機鍵的那一刻,在主板上提前寫死的固件程序? BIOS ?會將硬盤中 啟動區(qū)的 512 字節(jié) 的數(shù)據(jù),原封不動復(fù)制到 內(nèi)存中的 0x7c00 ?這個位置,并跳轉(zhuǎn)到那個位置進行執(zhí)行。

    2024年04月13日
    瀏覽(15)
  • Linux /dev目錄詳解和Linux系統(tǒng)各個目錄的作用

    在linux下,/dev目錄是很重要的,各種設(shè)備都在下面。下面簡單總結(jié)一下: dev是設(shè)備(device)的英文縮寫。 /dev這個目錄對所有的用戶都十分重要。 因為在這個目錄中包含了所有Linux系統(tǒng)中使用的外部設(shè)備。但是這里并不是放的外部設(shè)備的驅(qū)動程序,這一點和 windows ,dos操作系統(tǒng)不

    2024年04月11日
    瀏覽(22)
  • 【npm run dev報錯】無法加載文件 C:\Program Files\nodejs\npm.ps1,因為在此系統(tǒng)上禁止運行腳本。

    1.win+X鍵,使用管理員身份運行power shell 2.輸入命令:set-executionpolicy remotesigned 3.輸入”Y“,回車,問題解決。 文章來源: 無法加載文件 C:Program Filesnodejsnpm.ps1,因為在此系統(tǒng)上禁止運行腳本。 - 前端知然 - 博客園 (cnblogs.com) https://www.cnblogs.com/chenzhiran/p/12080349.html

    2024年02月12日
    瀏覽(20)
  • 1.Linux開機卡在/dev/sda1:clean,***files,***blocks解決方案

    ##1. 出現(xiàn)原因 linux開機時顯示器卡在卡在/dev/sda1:clean,***files,***blocks無法進入系統(tǒng)的原因可能是顯卡驅(qū)動的問題或者系統(tǒng)升級的原因(近期內(nèi)沒有修改文件大概率是系統(tǒng)升級導(dǎo)致的驅(qū)動問題),也可能是磁盤空間問題。 linux開機時顯示器卡在卡在/dev/sda1:clean,***files,***blo

    2024年02月15日
    瀏覽(11)
  • linux部署File Browser文件管理系統(tǒng)

    File Browser是go語言編寫的軟件,可以通過瀏覽器對服務(wù)器上的文件進行管理 瀏覽器訪問地址:http://x.x.x.x:8080 默認(rèn)用戶名密碼 admin/admin 初始化數(shù)據(jù)庫 使用filebrowser命令修改filebrowser服務(wù)的相關(guān)參數(shù),修改filebrowser服務(wù)監(jiān)聽地址為0.0.0.0,可以執(zhí)行以下命令。 修改filebrowser服務(wù)監(jiān)

    2024年02月21日
    瀏覽(21)
  • windows一鍵安裝redis7.0.11

    windows一鍵安裝redis7.0.11

    下載地址: https://gitcode.net/zengliguang/windows_redis7.0.11_offline_install.git ? 使用git進行進行clone下載?? 在電腦桌面或者其他文件夾下?,鼠標(biāo)右鍵點擊? 選擇git?clone??,下圖中url為下載地址,Directory為本地存儲路徑,點擊ok開始下載 如下圖所示已成功下載 ? 雙擊?redis-install-win.ba

    2024年02月08日
    瀏覽(27)
  • Win11 更新繞過TPM2.0 方法 最新最簡單 親測有效 Win11系統(tǒng)更新 DEV方式

    Win11 更新繞過TPM2.0 方法 最新最簡單 親測有效 Win11系統(tǒng)更新 DEV方式

    最新的win11內(nèi)測把不符合硬件規(guī)定的人都排除出去了,雖然有注冊表導(dǎo)入可以擠到DEV通道, 不過在更新到8%會彈出顯示設(shè)備不支持提示,關(guān)閉窗口后升級被取消。因此特在實踐后教大家如何繞過TPM2.0 更新的方法 。和正常更新一模一樣,不會造成任何數(shù)據(jù)丟失等問題! 1.沒有

    2024年02月07日
    瀏覽(29)
  • 【公告】BSV節(jié)點軟件發(fā)布最新升級版本v1.0.11

    【公告】BSV節(jié)點軟件發(fā)布最新升級版本v1.0.11

    發(fā)表時間:2022年4月21日 信息來源:bitcoinsv.io 本次新發(fā)布的v1.0.11是基于v1.0.10版的推薦升級版本,對交易費的配置選項進行了一些更改,并修復(fù)了一些錯誤。? 本次發(fā)布的軟件里,相較此前版本的變更內(nèi)容具體如下: 對以下配置選項進行了更名 ?-blockmintxfee 默認(rèn)禁用 Bloom 過濾

    2023年04月08日
    瀏覽(49)
  • 阿里巴巴開源Chat2DB v1.0.11 初體驗

    阿里巴巴開源Chat2DB v1.0.11 初體驗

    作為一名阿里巴巴開源項目的擁護者,從Chat2DB開源至今都有關(guān)注這個開源項目,因為之前的版本還存在較多BUG,暫時就沒有分享,目前升級到 v1.0.11 版本后,我來談?wù)勎覀€人的一個使用感受 Chat2DB 是一款有開源免費的多數(shù)據(jù)庫客戶端工具,支持windows、mac本地安裝,也支持服

    2024年02月09日
    瀏覽(24)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包