1、
存儲器是硬件資源。包括內(nèi)存和外存。
程序、數(shù)據(jù)保存在外存中,斷電后不會丟失。內(nèi)存是CPU直接交互的,內(nèi)存塊。
處理器不會直接訪問外存,程序裝入內(nèi)存后才能執(zhí)行,數(shù)據(jù)讀入內(nèi)存后才能使用。
內(nèi)存由進程共享。
內(nèi)存是外存的緩存,cache 是內(nèi)存的緩存。
多層次存儲器是速度與成本折中的結(jié)果。
一個數(shù)據(jù)會同時出現(xiàn)在多個地方。
對磁盤中某整數(shù) A 進行修改,引起的數(shù)據(jù)傳遞過程:磁盤(外存)-->內(nèi)存-->cache-->寄存器
2、
內(nèi)存管理的任務是:(1)實現(xiàn)物理內(nèi)存的分配與回收
(2)運行程序、加載程序、實現(xiàn)地址映射
(3)為進程模擬出盡可能大的虛擬內(nèi)存空間
(4)提供虛擬內(nèi)存的隔離、保護、共享
內(nèi)存管理工作分為:物理內(nèi)存管理、邏輯內(nèi)存管理、虛擬內(nèi)存管理
3、地址空間
物理內(nèi)存單元只能用物理地址訪問。
有些設備中的寄存器、緩存等也必須用物理地址訪問。
不能訪問任何實體的物理地址稱為空洞。
有效物理地址的集合稱為物理地址空間。
內(nèi)存條中的有些內(nèi)存因無地址而不能使用。
物理地址用于標識物理內(nèi)存單元,地址與內(nèi)存單元的對應關系是固定不變的。
解決:進程使用的地址成為邏輯地址。一個進程所使用的所有邏輯地址的集合稱為邏輯地址空間。
邏輯地址是在編譯(匯編)、連接、加載過程中確定的。
符號地址:程序中使用的標號、變量名、函數(shù)名等,不是物理地址。 --> 命名空間
相對地址:相對于某位置的偏移量,如相對于開始或當前位置的偏移量,不是物理地址。
4、編譯、連接、加載
程序員用高級或匯編語言開發(fā)程序,源程序通常由多個模塊組成,處理器不認識高級語言、匯編語言。
(1)編譯:需要將源程序模塊 翻譯/編譯/匯編 成目標代碼
(2)連接:目標代碼中含有對其它模塊或庫中符號的引用,連接程序?qū)⒕幾g后的目標模塊連接在一起,并解析其中的跨模塊符號地址引用,形成可執(zhí)行模塊。
(3)加載:可執(zhí)行文件中的程序裝入內(nèi)存形成進程映像
Loader 的任務就是將可執(zhí)行模塊加載到內(nèi)存。
①名字空間:源程序中由符號名字(變量名、函數(shù)名、標號等)構(gòu)成的集合。
②邏輯空間:程序中相對地址的集合,也稱邏輯地址空間。(以0為基址順序排列)
③物理空間:內(nèi)存中一系列物理單元的集合,也稱為物理空間或絕對空間。
5、完成地址裝換的時機
(1)程序員完成地址轉(zhuǎn)換(絕對加載):編程時就用物理地址。物理地址又稱絕對地址。
(2)編譯程序完成地址轉(zhuǎn)換:程序使用符號地址,編譯后為絕對地址。
(3)加載程序完成地址轉(zhuǎn)換(靜態(tài)可重定位加載):編譯或匯編程序?qū)⒎柕刂忿D(zhuǎn)換成相對地址,加載程序在裝入程序時,臨時為其選擇一個內(nèi)存位置,如Base,而后將程序中所有相對地址都加上Base,一次性為程序定位,稱靜態(tài)重定位。程序模塊中應包含重定位信息。
(4)在執(zhí)行時完成地址轉(zhuǎn)換(動態(tài)可重定位加載):編譯或連接程序生成可重定位的目標模塊,其中的地址都是相對的。加載程序直接將可重定位模塊裝入內(nèi)存,不做地址轉(zhuǎn)換。處理器在執(zhí)行程序的過程中,逐步完成相對地址到物理地址的轉(zhuǎn)換。動態(tài)重定位,需要硬件支持。
(重定位寄存器,段描述符、段寄存器、頁目錄、頁表)
完成連接的時機:
(1)在程序設計時。所有的程序代碼都放在一個文件中。
(2)在編譯(匯編)時。將所有程序源代碼集中在一起編譯(匯編)。
(3)在加載前。由連接程序?qū)⒏髂繕四K整合在一起,形成完整的可重定位目標模塊。
(4)在加載時。加載程序讀入主模塊,而后根據(jù)其中的符號引用逐個讀入子模塊,重定位子模塊,并解析各符號引用。
(5)在執(zhí)行時(動態(tài)連接)。加載程序只裝入程序的主模塊,不解析其中的符號引用。當程序用到某符號時(如子程序調(diào)用),再加載對應的目標文件并解析符號引用。
可執(zhí)行程序中有指示信息,如子模塊對應的文件、符號在子模塊中的位置等。需要專門的動態(tài)連接程序。子模塊通常在共享庫(動態(tài)連接庫)中。
現(xiàn)在均是在執(zhí)行時完成: