• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
  • 操作系統的實現細節

    發表于:2007-07-04來源:作者:點擊數: 標簽:
    這學期的考試即將開始,也快要結束了,腦子里總是閑不住,定了一下下個學期的打算,一方面是好好地在intel實習,和前輩們多學點知識,另一方面,就是使自己的知識更扎實一點,所以想的辦法就是,想自己編一個操作系統。 今天自修的時候,略想了一下具體的實

    這學期的考試即將開始,也快要結束了,腦子里總是閑不住,定了一下下個學期的打算,一方面是好好地在intel實習,和前輩們多學點知識,另一方面,就是使自己的知識更扎實一點,所以想的辦法就是,想自己編一個操作系統。

    今天自修的時候,略想了一下具體的實現細節,寫了接近2000多字的想象初稿,由于全部的實現細節,均是在自己的想法和利用已知道的知識出來的,所以未免會有差錯,也可能會有誤導讀者的地方,還請嚴厲指正~

    具體的實現大目標:利用大肆一年的時間(說起來簡單,實際上在intel一周就要五天,11個月,估計也沒有多長時間)

    1。多進程的模型

    2。完成自己的文件系統

    3。有自己的進程控制機制

    4。實現文件的讀寫操作

    5。完成內存的分配問題

    6。系統地引導以及駐留內存的操作

    7。執行文件等操作

    8。想到繼續...

    具體的硬件環境,就是實現可供開發的平臺,目前可以想象的到的有:

    1。在skyeye上模擬

    優點及缺點:比較方便調試,但恐怕其對于一些基本的硬件和真實地會有些不同,所以可能導致在虛擬機上能跑起來的操作系統在實際當中卻不可以

    2。找嵌入式的開發板子

    優點及缺點:有實驗室,老師基本上可以說通給開發環境,一般是arm7的板子,但是需要經常用jtag或者bootloader來燒寫flash,也可以采用bootloader+system的方式,后者好一些,但是會比較麻煩,而且我是夜貓子,一般在夜里頭腦會比較清醒一點,這里實驗室就可能不大方便。

    3。用vmware

    比較困難!需要將代碼寫好然后再安裝調試...不知道如何直接寫到硬盤上,調試很不方便

    4.直接用pc機

    cancel掉。調試太太麻煩

    暫定為第一方案,第二方案為被選方案

    需要解決的問題

    1。在把文件系統格式化成你想要得比如CL(自己的:))格式之前,怎樣把文件“寫”到文件系統當中?想到這里豁然開朗了,dos的做法,由于bios可以識別軟盤,故將引導文件放在軟盤上(軟盤的文件系統從何而來?可能是一種標準-_-),為了追求最初最初的文件系統概念(寫得有點亂,基本上想到啥就寫啥了,一下子想到的東西太多了),可以設想用JTAG把程序放到flash當中,然后機器就開始讀指令(0地址),跳轉,執行指令。而這時,假若操作系統無硬盤,就把內存假設成為分成一個塊一個塊的用文件系統的概念進行操作。想回來了,硬盤每個分區都有自己的主引導區,一般PC在電源一開時,是由內存中地址FFFF:0000開始執行(這個地址一定在ROMBIOS中,ROMBIOS一般是在FEOOOh到FFFFFh中),而此處的內容則是一個jump指令,jump到另一個位于ROMBIOS中的位置,開始執行一系列的動作,包括了檢查RAM,keyboard,顯示器,軟硬磁盤等等,這些動作是由系統測試碼(systemtestcode)來執行的,隨著制作BIOS廠商的不同而會有些許差異,但都是大同小異,讀者可自行觀察自家機器開機時,螢幕上所顯示的檢查訊息?! 【o接著系統測試碼之后,控制權會轉移給ROM中的啟動程序(ROMbootstraproutine),這個程序會將磁盤上的零道零扇區讀入內存中(這就是一般所謂的bootsector,如果你曾接觸過電腦病毒,就大概聽過它的大名),至于被讀到內存的哪里呢?--絕對位置07C0
    :0000(即07C00h處),這是IBM系列PC的特性。我們就在這里把一開始的引導程序放在這里,然后系統的控制權就可以拿到了自己的手里,然后進行操作了。。。[細節很多,需要具體研究]

    2.引導了以后麼就可以操作自己的文件系統了,利用自己的規范?,F在來介紹一下具體的文件系統究竟有什么不同?

    磁盤的第一個扇區的具體構造

    0000 |------------------------------------------------|
    | |
    | |
    | Main Boot Record |
    | |
    | |
    | 主引導記錄(446字節) |
    | |
    | |
    | |
    01BD | |
    01BE |------------------------------------------------|
    | |
    01CD | 分區信息 1(16字節) |
    01CE |------------------------------------------------|
    | |
    01DD | 分區信息 2(16字節) |
    01DE |------------------------------------------------|
    | |
    01ED | 分區信息 3(16字節) |
    01EE |------------------------------------------------|
    | |
    01FD | 分區信息 4(16字節) |
    |------------------------------------------------|
    | 01FE | 01FF |
    | 55 | AA |
    |------------------------------------------------|
    硬盤的分區表,由4個16字節的分區信息表組成。每個信息表的
    結構如下:
    偏移 長度 所表達的意義
    0 字節 分區狀態: 如0-->非活動分區
    80--> 活動分區
    1 字節 該分區起始頭(HEAD)
    2 字 該分區起始扇區和起始柱面
    4 字節 該分區類型:如82--> Linux Native分區
    83--> Linux Swap 分區
    5 字節 該分區終止頭(HEAD)
    6 字 該分區終止扇區和終止柱面
    8 雙字 該分區起始絕對分區
    C 雙字 該分區扇區數

    我們的程序就在這里進行操作,設置自己的獨有的分區類型,那么fat和ext2之間的差別究竟在哪里?操作系統通過分區類型的一個字節,來獲得分區的格式,從而來判斷是否自己是支持的,然后通過自己的方法,來對文件進行存儲讀寫操作。文件的內容都是放到磁盤上面的,比如一個文本文件,放的內容都是相同的,就是操作系統如何把存放在不同扇區的文件內容讀出來(文件的存放不是連續的,否則也不用這么麻煩-_-),那么現在的問題是,當格式化1個分區的時候,是否只是僅僅改一下分區類型那一個字節,然后把該分區的內容全部清零??

    現在我們來看一下ext2和fat文件系統的硬盤布局。

    對于 ext2 文件系統來說,硬盤分區首先被劃分為一個個的 block,一個 ext2 文件系統上的每個 block 都是一樣大小的,但是對于不同的 ext2 文件系統,block 的大小可以有區別。典型的 block 大小是 1024 bytes 或者 4096 bytes。這個大小在創建 ext2 文件系統的時候被決定,它可以由系統管理員指定,也可以由文件系統的創建程序根據硬盤分區的大小,自動選擇一個較合理的值。這些 blocks 被聚在一起分成幾個大的 block group。每個 block group 中有多少個 block 是固定的。每個 block group 都相對應一個 group descriptor,這些 group descriptor 被聚在一起放在硬盤分區的開頭部分,跟在 super block 的后面。所謂 super block,我們下面還要講到。在這個 descriptor 當中有幾個重要的 block 指針。我們這里所說的 block 指針,就是指硬盤分區上的 block 號數,比如,指針的值為 0,我們就說它是指向硬盤分區上的 block 0;指針的值為 1023,我們就說它是指向硬盤分區上的 block 1023。我們注意到,一個硬盤分區上的 block 計數是從 0 開始的,并且這個計數對于這個硬盤分區來說是全局性質的。在 block group 的 group descriptor 中,其中有一個 block 指針指向這個 block group 的 block bitmap,block bitmap 中的每個 bit 表示一個 block,如果該 bit 為 0,表示該 block 中有數據,如果 bit 為 1,則表示該 block 是空閑的。注意,這個 block bitmap 本身也正好只有一個 block 那么大小。假設 block 大小為 S bytes,那么 block bitmap 當中只能記載 8*S 個 block 的情況(因為一個 byte 等于 8 個 bits,而一個 bit 對應一個 block)。這也就是說,一個 block group 最多只能有 8*S*S bytes 這么大。在 block group 的 group descriptor 中另有一個 block 指針指向 inode bitmap,這個 bitmap 同樣也是正好有一個 block 那么大,里面的每一個 bit 相對應一個 inode。硬盤上的一個 inode 大體上相對應于文件系統上的一個文件或者目錄。關于 inode,我們下面還要進一步講到。在 block group 的 descriptor 中另一個重要的 block 指針,是指向所謂的 inode table。這個 inode table 就不止一個 block 那么大了。這個 inode table 就是這個 block group 中所聚集到的全部 inode 放在一起形成的。一個 inode 當中記載的最關鍵的信息,是這個 inode 中的用戶數據存放在什么地方。我們在前面提到,一個 inode 大體上相對應于文件系統中的一個文件,那么用戶文件的內容存放在什么地方,這就是一個 inode 要回答的問題。一個 inode 通過提供一系列的 block 指針,來回答這個問題。這些 block 指針指向的 block,里面就存放了用戶文件的內容。

    說了這么多,只是想說明,文件系統的格式化不是僅僅地把后面的磁盤空間清零那么簡單。

    具體自己的文件系統(設計盡量簡單)`,需要更加的細節化。后期的工作

    3。進程的如何調度問題。

    書本上講了很多的進程調度方法,比如時間片啊,彩票啊,優先級啊,等等等等,但是沒有說明究竟是如何采用語言來實現的?具體的實現細節?這里要具體深入到匯編級別的來進行討論。...

    累了,該復習編譯原理了,為完待續......

     


     

    原文轉自:http://www.kjueaiud.com

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>