從0開始的操作系統手搓教程33:掛載我們的文件系統

目錄

代碼實現

添加到初始化上

上電看現象


掛載分區可能是一些朋友不理解的——實際上掛載就是將我們的文件系統封裝好了的設備(硬盤啊,SD卡啊,U盤啊等等),掛到我們的默認分區路徑下。這樣我們就能訪問到了(嘿!想象你是一個螞蟻,別人把葡萄掛到了樹枝上,然后你就可以爬著訪問到了)

文件系統的掛載和卸載在Linux中是非常重要的功能,它允許用戶將一個分區的文件系統與另一個分區的目錄樹連接起來。通常情況下,Linux會將根分區作為默認分區,并通過mount命令將其他分區掛載到默認分區的某個目錄上。在這個過程里,分區的根目錄是固定存在的,其他分區盡管有自己的根目錄,但它們的根目錄并不直接與整個系統的文件結構掛鉤。通過mount命令,其他分區可以在需要時被掛載到指定的目錄下,而默認分區的根目錄則作為所有分區的父目錄,掛載后形成一個統一的路徑樹結構。

對于掛載操作系統到裸盤的情況,并沒有現成的分區和文件系統。這時,為了實現文件操作,首先必須在裸盤上創建文件系統,至少要實現基本的文件寫入功能。然后,操作系統可以通過文件系統進行安裝。例如,在Windows或Linux系統安裝過程中,首先會選擇目標分區,格式化并安裝操作系統到文件系統中。對于學習操作系統實現的場景,雖然也可以模仿這一過程,但為了簡化操作,一開始可以避免復雜的分區掛載過程。

實現分區掛載的本質是通過讀取硬盤上的元信息并將其加載到內存中,這樣,所有硬盤資源的使用情況都能通過內存中的元信息進行管理。當執行寫操作時,內存中的數據需要及時同步到硬盤,確保數據的一致性和持久性

代碼實現

/* Finds the partition named 'part_name' in the partition list and assigns its * pointer to 'cur_part' */
static bool mount_partition(list_elem *pelem, int arg) {// Convert the argument to a partition name stringchar *part_name = (char *)arg;// Retrieve the DiskPartition structure from the list elementDiskPartition *part = elem2entry(DiskPartition, part_tag, pelem);
?// If the partition name matches, mount this partitionif (!k_strcmp(part->name, part_name)) {cur_part = part; // Set the current partition to the found partitionDisk *hd = cur_part->my_disk; // Get the disk that contains this partition
?// Allocate a buffer to temporarily store the superblock read from diskSuperBlock *sb_buf = (SuperBlock *)sys_malloc(SECTOR_SIZE);
?// Allocate memory for the superblock of the current partitioncur_part->sb = (SuperBlock *)sys_malloc(sizeof(SuperBlock));if (!cur_part->sb) {KERNEL_PANIC_SPIN("alloc memory failed!"); // Kernel panic if allocation fails}
?// Read the superblock from disk into the bufferk_memset(sb_buf, 0, SECTOR_SIZE);ide_read(hd, cur_part->start_lba + 1, sb_buf, 1);
?// Copy the superblock information from the buffer to the partition's superblockk_memcpy(cur_part->sb, sb_buf, sizeof(SuperBlock));
?/********** Load the block bitmap from disk into memory **********/// Allocate memory for the block bitmapcur_part->block_bitmap.bits = (uint8_t *)sys_malloc(sb_buf->block_bitmap_sects * SECTOR_SIZE);if (!(cur_part->block_bitmap.bits)) {KERNEL_PANIC_SPIN("alloc memory failed!"); // Kernel panic if allocation fails}// Set the length of the block bitmap in bytescur_part->block_bitmap.btmp_bytes_len = sb_buf->block_bitmap_sects * SECTOR_SIZE;// Read the block bitmap from disk into memoryide_read(hd, sb_buf->block_bitmap_lba, cur_part->block_bitmap.bits, sb_buf->block_bitmap_sects);/****************************************************************/
?/********** Load the inode bitmap from disk into memory **********/// Allocate memory for the inode bitmapcur_part->inode_bitmap.bits = (uint8_t *)sys_malloc(sb_buf->inode_bitmap_sects * SECTOR_SIZE);if (!(cur_part->inode_bitmap.bits)) {KERNEL_PANIC_SPIN("alloc memory failed!"); // Kernel panic if allocation fails}// Set the length of the inode bitmap in bytescur_part->inode_bitmap.btmp_bytes_len = sb_buf->inode_bitmap_sects * SECTOR_SIZE;// Read the inode bitmap from disk into memoryide_read(hd, sb_buf->inode_bitmap_lba, cur_part->inode_bitmap.bits, sb_buf->inode_bitmap_sects);/****************************************************************/
?// Initialize the list of open inodes in this partitionlist_init(&cur_part->open_inodes);verbose_printk("disk mount %s done!\n", part->name); // Print a message indicating successful mounting
?// Return true to stop further traversal, as the partition has been found and mountedreturn true;}return false; // Continue traversing the list if the partition was not found
}
 

mount_filesystem函數就是完成了文件系統中掛載默認分區并加載其元信息的過程。默認分區的名稱為 default_part,其值為 sdb1,表示默認操作的分區是 sdb1。分區掛載通過 list_traversal 函數完成,該函數遍歷分區列表 partition_list,并對每個分區調用回調函數 mount_partition,傳入的參數是 default_part 的地址轉換為整型后的值。mount_partitionlist_traversal 的回調函數,其功能是在分區鏈表中找到與傳入的分區名匹配的分區,并將其指針賦值給全局變量 cur_part,用于記錄當前操作的分區。

mount_partition 函數中,首先將傳入的參數 arg 還原為字符指針 part_name,然后通過宏 elem2entrypelem 還原為分區結構體 part。接著,通過 strcmp 比對 part->namepart_name,如果匹配則找到目標分區,并將其指針賦值給 cur_part。隨后,獲取該分區所在的硬盤 hd,作為后續硬盤操作的參數。

接下來,系統為超級塊申請內存緩沖區 sb_buf,并從硬盤中讀取超級塊信息到 sb_buf,然后將有用的超級塊信息復制到 cur_part->sb 中,忽略填充部分以節省內存。之后,為塊位圖申請內存,并根據超級塊中的 block_bitmap_sects 初始化塊位圖的大小,最后將硬盤上的塊位圖讀入內存。類似地,系統還會加載 inode 位圖到內存中。整個過程確保了分區的元信息被正確加載,并為后續的文件系統操作做好準備。

添加到初始化上

.../* Determine the default partition for operations */char default_part[8] = "sdb1";/* Mount the partition */list_traversal(&partition_list, mount_partition, (int)default_part);

上電看現象

下一篇

從0開始的操作系統手搓教程34:說說文件描述符與常見的操作和文件基本操作-CSDN博客文章瀏覽閱讀614次,點贊4次,收藏13次。我們還需要打開根目錄并初始化文件表// filesystem_init函數下追加:??*/return ret;函數將本地文件描述符轉換為全局文件表索引。首先,它獲取當前任務的文件描述符表,然后根據傳入的本地文件描述符返回對應的全局文件描述符索引。sys_close函數用于關閉文件。首先,它檢查文件描述符是否大于2(標準輸入、輸出和錯誤文件描述符不處理)。然后,調用將本地文件描述符轉換為全局文件描述符,并嘗試關閉文件。如果成功,更新任務的文件描述符表并返回0;否則,返回-1。 https://blog.csdn.net/charlie114514191/article/details/146143441

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/72950.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/72950.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/72950.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【圖片批量轉換合并PDF】多個文件夾的圖片以文件夾為單位批量合并成一個PDF,基于wpf的實現方案

項目背景: 多個圖片分布在不同文件夾,如何以文件夾為單位批量合并成一個PDF,還要保證文件夾里面圖片大小和順序 實現功能: 1、單張圖片的轉換PDF:一張圖臨時轉一下 2、多張圖片轉換成PDF:多張圖單獨轉成PDF 3、多級目錄多張圖轉換成PDF:多級目錄多張圖單獨轉成多個PDF…

如何用Kimi生成PPT?秒出PPT更高效!

做PPT是不是總是讓你頭疼?😩 快速制作出專業的PPT,今天我們要推薦兩款超級好用的AI工具——Kimi 和 秒出PPT!我們來看看哪一款更適合你吧!🚀 🥇 Kimi:讓PPT制作更輕松 Kimi的生成效…

從 MongoDB 到 TDengine,沃太能源實現 18 倍寫入性能提升

導讀 沃太能源是國內領先儲能設備生產廠商,數十萬儲能終端遍布世界各地。此前使用 MongoDB 存儲時序數據,但隨著設備測點增加,MongoDB 在存儲效率、寫入性能、查詢性能等方面暴露出短板。經過對比,沃太能源選擇了專業時序數據庫 …

數據庫基本建表操作

1.登錄數據庫并創建數據庫db_ck 創建完成后使用到我們創建的數據庫。 2.創建表t_hero 根據hero屬性包括(id,name,nickname,age,gender,address,weapon,types) 創建完…

OkHttp 之任務調度模塊源碼分析

一、引言 在現代網絡應用開發中,高效的任務調度機制對于提升系統性能和用戶體驗至關重要。OkHttp 作為一款廣泛使用的高性能 HTTP 客戶端庫,其任務調度模塊在處理網絡請求的并發、排隊和執行等方面發揮著關鍵作用。本文將深入 OkHttp 源碼,詳…

復現無人機的項目,項目名稱為Evidential Detection and Tracking Collaboration

項目名稱為Evidential Detection and Tracking Collaboration,主要用于強大的反無人機系統,涉及新問題、基準和算法研究。下面介紹項目的復現步驟: 安裝環境:使用Anaconda創建并激活名為edtc的虛擬環境,Python版本為3…

QwQ-32B 開源!本地部署+微調教程來了

今天,通義千問開源了推理模型QwQ-32B QwQ-32B 在一系列基準測試中進行了評估,測試了數學推理、編程能力和通用能力。以下結果展示了 QwQ-32B 與其他領先模型的性能對比,包括 DeepSeek-R1-Distilled-Qwen-32B、DeepSeek-R1-Distilled-Llama-7…

如何利用 Excel 表格實現精準文件批量重命名教程

在處理大量文件時,有時需要根據特定規則對文件名進行調整。如果您的文件名和新名稱之間存在一對多的關系,并且這種關系可以通過 Excel 表格來管理,那么使用“簡鹿文件批量重命名”軟件中的“匹配對應名稱命名”功能將是一個高效的選擇。接下來…

開關模式電源轉換器 EMI/EMC 的集成仿真

介紹 在電力電子領域,電磁干擾 (EMI) 和電磁兼容性 (EMC) 問題可以決定設計的成敗。開關模式電源轉換器雖然高效且緊湊,但卻是電磁噪聲的常見來源,可能會對附近的組件和系統造成嚴重破壞。隨著…

Android 藍牙工具類封裝:支持經典藍牙與 BLE,兼容高版本權限

為了優化經典藍牙(Classic Bluetooth)和低功耗藍牙(Bluetooth Low Energy, BLE)的操作,我們可以將功能封裝到一個工具類中,支持掃描、連接、通信,并兼容高版本 Android 的動態權限申請。以下是完…

STM32 CAN模塊原理與應用詳解

目錄 概述 一、CAN模塊核心原理 1. CAN協議基礎 2. STM32 CAN控制器結構 3. 波特率配置 二、CAN模塊配置步驟(基于HAL庫) 1. 初始化CAN外設 2. 配置過濾器 3. 啟動CAN通信 三、數據收發實現 1. 發送數據幀 2. 接收數據幀(中斷方式…

PostgreSQL_安裝部署

一、Windows系統下安裝 1.下載安裝包 登錄PostgreSQL: Downloads官網: 選擇14.12版本,點擊下載: 2.安裝PostgrSQL14.12 雙擊exe安裝包程序,準備安裝: 選擇安裝路徑: 選擇想安裝的工具: 選擇數…

init arry的作用,可以沒有init arry嘛?(面試題)

https://bbs.kanxue.com/thread-282657.htm 對init_array段調用的方法進行Hook https://bbs.kanxue.com/thread-191092.htm init_array原理簡單說明 https://bbs.kanxue.com/thread-280135.htm frida hook init_array自吐新解 init_array 的作用,以及是否可以沒有 i…

藍橋杯真題0團建dfs+哈希表/鄰接表

dfs鄰接表儲存或者哈希表的運用,考察我們對數據的存儲 本題核心就是在求從根節點開始的兩棵樹相同的最長序列,首先確定用dfs進行深搜,對于節點的形式可以用鄰接表,鄰接矩陣,哈希表來進行存儲數據。下面看代碼 鄰接表 …

使用 AIStor、MLflow 和 KServe 將模型部署到 Kubernetes

在之前幾篇關于 MLOps 工具的文章中,我展示了有多少流行的 MLOps 工具跟蹤與模型訓練實驗相關的指標。我還展示了他們如何使用 MinIO 來存儲作為模型訓練管道一部分的非結構化數據。但是,一個好的 MLOps 工具應該做的不僅僅是管理您的實驗、數據集和模型…

kali linux web掃描工具

Kali Linux是一款專為網絡安全領域而打造的操作系統,提供了眾多優秀的安全工具,其中就包括了強大的web掃描工具。Web掃描是網絡安全檢測的一個重要環節,它可以幫助安全專家檢測網站的漏洞,提升網站的安全性。 Kali Linux中集成了…

Linux losetup循環設備

好的,以下是命令的中文解釋和使用步驟: 命令解釋: losetup -r /dev/loop0 /system/app.bin: losetup 是一個用于將文件與循環設備(loop device)關聯的命令。-r 選項表示將循環設備設置為只讀模式。/dev/lo…

【js逆向】

地址:aHR0cHM6Ly93d3cud2VpYm90b3AuY24vMi4wLw f12進入 debugger,過debugger 查看預覽數據 全局搜索 請求網址中的 api.weibotop.cn 在下方疑似找到了加密和解密的函數 斷點調試 控制臺輸出 那個n就是 常見的 cryptoJs庫 const cryptoJs require(cry…

1.Intel BIOS 開發指南詳細介紹

1. 引言 目的: Intel BIOS 開發指南旨在為開發者提供詳細的指導,幫助他們理解和實現 Intel 平臺上的 BIOS 功能。 適用對象: 適用于希望開發、調試和優化 BIOS 的硬件工程師、軟件工程師和系統集成商。 版本信息: 確保你使用的是最新版本的指南,以獲取最新的信息和最佳實…

deepseek在pycharm中的配置和簡單應用

對于最常用的調試python腳本開發環境pycharm,如何接入deepseek是我們窺探ai代碼編寫的第一步,熟悉起來總沒壞處。 1、官網安裝pycharm社區版(免費),如果需要安裝專業版,需要另外找破解碼。 2、安裝Ollama…