天天看點

資訊安全系統設計基礎第十四周學習總結

資訊安全系統設計基礎第十四周學習總結

【學習時間:7小時】

【學習内容:CHAPTER9——虛拟存儲器】

一、課本内容了解(個人了解部分用【】标出)

1.虛拟存儲器(VM)

  • 作用:
    1. 将主存看作是一個存儲在磁盤上的位址空間的高速緩存,在主存中隻保護活動的區域,并根據需要在磁盤和主存之間來回傳送資料;
    2. 為每個程序提供了一緻的位址空間,進而簡化了存儲器管理;
    3. 保護了每個程序的位址空間不被其它程序破壞

【了解:其實2.與3.是密切相關的。因為虛存為每個程序提供了一緻的位址空間的表示方法,就好像為各程序提供了統一的房間編号機制,這樣各個程序就不會進錯房間,也不會在有房間的情況下還找不到房間】

  • 地位:
    1. 虛拟存儲器是中心的:它是硬體異常、硬體位址翻譯、主存、磁盤檔案和核心軟體的互動中心;
    2. 虛拟存儲器是強大的:它可以建立和銷毀存儲器片、可以映射存儲器片映射到磁盤某個部分等等;
    3. 虛拟存儲器若操作不當則十分危險

2.實體和虛拟尋址

  • 實體尋址(PA):主存中每個位元組都有唯一的實體位址;依靠此來尋址,就叫做實體尋址;
  • 虛拟尋址(VA):CPU生成一個虛拟位址然後用這個位址通路主存,這個虛拟位址在送到存儲器之前先被轉換成适當的實體位址(這個過程叫做位址翻譯)

3.虛拟存儲器的基本思想

允許每個資料對象有多個獨立的位址,其中每個位址都選自不同的位址空間(比如,虛拟位址空間或者是實體位址空間)。

4.虛存如何作為緩存工具?

  • 理念:
    • 首先,VM上被組織為一個由存放在磁盤上的N個連續的位元組大小的單元組成的數組。每個位元組都有一個唯一的虛拟位址,這個虛拟位址是作為到數組的索引的。
    • 其次,VM系統将虛拟存儲器分割為大小固定的虛拟頁,每個虛拟頁的大小為P=2^p位元組;類似地,實體存儲器被分割為實體頁(也叫做頁幀),大小也為P位元組

【了解:也就是說,虛存上的空間用來存放的是資料真正的位址(是以說虛存相當于索引),一個個虛存單元組織起來就可以指向唯一對應的實體頁】

  • 虛存頁面集合
    • 未配置設定的:VM系統沒有将它們與任何資料關聯起來,也不占用任何磁盤空間;
    • 緩存的:目前緩存在實體存儲器中的已配置設定的頁;
    • 未緩存的:沒有還存在實體存儲器中的已配置設定頁

5.頁表

  • 作用:将虛拟頁映射到實體頁。每次位址翻譯硬體将一個虛拟位址轉換為實體位址時都會讀取頁表。作業系統負責維護頁表中的内容。
  • 結構:頁表就是一個頁表條目(PTE)數組;虛拟位址空間中的每個頁在頁表中一個固定偏移量處都有一個PTE。為了我們的目的,我們假設每個PTE是由一個有效位和一個n位的位址字段組成的。有效位表明了該實體頁的起始位置,這個實體頁中緩存了該虛拟頁。

6.缺頁

  • DRAM緩存不命中稱為缺頁。
  • 處理過程:
    • 缺頁異常調用核心中的缺頁異常處理程式,該程式會選擇一個犧牲頁,将其換出記憶體;
    • 核心從磁盤中拷貝需要的條目到犧牲頁之前所在的位置,随後傳回;
    • 當異常處理程式傳回之後,它會再次啟動導緻缺頁的指令,該指令會把導緻缺頁的虛拟位址重發送到位址翻譯硬體;
    • 此時,頁面命中
  • 概念補充:
    • 在存儲器的習慣說法中,塊被稱為頁;
    • 在磁盤和存儲器之間傳送頁的活動叫做交換或者頁面排程;
    • 頁從磁盤換入DRAM和從DRAM換出磁盤;一直等待到不命中發生的時候才換入頁面;這種政策被稱為按需頁面排程

7.位址翻譯

  • 解釋:形式上說,位址翻譯是一個N元素的虛拟位址空間(VAS)中的一個元素和一個M元素的實體位址空間(PAS)之間的映射;
  • 過程:
    • CPU中的一個控制寄存器,頁表基址寄存器指向目前頁表;
    • n位的虛拟位址包括以下兩個部分:一個p位的虛拟頁面偏移和一個(n-p)位的虛拟頁号;
    • MMU用後者選擇适當的PTE,再将實體頁号和虛拟位址中的VPO串聯起來得到實體位址;
    • 因為實體和虛拟頁面都是P位元組的,是以實體頁面偏移和VPO是相同的
  • CPU執行步驟(頁面命中)
    1. 處理器生成一個虛拟位址,并把它傳遞給MMU;
    2. MMU生成一個PTE位址,并從高速緩存/主存中請求得到它;
    3. 高速緩存/主存向MMU傳回PTE;
    4. MMU構造實體位址,并把它傳給高速緩存/主存;
    5. 高速緩存/主存傳回所請求的資料字給處理器
  • CPU執行步驟(缺頁)
    1. PTE中有效位是0,觸發了一次異常,傳遞CPU中的控制到作業系統核心中的缺頁異常處理程式;
    2. 缺頁處理程式确定實體存儲器中的犧牲頁,如果這個頁已經被修改了,則把它換出到磁盤;
    3. 缺頁處理程式調入新的頁面,并更新存儲器中的PTE;
    4. 缺頁處理程式傳回到原來的程序,再次執行導緻缺頁的指令。CPU将引起缺頁的虛拟位址重新發送給MMU;因為虛拟頁面現在緩存在實體存儲器中,是以發生命中。

8.linux虛拟存儲器系統

  • linux為每個程序維持了一個單獨的虛拟位址空間,其中,核心虛拟存儲器位于使用者棧之上;
  • 核心虛拟存儲器包含核心中的代碼和資料結構,還有一些被映射到一組連續的實體頁面(主要是便捷地通路特定位置,比如執行I/O操作的時候需要的位置)
  • linux将虛拟存儲器組織成一些區域(也叫做段)的集合。一個區域就是已經存在的(已配置設定的)虛拟存儲器的連續片;
    • 意義:允許虛拟位址空間有間隙;核心不用記錄那些不存在的頁,這樣的頁也不用占用存儲器;
    • 區域結構
      • vm_start:指向這個區域的起始處;
      • vm_end:指向這個區域的結束處;
      • vm_prot:描述這個區域内所包含的所有頁的讀寫許可權限;
      • vm_fags:描述這個區域内的頁面是與其他程序共享的,還是這個程序私有的,等等;
      • vm_next:指向連結清單的下一個結構

9.存儲器映射

  • 概念:linux(以及一些其他形式的unix)通過将一個虛拟存儲器區域與一個磁盤上的對象關聯起來,以初始化這個虛拟存儲器區域的内容;
  • 類型:
    • unix檔案系統中的普通檔案:一個區域可以映射到一個普通磁盤檔案的連續部分,例如一個可執行目标檔案;
    • 匿名檔案:一個區域也可以映射到一個匿名檔案,匿名檔案由核心建立,包含的全是二進制零(CPU第一次引用這樣一個區域内的虛拟頁面的時候,核心就在實體存儲器中找到合适的犧牲頁面然後用二進制零将其覆寫)

10.共享對象&私有對象比較研究

【共享對象和私有對象在操作上有哪些差別,或者是對于程序來說的差別;這些東西與虛拟存儲器是密不可分的】

  • 引入:一個對象可以被映射到虛拟存儲器的一個區域,要麼作為共享對象,要麼作為私有對象。
    • 如果一個程序将一個共享對象映射到它的虛拟位址空間的一個區域内,那麼程序對這個區域的任何寫操作,對其他也把這個共享對象映射到自己的虛拟位址空間的程序來說也是可見的【無論對象被映射到多少個共享區域中,在實體存儲器中也隻需要該對象的一個拷貝】;
    • 對于一個映射到私有對象的區域所做的改變,對于其他程序來說是不可見的,并且程序對這個區域所做的任何寫操作都不會反映在磁盤上的對象中
資訊安全系統設計基礎第十四周學習總結

(圖1)

  • 深入:
    • 私有對象通過寫時拷貝的巧妙技術被映射到虛拟存儲器中,對于每個映射私有對象的程序,相應私有區域的頁表條目都被标記為隻讀,并且區域結構被标記為私有對象的寫時拷貝;
    • 隻要沒有程序試圖寫它自己的私有區域,它們就可以繼續共享;
    • 隻要有一個程序試圖去寫私有區域内的某個頁面,那麼這個寫操作就會觸發一個保護故障,當故障處理程式注意到保護異常是由于程序試圖寫私有的寫時拷貝區域中的一個頁面而引起的時候,它就會在實體存儲區域中建立這個頁面的一個新的拷貝,更新頁表條目指向這個新的拷貝,然後恢複其可寫權限
資訊安全系統設計基礎第十四周學習總結

【這樣做的好處就是最大限度地、最長時間地保護了實體存儲器空間,使得其不到必須的時候絕不會被浪費】

11.垃圾收集

  • 概念:垃圾收集器是一種動态存儲配置設定器,它自動釋放程式不再需要的已配置設定塊。這些塊稱為垃圾。自動回收的過程就叫做垃圾收集。垃圾收集器定期地識别垃圾塊,并相應地調用free,将這些塊放回到空閑連結清單中

二、課後習題篩選

1.練習題9.2

确定下列虛拟位址大小(n)和頁大小(P)的組合所需要的PTE數量

n = 16,P = 4K-->#PTE=16;

n = 16,P = 8K-->#PTE=8;

n = 32,P = 4K-->#PTE=1M

【解析:因為每個虛拟頁面都是 P = 2^p個位元組,是以在系統中總共有2^n/2^p = 2^(n-p)個可能的頁面,其中每個都需要一個頁表條目(PTE)】

2.練習題9.3

給定一個32位的虛拟位址空間和一個24位的實體位址,對于下面的頁面大小P,确定VPN,VPO,PPN,PPO的位數

【補充:VPN——虛拟頁号;VPO——虛拟頁面偏移量;PPN——實體頁号;PPO——實體頁面偏移量】

【了解:我們有32個虛拟位址位和24個實體位址位;頁面大小是1KB,這意味着對于VPO和PPO,都需要10位(去區分每個頁面内這2^10個具體的機關);那麼剩下的位分别是VPN,PPN】

P = 1KB——>VPN = 22,VPO = 10,PPN = 14,PPO = 10

P = 4KB——>VPN = 20,VPO = 12,PPN = 12,PPO = 12

3.練習題9.5

編寫一個C語言程式mmapcopy.c,使用mmap将任意一個大小的磁盤檔案拷貝到stdout,輸入檔案的名字必需作為一個指令行參數來傳遞

【答案:】

#include "csapp.h"
void mmapcopy(int fd,int size)
{
    char *bufp;
    bufp = Mmap(NULL,size,PROT_READ,MAP_PRIVATE,fd,0);
    Write(1,bufp,size);
    return;
}
int main(int argc,char **argv)
{
    struct stat stat;
    int fd;
    if(argc !=2)//因為傳進來的參數應該有兩個,一個是檔案名(題目要求用指令行傳遞);第二個是
    {
        printf("usage:%s ,<filename>\n",argv[0]);
        exit(0);
    }
    fd = Open(argv[0],O_RDONLY,0);
    fstat(fd,&stat);
    mmapcopy(fd,stat.st_size);
    exit(0);
}
           

【解析:】

  • struct stat stat:參考http://blog.csdn.net/dumgeewang/article/details/7741033 stat結構體内容如下:

st_mode 檔案權限和檔案類型資訊

st_ino 與該檔案關聯的inode

st_dev 儲存檔案的裝置

st_uid 檔案屬主的UID号

st_gid 檔案屬主的GID号

st_atime 檔案上一次被通路的時間

st_ctime 檔案的權限、屬主、組或内容上一次被修改的時間

stmtime 檔案的内容上一次被修改的時間。(和stctime的不同之處顯而易見)

st_nlink 該檔案上硬連接配接的個數

  • Open(argv[0],O_RDONLY,0):參考http://blog.csdn.net/liuyang1990i/article/details/7596630
    • 函數原型:int open(const char *path, int oflags,mode_t mode);
    • 函數說明:open一般用于打開或者建立檔案,在打開或建立檔案時可以制定檔案的屬性及使用者的權限等各種參數。
    • 參數說明:第一個參數path表示:路徑名或者檔案名。路徑名為絕對路徑名(如C:/cpp/a.cpp),檔案則是在目前工作目錄下的。第二個參數oflags表示:打開檔案所采取的動作。第三個參數mode表示:設定檔案通路權限的初始值。(與使用者掩碼umask變量有關,實際的通路權限有mode &~umask确定,隻有在第二個參數有O_CREAT時才用作用)
  • fstat:參考http://blog.csdn.net/dumgeewang/article/details/7741033  定義函數 int fstat(int fildes,struct stat *buf);用來将參數fildes所指的檔案狀态,複制到參數buf所指的結構中(struct stat)。
  • Mmap:要求核心建立一個新的虛拟存儲區域,并将檔案描述符fd所指的對象的一個連續片映射到這個區域中

【說明:】

這樣一來,函數的思路就是可以了解的了:

使用者輸入的兩個參數依次是執行動作(這個并不重要,是cat或者其他的都可以)和檔案絕對路徑(例如,c:/cpp/a.cpp);

在main函數中,首先判斷輸入個數是否合法(不合法就直接退出),然後将參數2指向的檔案打開并傳回描述符fd;利用fstat函數取得其檔案狀态存儲stat結構體,跳轉到mmapcopy函數;

mmapcopy函數調用Mmap映射到虛拟位址空間,然後利用Write函數将映射到的虛拟空間中的内容(也就是磁盤檔案内容)寫入STDOUT(檔案描述符為1)

三、心得

本章的内容對于前面許多章的内容(比如堆棧、比如程序)而言,都有一種“正中要害”的意義;因為涉及程序、互斥和共享的内容的時候必須要了解虛存,是以看完這一章更是覺得豁然開朗。