日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

一个操作系统的实现(3)

發(fā)布時間:2023/12/20 windows 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 一个操作系统的实现(3) 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文件系統(tǒng)

文件系統(tǒng)是建立在硬盤上的一個程序,所以由2部分組成:驅動和管理文件系統(tǒng)的進程FS。

首先看一下驅動是如何工作的:

通常,主板上面有2個IDE插槽,分別叫做IDE0/IDE1。每個IDE通道又可以接2個設備。驅動進程的目的就是要隱藏硬件細節(jié),向FS進程提供統(tǒng)一的接口具體到這里,驅動為FS提供的接口就是打開,讀取,寫入,關閉等接口。下面是硬盤驅動程序:

Task_hd()

{

???????Recv(any, msg) //接受任何進程傳來的消息

???????If(msg == DEV_OPEN)??//如果是打開設備消息,則對硬盤寄存器做一些操作,比如獲取硬盤信息等。

???????{

??????????????Out_byte(***)???//向硬盤寄存器寫入數據

??????????????Recv(interrupt, msg) //阻塞等待硬盤中斷發(fā)生(表示需要的數據已經得到)

???????}

???????Send(src, msg) //將獲取的硬盤信息返回給發(fā)送者進程

}

上面的程序之添加了一個讀取硬盤信息的消息,其他比如讀取寫入數據的消息和這個都是類似的。

有一點需要注意,驅動程序task_hd在讀取硬盤信息或者寫入數據到硬盤時候的操作其實比上面的情況略微復雜,下面來看一個完成的調用過程:

1 task_fs?文件系統(tǒng)進程?需要操作硬盤,給硬盤驅動進程task_hd()?發(fā)送一個msg。

2?假設這時,task_hd()處于空閑狀態(tài),即等待在recv(any,msg)處,則會接受這個消息,并向硬盤發(fā)送命令。

3?硬盤完成工作后,會觸發(fā)中斷, Recv(interrupt, msg)返回,并給task_fs?文件系統(tǒng)進程發(fā)送硬盤數據消息。

4 task_fs?文件系統(tǒng)進程?得到CPU時間時,會收到硬盤數據消息。

?

?

最簡單的硬盤驅動看來是告一段落了。下面就可以在此基礎上實現(xiàn)一個文件系統(tǒng),首先需要明白一個文件系統(tǒng)的幾個基本要素

1)??有地方存放metadata(一般為硬盤第二個扇區(qū),因為第一個扇區(qū)為引導分區(qū))

2)??有地方記錄扇區(qū)使用情況(位圖法)

3)??有地方記錄任一文件信息,包括文件名,修改時間,占用哪些扇區(qū)等(一個i-node數組,每個元素包含了文件名,屬性等信息。同時也需要一個位圖來表示i-node數組的使用情況)

4)??文件索引

以后就按照這個方法來組織硬盤結構,創(chuàng)建/刪除/寫入/讀取文件不過是按照這種格式來組織硬盤而已

?

為了實現(xiàn)多系統(tǒng)在硬盤上共存,必須將硬盤劃分為多個分區(qū)。每個系統(tǒng)占用一個分區(qū)。通過一個硬盤的引導扇區(qū)可以設置硬盤分區(qū),硬盤最多可以分為4個物理分區(qū)。其中每個分區(qū)還可以繼續(xù)劃分為多個邏輯分區(qū)。

一般Linux的設備分為主設備號和次設備號,主設備號表示不同的物理設備(硬盤,軟盤);次設備號表示物理設備上的分區(qū)。歸納一下就是:主設備號告訴OS用哪個驅動程序來處理,次設備號告訴驅動程序這是哪個設備。

?

下面看一下硬盤驅動讀取和寫入數據的過程:

1?首先還是一樣task_fs()?文件系統(tǒng)進程通過前面實現(xiàn)的IPC機制將讀取(寫入)硬盤數據消息發(fā)送(即復制)給task_hd()

2 task_hd()

{

???????…

???????Case:DEV_OPEN //如果某用戶進程需要打開一個文件

??????????????為文件內容分配扇區(qū)

??????????????分配一個i-node

??????????????分配inode-map

??????????????分配sector-map

??????????????創(chuàng)建文件索引

?

???????Case: DEV_READ //讀文件

??????????????首先找到將要讀取的文件的文件描述符和位置

??????????????根據文件描述符通過驅動獲取的該文件在硬盤的具體位置(即i-node)。

??????????????將硬盤內容復制到緩存

}

這一部分寫的不是很清楚,理一下思路,我的理解就是硬盤首先有一個文件系統(tǒng)結構(fat32,ntfs,ext2等等),相對于的就有一個硬盤驅動程序用來管理硬盤使用的文件系統(tǒng)并對上層提供文件操作的接口。上層用戶需要讀取硬盤數據的時候,首先將消息發(fā)送給FS,然后FS會將該消息發(fā)送給硬盤驅動程序,硬盤驅動程序根據硬盤所使用的文件格式來找到相應的數據并吧數據復制到OS提供的一個緩存中拱用戶進程使用。

?

?

????????????????????????????????????????????????????????內存管理

到了現(xiàn)在,還沒有完成了就是和內存相關的一些東西,首先看看如何創(chuàng)建一個進程(fork),每個shell就是一個子進程。

一個新的進程需要的條件有:

1?代碼,數據,堆棧(從父進程復制過來)

2?在進程表中占據一個位置

3?在GDT中有一個位置,指向了該進程對應的LTD,也就是指向了進程的數據和堆棧等

?

看一下linux中fork用法:

First_proc()

{

???????Int id = fork();

???????If(pid != 0) //這是父進程

???????Else?子進程運行

}

父子進程公用一個代碼段

?

可以看到,內存管理主要需要在OS中增加2個進程,分別為所有用戶的祖先進程(INIT0)和MM進程(memory Management process)。

Init0進程有些特殊,首先一般的進程的虛擬內存空間對用戶來說是0-4GB,但是init0的內存在這里大致等于內核占用內存的大小。

Fork的大概步驟如下:

1?用戶調用fork

2?通過消息機制發(fā)送FORK消息給MM

3 MM主循環(huán)完成創(chuàng)建進程的工作,主要流程為:找一個空閑的進程表項作為新進程的進程表項;讀取父進程的表示內存占用的LDT,從中取出父進程的代碼,數據和堆棧段內存首地址和范圍。

3?根據父進程的內存占用情況,分配相同大小的內存給子進程。(分配內存需要注意的就是內存不要重復使用),然后將父進程的內存中的內容復制給子進程。

4?如果父進程有打開文件,要給FS進程發(fā)送一個消息來處理父子進程間的共享文件。(FS利用計數器實現(xiàn))

?

銷毀一個進程也差不多,唯一需要注意的就是MM在銷毀一個進程的時候,需要首先銷毀他的所有子進程。

?

?

?

接下來說明一下幾個概念,大多是復制過來的:

CRT:一個應用程序只能調用2種東西:屬于自己的函數,以及中斷(系統(tǒng)調用就是軟中斷)。但是實際上,OS還為普通應用程序提供了一個CRT,這個庫里面有已經編譯好的庫函數代碼。用戶應用程序可以很方便的使用CRT,而免去了很多中斷調用。

?

???????OS自帶應用程序:每個OS都可以附帶和安裝很多應用程序,簡單來說目的就是為了把應用程序從光盤中安裝到OS認識的硬盤中并知道位置,這樣在需要用時,OS可以自己找到該應用程序。例如,一個最簡單的應用程序:

_start

Main(){printf(***);}

把他安裝到OS中的步驟大致如下:

1?編譯連接該應用程序并打包(設為inst.tar)

2?將打包的應用程序二進制文件寫入OS安裝盤的某扇區(qū)(設該扇區(qū)號為X)。

3?啟動系統(tǒng)時,在mkfs()創(chuàng)建文件系統(tǒng)時建立一個新的文件cmd.tar,他對應的起始文件扇區(qū)號為X。

4?在init進程中,將cmd.tar解壓,將其中包含的文件(即為inst.tar)存入文件系統(tǒng)。

?

?

Exec才等同于windows里面的CreartProcess.

First_proc()

{

???????Int id = fork();

???????If(pid != 0) //這是父進程

???????Else?子進程運行

???????{

??????????????Exec()???//參數即為新的代碼段

???????}

}

?

Exec的執(zhí)行流程:

1?檢查參數個數并將它們依次存放到某連續(xù)內存處

2?向MM發(fā)送消息,消息體就是上面存放參數的連續(xù)內存。

3 MM消息接收到這個消息,將參數取出(由于exec所在進程和MM不是同一個進程,所有他們的虛擬地址不一樣,MM需要通過物理地址復制的方式來獲取消息)

4?根據exec傳來的參數,MM將要執(zhí)行文件復制到自己的緩沖區(qū)中

5?被執(zhí)行文件是elf格式,MM根據格式將被執(zhí)行文件的各個段放置到合適的空閑內存中。

6?建立棧

?

?

OK all done with simplest mode..?

              2011.1.15 AM8:45 ?

        i love joliet - teddy_xiong ?in ZNUFE

sylar MAIL: cug@live.cn

轉載于:https://www.cnblogs.com/xumaojun/p/8544130.html

總結

以上是生活随笔為你收集整理的一个操作系统的实现(3)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。