20145304 《信息安全系統設計基礎》第十四周學習總結

20145304 《信息安全系統設計基礎》第十四周學習總結

教材學習內容總結

虛擬存儲器

  • 一個系統中的進程是與其餘進程共享CPU和主存資源的。
  • 爲了更加有效地管理存儲器而且少出錯,現代系統提供了一種對主存的抽象概念,叫作虛擬存儲器(VM)。
  • 虛擬存儲器的三個重要功能:1)將主存看作是一個存儲在磁盤上的地址空間的高速緩存,在主存中只保護活動區域。2)爲每一個進程提供了一致的地址空間,從而簡化了存儲器管理。3)保護了每一個進程的地址空間不被其餘進程破壞。

物理和虛擬尋址

  • 物理尋址:主存被組織成一個由M個連續的字節大小的單元組成的數組,依次類推的尋址方式稱爲物理尋址。
  • 虛擬尋址:CPU生成一個虛擬地址(VA)來訪問主存,在被傳送到存儲器以前先轉換成適當的物理地址。地址翻譯經過CPU芯片上的存儲器管理單元完成。

地址空間

  • 地址空間是一個非負整數地址的有序集合:{0,1,2.....}
  • 線性地址空間:地址空間中的整數是連續的。
  • 虛擬地址空間:CPU生成的虛擬地址。
  • 物理地址空間:與系統中的物理存儲器的M個字節相對應。

虛擬存儲器做爲緩存的工具

VM系統將虛擬存儲器分割爲虛擬頁,虛擬頁面的集合分爲三個不相交的子集:html

  • 未分配的:系統還未分配的頁,未存儲數據,不佔用磁盤空間。
  • 緩存的:當前緩存在物理存儲器中的已分配頁
  • 未緩存的:沒有緩存在物理存儲器中的已分配頁。
頁表
  • 頁表:將虛擬頁映射到物理頁,就是一個頁表條目的數組。
  • PTE:由一個有效位和一個n位地址字段組成的,代表了該虛擬頁是否被緩存在DRAM中。
頁命中
  • 當CPU讀取一個字的時候,地址翻譯硬件將虛擬地址做爲一個索引來定位PTE,並從存儲器中讀取它。
缺頁
  • DRA緩存不命中稱爲缺頁。在不命中發生時,換入頁面的策略稱爲按需頁面調度。

虛擬存儲器做爲存儲器管理的工具

按需頁面調度和獨立的虛擬地址空間的結合簡化了連接和加載、代碼和數據共享,以及應用程序的存儲器分配。git

  • 簡化連接:獨立的地址空間容許每一個進程的存儲器映像使用相同的基本格式,而無論代碼和數據實際存放在物理存儲器的何處。
  • 簡化加載:虛擬存儲器使得容易想存儲器中加載可執行文件和共享文件對象。
  • 簡化共享:獨立地址空間爲操做系統提供了一個管理用戶進程和操做系統自身之間共享的一致機制。
  • 簡化存儲器分配:虛擬存儲器爲向用戶進程提供一個簡單的分配額外存儲器的機制。

虛擬存儲器做爲存儲器保護的工具

  • 經過在PTE上添加一些額外的許可來控制對一個虛擬頁面的內容訪問。

地址翻譯

  • 地址翻譯是一個N元素的虛擬地址空間(VAS)中的元素和一個M元素的物理地址空間(PAS)之間的映射。
MAP(A)=
A':若是虛擬地址A處的數據在PAS的物理地址A處'
空:若是虛擬地址A處的數據不在物理存儲器中
- CPU中的一個控制寄存器頁表基址寄存器指向當前頁表,n位的虛擬地址包含兩個部分:一個p位的虛擬頁面偏移(VPO) 和一個(n-p)位的虛擬頁號,頁表條目中的物理頁頁號和虛擬地址中的VPO串聯起來,就獲得了相應的物理地址。
- 在MMU中包括了一個關於PTE的小的緩存,稱爲翻譯後備緩衝器(TLB),其中每一行都保存着一個由單個PTE組成的塊。

CPU產生一個虛擬地址。
MMU從TLB中取出相對應的PTE。
MMU將這個虛擬地址翻譯成一個物理地址,並將它發送到高速緩存/主存。
高速緩存/主存將所請求的數據字返回給CPU。數組

- 多級頁表:用來壓縮頁表的經常使用方法是使用層次結構的頁表。

####存儲器映射
Linux經過將一個虛擬存儲器區域與一個磁盤上的對象關聯起來,以初始化這個虛擬存儲器區域的內容,這個過程成爲存儲器映射。具體能夠映射的對象有兩種:
- Unix文件系統中的普通文件。一個區域能夠映射到一個普通磁盤文件的連續部分。
- 匿名文件。匿名文件由內核建立,包含的全是二進制的0。
一旦一個虛擬頁面被初始化了,它就在一個由內核維護的專門的交換文件之間換來換去。交換文件也叫交換空間,或交換區域。
#####共享對象
- 一個對象被映射到虛擬存儲器的一個區域,要麼做爲共享對象,要麼做爲私有對象。
- 一個映射到共享對象的虛擬存儲器區域叫作共享區域,相似的,也有虛擬區域。
- 私有對象時使用一種叫作寫時拷貝的技術被映射到虛擬存儲器中的,相應私有區域的頁表條目都被標記爲只讀,而且區域結構被標記爲私有的寫時拷貝。

#####execve函數
- 使用execve函數將a.out程序加載到存儲器的過程
```
Execve("a.out",NULL,NULL);
```
具體通過的步驟以下:

刪除已存在的用戶區域。
映射私有區域。
映射共享區域。
設置程序計數器。緩存

#####使用map函數的用戶級存儲器映射
- Unix進程可使用mmap函數來建立新的虛擬存儲器區域,並將對象映射到這些區域當中

void mmap(void start,size_t length,int prot,int flags,int fd,off_t offest);
若成功則爲指向映射區域的指針,若出錯則MAP_FAILD(-1)
`- munmap函數刪除虛擬存儲器的區域。 ``` int munmap(void *start,size_t length); 若成功則返回0,若失敗則返回-1.安全

動態存儲器分配

動態存儲器分配器

當運行時須要額外虛擬存儲器時,使用動態存儲器分配器維護一個進程的虛擬存儲器區域。分配器有兩種風格。函數

  • 顯示分配器:要求應用顯式地釋聽任何已經分配的塊。
  • 隱式分配器:要求分配器檢測一個已分配塊什麼時候再也不被程序所使用,就釋放這個塊。也叫作垃圾收集器。
malloc和free函數
  • C標準庫提供了一個稱爲malloc程序包的顯式分配器,程序經過調用malloc函數來從標準堆中分配塊。
void *malloc(size_t size);
                若成功則爲指針,若出錯則爲NULL。
  • 經過調用free函數來釋放已分配的塊。
void free(void *ptr);
分配器的目標和要求
  • 顯式分配器工做的約束條件:
處理任意請求序列。
當即響應請求。
只使用堆。
對齊塊(對齊要求)。
不修改已分配的額塊。
  • 理想分配器的目標:
最大化吞吐率:吞吐率定義爲每一個單位時間裏完成的請求數。
最大化存儲器利用率:最有用的標準是峯值利用率。

垃圾處理

  • 垃圾收集器是一種動態存儲分配器。,自動釋放程序已經再也不須要的已分配快(垃圾)。
垃圾收集器的基本知識
  • 垃圾收集器將存儲器視爲一張有向可達圖,圖的節點被分配爲一組根節點和一組堆節點。當存在一條從任意根節點出發到併到達P的有向路徑時,就稱節點P是可達的。
Mark&Sweep垃圾收集器
  • Mark&Sweep垃圾收集器由標記階段和清除階段組成,標記階段標記出根節點全部可達的和已分配的後繼,清除階段釋放每一個未被標記的已分配塊。
  • 在對Mark&Sweep的描述中使用下列函數
ptr isPtr(ptr p):若是p指向一個已分配塊中的某個字,那麼就返回一個指向這個塊起始位置的指針b,不然返回NULL。
int blockMarked(ptr b):若是已經標記了塊b,就返回true。
int blockAllocated(ptr b):若是塊b是已分配的,就返回true。
void markBlock(ptr b):標記塊b。
int length(ptr b):返回塊b的以字爲單位的長度(不包括頭部)。
void unmarkBlock(ptr b):將塊b的狀態由已標記的改成未標記的。
ptr nextBlock(ptr b):返回堆中塊b的後繼。

C語言中常見的與存儲器有關的錯誤

  • 間接引用壞指針。
  • 讀未初始化的存儲器。
  • 容許棧緩衝區溢出。
  • 假設指針和指向他們的對象大小是相同的。
  • 形成錯位錯誤。
  • 引用指針,而不是他所指向的對象。
  • 誤解指針運算。
  • 引用不存在的變量。
  • 引用空閒堆塊中的數據。
  • 引發存儲器泄露。

代碼託管連接

https://git.oschina.net/20145304/computer-systems工具

學習進度條

代碼行數(新增/累積) 博客量(新增/累積) 學習時間(新增/累積) 重要成長
目標 5000行 30篇 400小時
第五週 30/60 1/5 10/32
第七週 0/160 1/7 8/48
第八週 0/160 1/8 5/53
第九周 157/317 1/9 7/60
第十週 647/964 1/10 6/66
第十一週 1086/2050 1/11 9/75
第十二週 10/2060 7/18 10/85
第十三週 473/2533 1/19 10/85
第十四周 /2533 220 10/95

參考資料

相關文章
相關標籤/搜索