11-15用戶進程

參考書籍:《操作系統 真象還原》 作者:鄭鋼

本書的11~15章代碼,我沒有細看。故沒有具體的細節。只有大體的思路。


第十一章:用戶進程

來自:https://zhuanlan.zhihu.com/p/36291290

  1. Linux爲了提高任務切換的速度,所有任務共享一個TSS。通過TR寄存器保存這個TSS,使用ltr指令加載TSS。Linux的任務切換方式只需要修改TSS中的SS0和esp0。
  2. 進程與線程最大的區別就每個進程都擁有單獨的4GB虛擬地址空間,所以,需要單獨爲每個進程維護一個虛擬地址池,用來標記該進程中哪些地址被分配了,哪些地址沒有被分配
  3. 一般情況下,CPU不允許從高特權級轉向低特權級,只有從中斷返回或者從調用門返回的情況下纔可以。製造從中斷返回的條件,執行iretd指令了。
  4. 當初創建線程的時候是將棧的返回地址指向了kernel_thread函數,通過該函數調用線程函數實現的。這裏我們只需要把執行線程的函數換成(創建進程的函數就可以了)。

第十二章:系統調用&&內存管理

來自:十三. 實現系統調用十四. malloc&free的實現   作者:主旋律

系統資源的調用

之前,我們直接在系統中使用內核函數進行打印。
我們肯定不希望,用戶進程可以直接使用內核函數。所以,我們使用中斷門。用戶進程,通過中斷,調用內核資源。
實現系統調用

  1. 用中斷門實現系統調用,通過0x80中斷作爲系統調用的入口。
  2. 在IDT中安裝0x80號中斷對應的描述符,在該描述符中註冊系統調用對應的中斷處理例程。
  3. 建立系統調用子功能表,利用eax寄存器中的子功能號在該表中索引相應的處理函數
  4. 用宏實現用戶空間系統調用接口_syscall,最大隻支持3個參數,ebx保存第一個參數,ecx保存第二個參數,edx保存第三個參數
    注:由於使用中斷,權限發生變化。中間使用了不同權限的棧。如果使用棧進行參數傳遞,則需要將3級棧中的參數穿入0級棧中。但是,由於我們使用的是寄存器,所以可以不用考慮。

內存管理

之前使用位圖,直接分配,每次分配總是劃出4KB的大小,有點浪費。
所以,我們將一頁,劃分成大小相同的內存塊。我們把這種方式稱之爲arena。
arena是一大塊的內存被劃分的多個小的內存塊的內存倉庫。
按照內存塊的大小,可以劃分成不同規格的arena。

一塊arena大小的內存總有分配完的時候,也就是該arena中的所有mem_block都分配出去了,那麼肯定需要新增一個與之前arena規格相同的arena來滿足內存的需求,那麼這些相同規格arena之前同樣需要一個結構來進行管理,這個結構用來記錄arena的規格以及同規格arena中所有空閒內存塊鏈表。

內存塊描述符中會將所有同規格arena的空間內存塊進行彙總,它相當於所有內存塊的大倉庫,分配內存的時候經過這個大倉庫,找到裏面的某個arena,也就是小倉庫,最後從這個arena中找到某個空閒的內存塊,將其分配出去。

第十三章:磁盤分區

理解:主分區,擴展分區,子擴展分區,邏輯分區。
詳細內容見書上。《真象還原》在磁盤這裏的介紹,比鳥哥的好些。當然,是側重點不同。
(下圖爲,爲一個磁盤分成一個主分區和一個擴展分區。擴展分區又被分成四個子擴展分區。)
在這裏插入圖片描述

第十四章:文件系統

首先,我們的系統暫時採用索引結構------inode的文件組織形式。

索引結點,用來索引、跟蹤一個文件的所有塊。

此分區最大創建的文件數是有限制的。,正如 Linux 中每分區的 inode 數量是固定的
目錄也是文件。目錄文件和普通文件在inode看來,沒有區別。
我們是通過文件名來訪問文件。文件系統通過inode來訪問文件。
文件系統如何把文件名和inode關聯起來?——通過目錄項。

目錄也是文件。根目錄會被固定,每次開始進入根目錄(或者藉此進入其他目錄)。(Think why ?)
最後所有的東西合在一起,便是超級塊。用來保存系統元信息的元信息。

好了。現在,假設,文件系統的基礎有了(上面內容)。

但是文件系統,光有內容不行,還得有管理操作。(不再是,簡單的理解:不同的文件系統就像是劃分不同的格格這樣簡單了。)

磁盤裏面存儲的是文件內容。使用的時候,我們得將他們加載進入內存。好,加載進入內存,這和什麼有關係?answer是進程(文件操作(系統)和前面的進程結合)。不同的進程,可以打開相同的文件。爲了相互之間不影響,所以每次打開,我們會產生一個“文件結構“。它可以用來記錄文件的偏移量,inode的指針等。爲了避免PCB臃腫,我們只在PCB中存入文件描述符的下標。如文件描述符0,表示標準輸入,1表示標準輸出,2表示標準錯誤。

[外鏈圖片轉存失敗(img-3FTWM2UH-1565965970851)(11用戶進程.assets/文件描述符和inode的關聯關係.png)]

現在從左到右梳理一下圖 14-16 ,某進程把文件描述符作爲參數提交給文件系統時,文件系統用此文件描述符在該進程的 PCB 中的文件描述符數組中索引對應的元素,從該元素中獲取對應的文件結構的下標,用該下標在文件表中索引相應的文件結構,從該文件結構中獲取文件的 inode ,最終找到了文件的數據塊 。提示 ,若該 inode 隊列中不存在,此時會多一個處理過程 文件系統會從硬盤上將該 inode 加載到 inode 隊列中,並使文件結構中的“ inode 指向它,將來介紹 inode 操作相關的函數時會再次提到。

之後在此基礎上,實現文件及目錄的創建、打開、讀寫、路徑解析、權限讀取等操作(這裏面有個前提是磁盤驅動。這樣硬盤中的內容才能調入內存)。一個簡單的文件系統便完成。

第十五章

這一章,不想看了。

放暑假,明後兩天進城裏,吃香的,喝辣的。
在這裏插入圖片描述
在這裏插入圖片描述



總結

這本書是很好的。

1~10章的代碼,我一點一點的看明白哈。

11~14章,不好意思得撈撈頭,代碼沒咋看。只是看了下文字的概念。

至於落下的內容,以後遇到,在慢慢打磨。。。

  • 從實模式進入了保護模式。(這是一步大跨越。)
  • 將所學的彙編©,微機原理,操作系統串起來了.(雖然還是不能理解進程和線程的區別。上次有人說現在linux中線程和進程一樣。我問了下~。他也沒告訴我原因。當然,我也google到)。
  • 簡單學了點makefile。我不要再寫“玩具”代碼。看這本書,會看到大量的C代碼,看的腦袋疼。當然,突然就意識到,數據結構和函數聲明放在頭文件中。頭文件!!! 從頭到尾寫在一個文件中的長程序,就是垃圾,中學生都不屑於乾的事情,我t大三(快大四)才意識到😢。
  • 代碼:https://github.com/da1234cao/tiny-os (我從網上fork過來的。在doc目錄下面,放了我的筆記)

  • 筆記1:https://blog.csdn.net/sinat_38816924/article/category/9093369 (這也是我的博客,可以關注一下:😄)

  • 筆記2:https://zhuanlan.zhihu.com/c_177480196 (帶哥知乎專欄整理的內容👍)

  • 操作系統討論羣1:BookOS開發技術交流羣:913813452 (我當時因爲進入這個羣,纔開始看操作系統)

  • 《真象還原》1羣:748933138

  • 我的QQ號:2714144035 (歡迎討論)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章