一步步编写操作系统 40 内存分页下用户程序与操作系统的关系
分頁的第一步要準備好一個頁表,我們的頁表是什么樣子呢?現在我們要設計一個頁表啦。
設計頁表其實就是設計內存布局,不過在規劃內存布局之前,我們需要了解用戶進程與操作系統之間的關系。
前面講保護模式時,我們知道,為了計算機安全,用戶進程必須運行在低特權級,當用戶進程需要訪問硬件相關的資源時,需要向操作系統申請,由操作系統去做,之后將結果返回給用戶進程。進程可以有無限多個,而操作系統只有一個,所以,操作系統必須“共享”給所有用戶進程。它們的關系見圖:
上圖不僅展示了用戶進程共享操作系統的邏輯依賴關系,還用插槽展示了它們的配合關系,用戶進程要想完成某件工作,需要與操作系統結合在一起才行,那用戶進程和操作系統它們是什么關系呢?
要完成一件事,用戶進程做的事情只能算個半成品,您可以理解成:用戶的代碼加上所需要的操作系統中的部分代碼才算完整的程序,為什么說是操作系統中的部分代碼呢?原因很簡單,因為操作系統嚴格來說是一套功能的集合,用戶進程所需要的部分可能僅僅是其中的一小小部分,并不是所有功能都會用到。用戶進程能用哪些功能,是由操作系統決定的,不是用戶想用什么就用什么,而是操作系統提供什么它就用什么。完整的程序概念見圖:
它和操作系統需要共同配合才能完成一件事,它們的關系有如服務提供商和客戶的關系。服務提供商提供一些服務,客戶只能用這些服務,也就是說客戶依賴于服務提供商提供的服務項目,是服務提供商主導客戶。比如咱們在網上買東西,咱們只需要挑選好商品后寫好地址,然后下訂單就成了。這事完了嗎?必須沒有,得拿到商品才算完事。所以,之后的事情就交給電商了,他們為你從庫中挑選商品,然后用物流送到您家,這才拿到了商品,到此才算完事了。
以上購物的例子就是典型的用戶程序和操作系統的關系,咱們挑商品下單這件事就相當于進程,而網上的電商才是充當了操作系統的角色,根據買家的需求找到所需要的資源,然后通過物流,將商品(結果)返回。
上述所說的用戶進程和操作系統的關系,都是基于用戶進程共享操作系統。我們設計的頁表也要滿足這個基本要求:共享。
如何在頁表中實現共享呢?這個簡單,只要操作系統屬于用戶進程的虛擬地址空間就好了。
說起來簡單,這該怎么做呢?我們可以把4GB虛擬地址空間分成兩部分,一部分專門劃給操作系統,另一部分就歸用戶進程使用。比如我們之前都聽說過,操作系統在4GB內存的高地址,用戶進程在4GB內存的低地址。比如linux,它就運行在虛擬地址的3GB以上,其它用戶進程都運行在3GB以下。
頁表的設計是要根據內存分布情況來決定的,我們也學習linux的作法,在用戶進程4GB虛擬地址空間的高3GB以上的部分劃分給操作系統,0~3GB是用戶進程自己的虛擬空間。為了實現共享操作系統,讓所有用戶進程3GB~4GB的虛擬地址空間都指向同一個操作系統,也就是所有進程的虛擬地址3GB~4GB本質上都是指向的同一片物理頁地址,這片物理頁上是操作系統的實體代碼。實現起來也比較容易,只要保證所有用戶進程虛擬地址空間3GB~4GB對應的頁表項中所記錄的物理頁地址是相同的就行啦。哈哈,這句話確實有點長,我自己也反復斷句了幾次,不過這個在加載用戶進程時咱們再細說,在此我們只需要完成內存空間劃分就行了。
以上我們討論的結果是:虛擬地址空間的0~3GB是用戶進程,3GB~4GB是操作系統。
本節內容摘自《操作系統真象還原》
總結
以上是生活随笔為你收集整理的一步步编写操作系统 40 内存分页下用户程序与操作系统的关系的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 中国建成世界首条环沙漠铁路线:官方揭秘将
- 下一篇: 小米618终极战报出炉:包揽五大平台安卓