精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

我們一起學學加載根文件系統

系統 其他OS
可是硬盤中憑什么就有了這些信息呢?這就是個雞生蛋蛋生雞的問題了。你可以先寫一個操作系統,然后給一個硬盤做某種文件系統類型的格式化,這樣你就得到一個有文件系統的硬盤了,有了這個硬盤,你的操作系統就可以成功啟動了。

書接上回,上回書咱們說到,我們已經把硬盤的基本信息存入了 hd_info[]。

把硬盤的分區信息存入了 hd[]。

并且留了個讀取硬盤數據的 bread 函數沒有講,等主流程講完再展開這些函數的細節,我知道這是你們關心的內容。

這些都是 setup 方法里做的事情,也就是進程 0 fork 出的進程 1 所執行的第一個方法。

今天我們說 setup 方法中的最后一個函數 mount_root。

int sys_setup(void * BIOS) {
...
mount_root();
}

mount_root 直譯過來就是加載根。

再多說幾個字是加載根文件系統,有了它之后,操作系統才能從一個根兒開始找到所有存儲在硬盤中的文件,所以它是文件系統的基石,很重要。

我們翻開看看。

void mount_root(void) {
int i,free;
struct super_block * p;
struct m_inode * mi;

for(i=0;i<64;i++)
file_table[i].f_count=0;

for(p = &super_block[0] ; p < &super_block[8] ; p++) {
p->s_dev = 0;
p->s_lock = 0;
p->s_wait = NULL;
}
p=read_super(0);
mi=iget(0,1);

mi->i_count += 3 ;
p->s_isup = p->s_imount = mi;
current->pwd = mi;
current->root = mi;
free=0;
i=p->s_nzones;
while (-- i >= 0)
if (!set_bit(i&8191,p->s_zmap[i>>13]->b_data))
free++;

free=0;
i=p->s_ninodes+1;
while (-- i >= 0)
if (!set_bit(i&8191,p->s_imap[i>>13]->b_data))
free++;
}

很簡單。

從整體上說,它就是要把硬盤中的數據,以文件系統的格式進行解讀,加載到內存中設計好的數據結構,這樣操作系統就可以通過內存中的數據,以文件系統的方式訪問硬盤中的一個個文件了。

那其實搞清楚兩個事情即可:

第一,硬盤中的文件系統格式是怎樣的?

第二,內存中用于文件系統的數據結構有哪些?

我們一個個來。

硬盤中的文件系統格式是怎樣的?

首先硬盤中的文件系統,無非就是硬盤中的一堆數據,我們按照一定格式去解析罷了。Linux-0.11 中的文件系統是 MINIX 文件系統,它就長成這個樣子。

每一個塊結構的大小是 1024 字節,也就是 1KB,硬盤里的數據就按照這個結構,妥善地安排在硬盤里。

可是硬盤中憑什么就有了這些信息呢?這就是個雞生蛋蛋生雞的問題了。你可以先寫一個操作系統,然后給一個硬盤做某種文件系統類型的格式化,這樣你就得到一個有文件系統的硬盤了,有了這個硬盤,你的操作系統就可以成功啟動了。

總之,想個辦法給這個硬盤寫上數據唄。

好了,現在我們簡單看看 MINIX 文件系統的格式。

引導塊就是我們系列最開頭說的啟動區,當然不一定所有的硬盤都有啟動區,但我們還是得預留出這個位置,以保持格式的統一。

超級塊用于描述整個文件系統的整體信息,我們看它的字段就知道了,有后面的 inode 數量,塊數量,第一個塊在哪里等信息。有了它,整個硬盤的布局就清晰了。

inode 位圖和塊位圖,就是位圖的基本操作和作用了,表示后面 inode 和塊的使用情況,和我們之前講的內存占用位圖 mem_map[] 是類似的。

再往后,inode 存放著每個文件或目錄的元信息和索引信息,元信息就是文件類型、文件大小、修改時間等,索引信息就是大小為 9 的 i_zone[9] 塊數組,表示這個文件或目錄的具體數據占用了哪些塊。

其中塊數組里,0~6 表示直接索引,7 表示一次間接索引,8 表示二次間接索引。當文件比較小時,比如只占用 2 個塊就夠了,那就只需要 zone[0] 和 zone[1] 兩個直接索引即可。

再往后,就都是存放具體文件或目錄實際信息的塊了。如果是一個普通文件類型的 inode 指向的塊,那里面就直接是文件的二進制信息。如果是一個目錄類型的 inode 指向的塊,那里面存放的就是這個目錄下的文件和目錄的 inode 索引以及文件或目錄名稱等信息。

好了,文件系統格式的說明,我們就簡單說明完畢了,MINIX 文件系統已經過時。

內存中用于文件系統的數據結構有哪些?

趕緊回過頭來看我們的代碼,是如何加載以這樣一種格式存放在硬盤里的數據,以被我們操作系統所管控的。

從頭看。

struct file {
unsigned short f_mode;
unsigned short f_flags;
unsigned short f_count;
struct m_inode * f_inode;
off_t f_pos;
};

void mount_root(void) {
for(i=0;i<64;i++)
file_table[i].f_count=0;
...
}

把 64 個 file_table 里的 f_count 清零。

這個 file_table 表示進程所使用的文件,進程每使用一個文件,都需要記錄在這里,包括文件類型、文件 inode 索引信息等,而這個 f_count 表示被引用的次數,此時還沒有引用,所以設置為零。

而這個 file_table 的索引,就是我們通常說的文件描述符。比如有如下命令。

echo "hello" > 0

就表示把 hello 輸出到 0 號文件描述符。

0 號文件描述符是哪個文件呢?就是 file_table[0] 所表示的文件。

這個文件在哪里呢?注意到 file 結構里有個 f_inode 字段,通過 f_inode 即可找到它的 inode 信息,inode 信息包含了一個文件所需要的全部信息,包括文件的大小、文件的類型、文件所在的硬盤塊號,這個所在硬盤塊號,就是文件的位置咯。

接著看。

struct super_block super_block[8];
void mount_root(void) {
...
struct super_block * p;
for(p = &super_block[0] ; p < &super_block[8] ; p++) {
p->s_dev = 0;
p->s_lock = 0;
p->s_wait = NULL;
}
...
}

又是把一個數組 super_block 做清零工作。

這個 super_block 存在的意義是,操作系統與一個設備以文件形式進行讀寫訪問時,就需要把這個設備的超級塊信息放在這里。

這樣通過這個超級塊,就可以掌控這個設備的文件系統全局了。

果然,接下來的操作,就是讀取硬盤的超級塊信息到內存中來。

void mount_root(void) {
...
p=read_super(0);
...
}

read_super 就是讀取硬盤中的超級塊。

接下來,讀取根 inode 信息。

struct m_inode * mi;
void mount_root(void) {
...
mi=iget(0,1);
...
}

然后把該 inode 設置為當前進程(也就是進程 1)的當前工作目錄和根目錄。

void mount_root(void) {
...
current->pwd = mi;
current->root = mi;
...
}

然后記錄塊位圖信息。

void mount_root(void) {
...
i=p->s_nzones;
while (-- i >= 0)
set_bit(i&8191, p->s_zmap[i>>13]->b_data);
...
}

最后記錄 inode 位圖信息。

void mount_root(void) {
...
i=p->s_ninodes+1;
while (-- i >= 0)
set_bit(i&8191, p->s_imap[i>>13]->b_data);
}

就完事了。

其實整體上就是把硬盤中文件系統的各個信息,搬到內存中。之前的圖可以說非常直觀了。

有了內存中的這些結構,我們就可以順著根 inode,找到所有的文件了。

至此,加載根文件系統的 mount_root 函數就全部結束了。同時,讓我們回到全局視野,發現 setup 函數也一并結束了。

void main(void) {
...
move_to_user_mode();
if (!fork()) {
init();
}
for(;;) pause();
}

void init(void) {
setup((void *) &drive_info);
...
}

int sys_setup(void * BIOS) {
...
mount_root();
}

setup 的主要工作就是我們今天所講的,加載根文件系統。

我們繼續往下看 init 函數。

void init(void) {
setup((void *) &drive_info);
(void) open("/dev/tty0",O_RDWR,0);
(void) dup(0);
(void) dup(0);
}

看到這相信你也明白了。

之前 setup 函數的一番折騰,加載了根文件系統,順著根 inode 可以找到所有文件,就是為了下一行 open 函數可以通過文件路徑,從硬盤中把一個文件的信息方便地拿到。

在這里,我們 open 了一個 /dev/tty0 的文件,那我們接下來的焦點就在這個 /dev/tty0 是個啥?

責任編輯:武曉燕 來源: 低并發編程
相關推薦

2022-07-28 08:52:08

Docker命令操作系統

2022-12-09 08:34:38

嵌入式Web容器

2024-03-11 10:30:31

Linux文件系統

2021-12-14 09:34:31

丑數順序指針

2022-01-10 06:52:59

拖拽庫項目搜索

2022-09-22 08:06:29

計算機平板微信

2023-11-06 08:28:43

2024-04-29 13:07:00

運維保命原則Oracle

2024-02-28 08:47:29

文件系統數據

2021-09-15 19:02:42

Node.jsFs模塊

2023-08-02 08:35:54

文件操作數據源

2022-03-08 17:52:58

TCP格式IP

2021-07-28 07:53:20

Github ActiDotnet 應用

2022-01-17 06:59:40

Grep指令linux

2024-02-20 21:34:16

循環GolangGo

2021-08-27 07:06:10

IOJava抽象

2021-12-29 08:27:05

ByteBuffer磁盤服務器

2022-03-31 18:59:43

數據庫InnoDBMySQL

2023-06-30 08:18:51

敏捷開發模式

2023-08-10 08:28:46

網絡編程通信
點贊
收藏

51CTO技術棧公眾號

成人av动漫| 日本啊v在线| 欧美理论在线| 亚洲精品国产精品国自产在线| 草草久久久无码国产专区| 九九在线视频| 国产一区二区三区免费观看| 久久久久久久久久久久av| 波多野结衣a v在线| 久久福利在线| 婷婷综合五月天| 一区二区三区四区欧美| 图片区 小说区 区 亚洲五月| 三级一区在线视频先锋 | 国产中文字幕在线看| 久久国产精品区| 777精品视频| 国产免费久久久久| 精品国产一区二区三区久久久樱花| 538在线一区二区精品国产| 国产精品一区二区免费在线观看| 乱人伦中文视频在线| 久久这里只有精品视频网| 成人黄色在线观看| 亚洲男人天堂网址| 亚洲精选国产| 欧美第一淫aaasss性| 美国黑人一级大黄| 亚洲v天堂v手机在线| 欧美不卡在线视频| 欧美视频亚洲图片| 成人黄色视屏网站| 日韩欧美综合在线视频| 国产日韩欧美精品在线观看| 成人黄色网址| 国产精品久久久久久亚洲伦| 免费观看成人高| 男人天堂手机在线观看| 国产精品456露脸| 国产精品无码专区在线观看| 精品国产午夜福利| 国产毛片久久| 国内精品小视频在线观看| 加勒比婷婷色综合久久| 国产精品久久久久9999赢消| 国产亚洲成精品久久| 右手影院亚洲欧美| 日韩有码一区| 日韩av在线免费观看| 成人在线电影网站| 久久国产精品色av免费看| 精品国产伦一区二区三区观看方式| 婷婷激情综合五月天| 欧美激情三区| 欧美老女人在线| 在线播放av中文字幕| www一区二区三区| 9191成人精品久久| 成人免费黄色av| 日本精品视频| 亚洲成人久久一区| 亚洲熟女一区二区| 久久综合另类图片小说| 精品视频偷偷看在线观看| 瑟瑟视频在线观看| 精品产国自在拍| 色小说视频一区| 国产美女久久久久久| 国产精品啊v在线| 97在线视频免费| 黄色在线免费观看| 日日夜夜免费精品| 成人在线视频福利| 精品人妻一区二区三区日产乱码| 国产成人av电影在线| 精品一区2区三区| 国产在线小视频| 中文字幕视频一区二区三区久| 在线视频不卡国产| 日本无删减在线| 欧美午夜精品伦理| 一本岛在线视频| 精品国产三级| 亚洲精品电影在线观看| 美国美女黄色片| 亚洲欧美亚洲| 欧美亚洲国产成人精品| 亚洲永久精品一区| 国产福利精品一区二区| 久久国产精品99久久久久久丝袜| 91在线直播| 亚洲午夜在线视频| 久草在在线视频| 3d动漫一区二区三区在线观看| 日韩欧美成人激情| 麻豆精品免费视频| 欧美91精品| 热久久免费视频精品| 99在线精品视频免费观看20| 99久久伊人网影院| 影音先锋亚洲视频| 亚洲精品日产| 6080国产精品一区二区| 亚洲 欧美 日韩在线| 久久麻豆精品| 欧美亚洲午夜视频在线观看| 国产按摩一区二区三区| 久久久久久久一区| 免费的一级黄色片| 欧洲av一区二区| 亚洲国产精品久久久久秋霞蜜臀| 性少妇xx生活| 欧美亚洲网站| 不卡视频一区二区三区| 一级毛片视频在线| 欧美视频在线视频| 苍井空张开腿实干12次| 日韩在线中文| 日本一区二区不卡| 天天干天天草天天射| 亚洲精品欧美激情| 国产喷水theporn| 免费视频一区三区| 久久久久久中文字幕| 国产熟女一区二区三区五月婷 | 88在线观看91蜜桃国自产| 国产男女猛烈无遮挡a片漫画| 综合久久十次| 91免费视频网站| www.亚洲.com| 色呦呦国产精品| 熟女人妻在线视频| 亚洲视频一二| 97se亚洲综合| 亚洲羞羞网站| 欧美一卡二卡三卡| www..com.cn蕾丝视频在线观看免费版 | 国内一区二区在线| 亚洲国产欧美日韩| 日韩经典一区| 一本色道久久88综合日韩精品| 国产精品美女久久久久av爽| 成人夜色视频网站在线观看| 一级黄色片播放| 国产高清亚洲| 久久天天躁狠狠躁夜夜躁| 国产在线观看第一页| 国产拍揄自揄精品视频麻豆| 苍井空浴缸大战猛男120分钟| 亚洲精品456| 日韩av手机在线| 男女视频在线观看免费| 日韩欧美在线观看| 国产女主播喷水高潮网红在线| 亚洲欧美清纯在线制服| 欧美一级爽aaaaa大片| 欧美一区久久久| 国产一区二区三区中文| 亚洲在线视频播放| 136国产福利精品导航| 精品国产乱码久久久久久1区二区| 婷婷久久综合| 成人自拍爱视频| 国产福利片在线观看| 日韩成人在线视频网站| 国产精品久免费的黄网站| 国产视频在线观看一区二区三区 | 午夜精品区一区二区三| 福利一区在线| 欧美巨大黑人极品精男| 视频一区 中文字幕| 色综合天天综合色综合av | 亚洲欧美日韩国产综合在线| 国产xxxxhd| 亚洲黄色毛片| 视频在线精品一区| 国产电影一区| 欧美野外猛男的大粗鳮| aaa在线观看| 日韩午夜在线观看| 日韩欧美一区二区一幕| 国产日韩欧美在线一区| 久久久久久久久久毛片| 亚洲精品系列| 亚洲精品乱码久久久久久蜜桃91| 国产精品国产亚洲精品| 欧美一级高清免费| 麻豆tv在线| 亚洲精品美女在线| 91精品国产乱码久久久久| 亚洲h精品动漫在线观看| 男人天堂av电影| 国产一区二区三区av电影| 男人操女人逼免费视频| 91亚洲国产成人久久精品| 999热视频| 日本.亚洲电影| 久久久中精品2020中文| 91caoporm在线视频| 亚洲第一二三四五区| 中文字幕无线码一区| 亚洲国产精品一区二区久久恐怖片| 手机免费看av| 成人禁用看黄a在线| 国产高潮免费视频| 日韩视频一区二区三区在线播放免费观看| 婷婷久久青草热一区二区| 国产伦理久久久久久妇女 | 国产精品女人久久久| 精品美女久久久久久免费| av最新在线观看| 国产性色一区二区| 成人做爰www看视频软件| 蜜臀久久久久久久| 国产91在线视频观看| 午夜精品影院| 中文字幕一区二区三区乱码 | 色婷婷成人网| 青青草99啪国产免费| 成全电影大全在线观看| 俺去亚洲欧洲欧美日韩| 电影av一区| 日韩精品中文字| 国精品人妻无码一区二区三区喝尿 | 偷拍盗摄高潮叫床对白清晰| 欧洲毛片在线视频免费观看| 精品午夜一区二区| 加勒比色老久久爱综合网| 亚洲xxxx18| 美女视频一区| 国产精品大片wwwwww| 中文字幕资源网在线观看免费| 欧美精品xxx| 污网站在线免费看| 蜜臀久久99精品久久久无需会员| 思思99re6国产在线播放| 一本久久综合亚洲鲁鲁| 国产精品99999| 国产亚洲精品久久久久动| 黄色毛片在线看| 亚洲天堂精品在线| 免费a级毛片在线观看| 日韩久久精品电影| 青青草免费在线| 日韩精品在线观看一区二区| 亚洲av电影一区| 日韩精品在线免费| 毛片网站在线| 亚洲美女www午夜| 激情小说 在线视频| 亚洲色图美腿丝袜| 成人av电影观看| 综合网中文字幕| 婷婷在线视频观看| 精品精品国产国产自在线| 国产美女福利在线| 欧美成人一区在线| 爱情岛亚洲播放路线| 亚州成人av在线| av综合电影网站| 国产精品黄页免费高清在线观看| 国产精品高潮久久| 91精品久久久久久久久久久久久久 | 国产天堂在线| 中文字幕欧美精品在线| 好了av在线| 久久久久久久久久国产精品| 日本不卡1234视频| 国产精品免费在线免费| 国产精选久久| 久久亚洲精品欧美| 超碰成人久久| 国内少妇毛片视频| 另类国产ts人妖高潮视频| 亚洲老女人av| 国产精品一区二区在线看| 亚洲婷婷在线观看| 久久久高清一区二区三区| 成人精品一二三区| 亚洲一区二区3| 一二三区免费视频| 欧美精品在线视频| 天堂中文在线资源| 中文字幕不卡在线视频极品| 激情图片在线观看高清国产| 日韩美女激情视频| 精品一区视频| 欧美黑人3p| 综合av在线| 黄色a级片免费| 国产在线日韩欧美| 99久久久久久久久久| 欧美经典三级视频一区二区三区| 亚洲av无码一区二区三区在线| 亚洲444eee在线观看| 中文字幕乱码视频| 亚洲电影免费观看高清| 日本蜜桃在线观看| 91成人天堂久久成人| 自拍偷拍亚洲| 欧美一区二区综合| 国产精品分类| 午夜剧场在线免费观看| 97久久精品人人澡人人爽| 免费看一级大片| 福利微拍一区二区| 成人h动漫精品一区二区无码| 亚洲人成伊人成综合网久久久 | 亚洲欧美成aⅴ人在线观看| 国产综合精品视频| 精品久久人人做人人爽| 免费高清在线观看| 国产成人97精品免费看片| 荡女精品导航| 国产大尺度在线观看| 日韩一区精品字幕| 亚洲AV无码国产精品| 一区二区三区视频在线看| 在线观看日韩一区二区| 亚洲欧美在线看| wwwww亚洲| 91久久爱成人| 亚洲在线久久| 午夜免费看视频| 国产欧美久久久精品影院| 国产又大又黑又粗免费视频| 日韩区在线观看| 毛片在线视频| 国产精品一二三在线| 不卡中文字幕| 亚洲老女人av| 亚洲国产成人午夜在线一区| 五月天激情四射| 亚洲免费福利视频| 大胆人体一区| 免费久久久一本精品久久区| 亚洲精品一二| 自拍视频第一页| 亚洲免费在线视频一区 二区| 亚洲一卡二卡在线| 日韩一级黄色av| 久久夜夜久久| 永久免费精品视频网站| 久久狠狠亚洲综合| 成人黄色短视频| 欧美久久久影院| 黄色网址视频在线观看| 成人国产在线视频| 先锋资源久久| 国产sm在线观看| 亚洲电影一区二区三区| 日韩性xxxx| 欧美一级免费视频| 九九视频精品全部免费播放| 激情网站五月天| 欧美激情在线一区二区| 中文字字幕在线中文乱码| 日韩在线观看网址| 亚洲午夜剧场| 国产乱子伦精品无码专区| 成人免费观看av| √资源天堂中文在线| 国产亚洲精品一区二555| 丁香婷婷久久| 成人在线观看毛片| 成人99免费视频| 无码视频一区二区三区| 综合网日日天干夜夜久久| 久久综合偷偷噜噜噜色| 99久久国产综合精品五月天喷水| 成人性生交大合| 一级片免费在线播放| 日韩色av导航| 免费成人三级| 天天干在线影院| 一区二区三区在线免费观看| 色在线免费视频| 成人激情在线播放| 99精品热6080yy久久| 久久国产柳州莫菁门| 91精品免费在线| 综合另类专区| 91免费视频黄| 99国产精品国产精品毛片| 中文资源在线播放| 欧美精品久久久久久久| 国产一区二区三区四区| 人妻激情偷乱视频一区二区三区| 欧美日韩在线一区| av观看在线| 日本一区二区在线| 国产河南妇女毛片精品久久久| 黄色免费av网站| 欧美成人精品影院| 自拍亚洲一区| xxxxwww一片| 欧美日韩免费观看一区三区| 多野结衣av一区| 中文字幕精品在线播放| 久久久精品人体av艺术|