三菱PLC加密破解

18230062509發表於2020-10-10

記憶體管理系統是作業系統最重要的部分之一。從計算機早期開始,我們實際使用的記憶體都要比系統中實際存在的記憶體多。記憶體分配策略克服了這一限制,並且其中最有名的就是 虛擬記憶體(virtual memory)。通過在多個競爭的程式之間共享虛擬記憶體,虛擬記憶體得以讓系統有更多的記憶體。虛擬記憶體子系統主要包括下面這些概念。
大地址空間
作業系統使系統使用起來好像比實際的實體記憶體要大很多,那是因為虛擬記憶體要比實體記憶體大很多倍。
保護
系統中的每個程式都會有自己的虛擬地址空間。這些虛擬地址空間彼此完全分開,因此執行一個應用程式的程式不會影響另一個。並且,硬體虛擬記憶體機制允許記憶體保護關鍵記憶體區域。
記憶體對映
記憶體對映用來向程式地址空間對映影像和資料檔案。在記憶體對映中,檔案的內容直接對映到程式的虛擬空間中。
公平的實體記憶體分配
記憶體管理子系統允許系統中的每個正在執行的程式公平分配系統的實體記憶體。
共享虛擬記憶體
三菱PLC加密破解儘管虛擬記憶體讓程式有自己的記憶體空間,但是有的時候你是需要共享記憶體的。例如幾個程式同時在 shell 中執行,這會涉及到 IPC 的程式間通訊問題,這個時候你需要的是共享記憶體來進行資訊傳遞而不是通過拷貝每個程式的副本獨立執行。
下面我們就正式探討一下什麼是 虛擬記憶體
虛擬記憶體的抽象模型
在考慮 Linux 用於支援虛擬記憶體的方法之前,考慮一個不會被太多細節困擾的抽象模型是很有用的。
處理器在執行指令時,會從記憶體中讀取指令並將其解碼(decode),在指令解碼時會獲取某個位置的內容並將他存到記憶體中。然後處理器繼續執行下一條指令。這樣,處理器總是在訪問儲存器以獲取指令和儲存資料。
在虛擬記憶體系統中,所有的地址空間都是虛擬的而不是物理的。但是實際儲存和提取指令的是實體地址,所以需要讓處理器根據作業系統維護的一張表將虛擬地址轉換為實體地址。
為了簡單的完成轉換,虛擬地址和實體地址會被分為固定大小的塊,稱為 頁(page)。這些頁有相同大小,如果頁面大小不一樣的話,那麼作業系統將很難管理。Alpha AXP系統上的 Linux 使用 8 KB 頁面,而 Intel x86 系統上的 Linux 使用 4 KB 頁面。每個頁面都有一個唯一的編號,即頁面框架號(PFN)。

上面就是 Linux 記憶體對映模型了,在這個頁模型中,虛擬地址由兩部分組成:偏移量和虛擬頁框號。每次處理器遇到虛擬地址時都會提取偏移量和虛擬頁框號。處理器必須將虛擬頁框號轉換為物理頁號,然後以正確的偏移量的位置訪問物理頁。
上圖中展示了兩個程式 A 和 B 的虛擬地址空間,每個程式都有自己的頁表。這些頁表將程式中的虛擬頁對映到記憶體中的物理頁中。頁表中每一項均包含

有效標誌(valid flag): 表明此頁表條目是否有效
該條目描述的物理頁框號
訪問控制資訊,頁面使用方式,是否可寫以及是否可以執行程式碼

要將處理器的虛擬地址對映為記憶體的實體地址,首先需要計算虛擬地址的頁框號和偏移量。頁面大小為 2 的次冪,可以通過移位完成操作。
如果當前程式嘗試訪問虛擬地址,但是訪問不到的話,這種情況稱為 缺頁異常,此時虛擬作業系統的錯誤地址和頁面錯誤的原因將通知作業系統。
通過以這種方式將虛擬地址對映到實體地址,虛擬記憶體可以以任何順序對映到系統的物理頁面。
按需分頁
由於實體記憶體要比虛擬記憶體少很多,因此作業系統需要注意儘量避免直接使用低效的實體記憶體。節省實體記憶體的一種方式是僅載入執行程式當前使用的頁面(這何嘗不是一種懶載入的思想呢?)。例如,可以執行資料庫來查詢資料庫,在這種情況下,不是所有的資料都裝入記憶體,只裝載需要檢查的資料。這種僅僅在需要時才將虛擬頁面載入進內中的技術稱為按需分頁。
交換
如果某個程式需要將虛擬頁面傳入記憶體,但是此時沒有可用的物理頁面,那麼作業系統必須丟棄實體記憶體中的另一個頁面來為該頁面騰出空間。
如果頁面已經修改過,那麼作業系統必須保留該頁面的內容,以便以後可以訪問它。這種型別的頁面被稱為髒頁,當將其從記憶體中移除時,它會儲存在稱為交換檔案的特殊檔案中。相對於處理器和實體記憶體的速度,對交換檔案的訪問非常慢,並且作業系統需要兼顧將頁面寫到磁碟的以及將它們保留在記憶體中以便再次使用。
Linux 使用最近最少使用(LRU)頁面老化技術來公平的選擇可能會從系統中刪除的頁面,這個方案涉及系統中的每個頁面,頁面的年齡隨著訪問次數的變化而變化,如果某個頁面訪問次數多,那麼該頁就表示越 年輕,如果某個呃頁面訪問次數太少,那麼該頁越容易被換出。
物理和虛擬定址模式
大多數多功能處理器都支援 實體地址模式和虛擬地址模式的概念。物理定址模式不需要頁表,並且處理器不會在此模式下嘗試執行任何地址轉換。 Linux 核心被連結在實體地址空間中執行。
Alpha AXP 處理器沒有物理定址模式。相反,它將記憶體空間劃分為幾個區域,並將其中兩個指定為物理對映的地址。此核心地址空間稱為 KSEG 地址空間,它包含從 0xfffffc0000000000 向上的所有地址。為了從 KSEG 中連結的程式碼(按照定義,核心程式碼)執行或訪問其中的資料,該程式碼必須在核心模式下執行。連結到 Alpha 上的 Linux核心以從地址 0xfffffc0000310000 執行。
訪問控制
頁面表的每一項還包含訪問控制資訊,訪問控制資訊主要檢查程式是否應該訪問記憶體。
必要時需要對記憶體進行訪問限制。 例如包含可執行程式碼的記憶體,自然是隻讀記憶體; 作業系統不應允許程式通過其可執行程式碼寫入資料。 相比之下,包含資料的頁面可以被寫入,但是嘗試執行該記憶體的指令將失敗。 大多數處理器至少具有兩種執行模式:核心態和使用者態。 你不希望訪問使用者執行核心程式碼或核心資料結構,除非處理器以核心模式執行。

訪問控制資訊被儲存在上面的 Page Table Entry ,頁表項中,上面這幅圖是 Alpha AXP的 PTE。位欄位具有以下含義

V

表示 valid ,是否有效位

FOR

讀取時故障,在嘗試讀取此頁面時出現故障

FOW

寫入時錯誤,在嘗試寫入時發生錯誤

FOE

執行時發生錯誤,在嘗試執行此頁面中的指令時,處理器都會報告頁面錯誤並將控制權傳遞給作業系統,

ASM

地址空間匹配,當作業系統希望清除轉換緩衝區中的某些條目時,將使用此選項。

GH

當在使用單個轉換緩衝區條目而不是多個轉換緩衝區條目對映整個塊時使用的提示。

KRE

核心模式執行下的程式碼可以讀取頁面

URE

使用者模式下的程式碼可以讀取頁面

KWE

以核心模式執行的程式碼可以寫入頁面

UWE

以使用者模式執行的程式碼可以寫入頁面

頁框號

對於設定了 V 位的 PTE,此欄位包含此 PTE 的物理頁面幀號(頁面幀號)。對於無效的 PTE,如果此欄位不為零,則包含有關頁面在交換檔案中的位置的資訊。
除此之外,Linux 還使用了兩個位

_PAGE_DIRTY

如果已設定,則需要將頁面寫出到交換檔案中

_PAGE_ACCESSED

Linux 用來將頁面標記為已訪問。
快取
上面的虛擬記憶體抽象模型可以用來實施,但是效率不會太高。作業系統和處理器設計人員都嘗試提高效能。 但是除了提高處理器,記憶體等的速度之外,最好的方法就是維護有用資訊和資料的快取記憶體,從而使某些操作更快。在 Linux 中,使用很多和記憶體管理有關的緩衝區,使用緩衝區來提高效率。

相關文章