天天看點

計算機原理學習(5)-- x86-16 CPU和記憶體管理前言1. 8086 CPU2. 程式的記憶體結構3. MS-DOS記憶體結構4. MS-DOS 記憶體管理總結:參考:

前言

前面我們已經了解了計算機硬體的工作原理,以及作業系統的發展。我們知道是記憶體把計算機硬體和軟體聯系了起來。不誇張的說,了解了軟體在記憶體中的結構,就基本了解了程式最底層的運作原理。是以從這一篇開始,将深入的讨論計算機中記憶體管理和布局。記憶體的管理同計算機硬體以及擦做系統是分不開的。這一篇我們主要讨論早期x86 CPU和DOS系統對于記憶體的管理。

1. 8086 CPU

說到CPU,我們第一個想到的應該就是Intel。 1971年11月15号,Intel釋出了全球第一款微處理器Intel 4004,這是一個主頻隻有108KHz的4bit處理器。而後又釋出了8bit的8008處理器。而我們最熟悉的應該就是8086,為什麼?因為随便找一本彙編的書籍看看,都會有8086四個大字。因為8086标志着Intel x86體系結構的CPU的開始。而且8086/8088開始用于便攜電腦,是以我們就從8086開始介紹。80186除8086核心,另外包括了中斷控制器、定時器、DMA、I/O、UART、片選電路等外設。

計算機原理學習(5)-- x86-16 CPU和記憶體管理前言1. 8086 CPU2. 程式的記憶體結構3. MS-DOS記憶體結構4. MS-DOS 記憶體管理總結:參考:

1.1 8086/8088記憶體通路

8086是x86體系結構的開始,他采用了16bit,但是位址線卻用了20位。前面介紹CPU工作原理的時候哦我們知道,CPU内部有一個PC計數器,用來存儲下一個要執行的實體位址。但是16位的寄存器如何存儲20位的位址呢?

不僅僅是8086,我們發現之前的CPU的位寬和可尋址範圍都不是對應的關系,而且4004和8008也找不到位址線位寬。對于8080來說,位址有16位,而它内部有1個主累加器和5個次累加器,是以它使用2個寄存器組合來通路16位位址。而對于8086,并沒有采用相同的方式,而是參考了PDP-11小型機,設計出了分段尋址技術。

計算機原理學習(5)-- x86-16 CPU和記憶體管理前言1. 8086 CPU2. 程式的記憶體結構3. MS-DOS記憶體結構4. MS-DOS 記憶體管理總結:參考:

因為CPU一次能送出的位址是16位,要通路20位位址的存儲器就需要使用2個16位的位址計算表示一個20位的位址。這裡采用的辦法是,将記憶體分為不同邏輯段,每段段有自己的段位址(16位),而段内資料位址則是相對于段首位址的偏移位址(16位)。而且段之間是可以相鄰或者重疊的。

因為偏移位址是16位,是以最大的範圍是64K,而對于1M記憶體來說,最少有16個邏輯段。而因為段寄存器也是16位,是以段的實體位址需要是16的倍數,表示為0xXXXX0。這樣的位址可以壓縮為0xXXXX,是以段首位址的高16位表示段值。是以段首的實體位址 = 段值 * 0x10。那麼偏移位址是相對于段首位址來說的,那麼要通路的實體位址公式為:實體位址 = 段值*0x10 + 偏移位址

這裡介紹一下邏輯位址的概念,邏輯位址指的是機器語言指令中,用來指定一個操作數或者是一條指令的位址。Intel中段式管理中,對邏輯位址要求,“一個邏輯位址,是由一個段辨別符加上一個指定段内相對位址的偏移量“,表示為 [段辨別符:段内偏移量]。

計算機原理學習(5)-- x86-16 CPU和記憶體管理前言1. 8086 CPU2. 程式的記憶體結構3. MS-DOS記憶體結構4. MS-DOS 記憶體管理總結:參考:

1.2 8086寄存器

計算機原理學習(5)-- x86-16 CPU和記憶體管理前言1. 8086 CPU2. 程式的記憶體結構3. MS-DOS記憶體結構4. MS-DOS 記憶體管理總結:參考:

關于8086CPU的架構圖,我們在前面的文章中出現了多次。這裡我們隻看看8086的寄存器。我們知道寄存器對于CPU來時是非常的重要,無論是取指令還是做運算都需要寄存器來存放資料。我們在多線程程式設計中經常聽到一個詞是切換上下文,這裡所指的上下文就包含CPU寄存器的值,當然這個是後話,後面會介紹。

8086一共有14個16位寄存器,具體分類如上圖:

  • AX,BX,CX,DX 是主寄存器,又叫通用寄存器, 為了相容8位CPU,采用2個8位寄存器組合而成,這4個寄存器主要用作資料寄存器,節省從寄存器存取操作的時間。
  • SI, DI是變址寄存器,主要用于操作字元串,當然也可以作為通用寄存器;而BP,SP是指針寄存器,主要用于堆棧操作。
  • CS,DS,ES,SS是段寄存器,是為了記憶體分段而設定的,用來存放邏輯段的段值。
  • IP 是指令指針寄存器,類似前面提到的PC計數器,這裡用作表示下一條指令相對于CS段的偏移
  • Flags标志寄存器,主要用于表示CPU計算的運算結果和狀态。

關于這些寄存器具體作用可以參考:8086 CPU 寄存器簡介

1.3 8086段寄存器的引用

從8086開始,采用了分段式的記憶體管理,于是在通路記憶體時不在像以前那樣,拿到位址直接送到總線進行通路,而是需要通過計算得到的。這就涉及到使用那個段寄存器和偏移量。一般來說代碼不需要指定要通路的段,總線可以自行判斷,當然也可以顯示的指定。

計算機原理學習(5)-- x86-16 CPU和記憶體管理前言1. 8086 CPU2. 程式的記憶體結構3. MS-DOS記憶體結構4. MS-DOS 記憶體管理總結:參考:
計算機原理學習(5)-- x86-16 CPU和記憶體管理前言1. 8086 CPU2. 程式的記憶體結構3. MS-DOS記憶體結構4. MS-DOS 記憶體管理總結:參考:

比如我們在擷取下一條指令位址時,就是用CS*16+IP,而當執行一條取資料指令時,就是用DS*16+有效位址來通路,上表就定義了不同操作時是用到的寄存器和偏移。

這裡可能有一個疑問:程式是如何被加載到不同記憶體段呢?這個其實和程式的編譯,可執行檔案的結構以及作業系統有關,有此可見一項新技術的使用是需要硬體和軟體互相配合的。這些會在後面介紹。

1.4 8086尋址方式

表示指令中操作數所在的方法稱為尋址方式。

1.4.1 立即尋址

操作數直接包含在指令中,比如MOV AX, 1234H, 一般用于給存儲器或寄存器指派。

計算機原理學習(5)-- x86-16 CPU和記憶體管理前言1. 8086 CPU2. 程式的記憶體結構3. MS-DOS記憶體結構4. MS-DOS 記憶體管理總結:參考:

1.4.2 寄存器尋址

操作數存放在寄存器中,而指令中存放的是寄存器号,比如MOV SI, AX。這裡可以用到的寄存器有AX,BX,CX,DX,SI,DI,SP,BP.

1.4.3 直接尋址

操作數在存儲器中,指令中直接包含存儲器的有效位址。比如MOV AX, [1234H]。從前面知道,這裡的有效位址并不是真正的實體位址而是偏移位址,因為這是一條取資料操作指令,是以在沒指定段的時候,預設通路的是DS資料段。最後得到真正的實體位址。

計算機原理學習(5)-- x86-16 CPU和記憶體管理前言1. 8086 CPU2. 程式的記憶體結構3. MS-DOS記憶體結構4. MS-DOS 記憶體管理總結:參考:

當然也可以指定要通路的段比如: MOV AX ES:[1234H],這種尋址方式隻适用于段小于64K的情況,在程式中存儲器的有效位址一般用變量表示。

1.4.4 寄存器間接尋址

操作數存放在寄存器中,操作數的有效位址存放在SI, DI, BX, BP這4個寄存器中。在一般情況下如果有效位址在SI,DI,BX中則通路DS段,而當在BP中時則通路SS段。比如MOV AX,[SI]

計算機原理學習(5)-- x86-16 CPU和記憶體管理前言1. 8086 CPU2. 程式的記憶體結構3. MS-DOS記憶體結構4. MS-DOS 記憶體管理總結:參考:

同樣,也可以指定有效位址要通路的段,比如MOV AX, CS:[BX]。

1.4.5 寄存器相對尋址

操作數在存儲器中,操作時的有效位址存放在SI, DI, BX, BP寄存器并加上一個8位或16位的位移量中。比如MOV AX, [DI+1234H],計算方法和寄存器間接尋址相同,隻是多加上一個偏移量。

計算機原理學習(5)-- x86-16 CPU和記憶體管理前言1. 8086 CPU2. 程式的記憶體結構3. MS-DOS記憶體結構4. MS-DOS 記憶體管理總結:參考:

這種尋址方式有利于實作進階語言中對結構類型資料所實施的操作。

1.4.6 基址加變址尋址

操作數在存儲器中,操作時的有效位址是由基址寄存器BX或BP和變址寄存器SI或DI相加得到的。比如MOV AX, [BX+DI]

計算機原理學習(5)-- x86-16 CPU和記憶體管理前言1. 8086 CPU2. 程式的記憶體結構3. MS-DOS記憶體結構4. MS-DOS 記憶體管理總結:參考:

這種尋址方式一般用來處理數組的通路,基址寄存器存放數組首位址,而變址寄存器來定位數組的每個元素。也可以寫作MOV AX,[BX][DI]。

1.4.7 相對基址加變址尋址

操作數存放在存儲器,操作數有效位址由基址寄存器BX或BP,變址寄存器SI或DI, 以及一個8位或16位位移量相加得到的。比如MOV AX, [BX+DI-2]

計算機原理學習(5)-- x86-16 CPU和記憶體管理前言1. 8086 CPU2. 程式的記憶體結構3. MS-DOS記憶體結構4. MS-DOS 記憶體管理總結:參考:

2. 程式的記憶體結構

前面我們介紹過程式編譯的過程,當代碼被編譯成可執行檔案後,當運作程式時,通過裝入程式把我們的可執行檔案從磁盤裝載到記憶體中,然後指定程式入口位址,CPU變開始順序的執行。這裡就涉及到CPU如何定位程式的位址的問題。其實對于早期程式編寫,裝入我也不是很了解,資料也挺少的。

2.1 早期程式的裝入

我們知道,早期的計算機中,CPU并沒有對記憶體分段,是以程式運作時,擷取的下一條指令或資料的位址就是真實的記憶體位址。于是早期的程式在編譯時就需要确定裝載後在了在記憶體中的絕對位置。比如裝載到記憶體的0x00000010處,那麼在編譯時生成的指定和資料,就是基于0x00000010向上擴充。

計算機原理學習(5)-- x86-16 CPU和記憶體管理前言1. 8086 CPU2. 程式的記憶體結構3. MS-DOS記憶體結構4. MS-DOS 記憶體管理總結:參考:

當程式被裝入記憶體後,裝載程式把PC計數器設定為0x00000010,然以CPU開始執行我們的程式。這種方式需要對記憶體使用情況非常熟悉。

2.2 8086程式的裝入和運作

8086CPU将記憶體分割成了不同的段,于是指令和資料的有效位址并不是真正的實體位址而是相對于段首位址的偏移位址。CPU在取位址時會進行計算,是以我們在編譯程式時無法确定程式在記憶體中絕對的位置。而且前面介紹了8086的尋址方式,我們知道在不指定段寄存器的時候,如果是取指定會使用CS,而如果是取操作數則是使用DS。是以我們程式的資料和指令必須裝載到不同的段中。

我們知道,記憶體并沒有被真正的分段,而是通過CPU中段寄存器來存放不同段的首位址。是以最好的辦法是我們對程式也進行分段,把資料放在程式的資料段中,而代碼則放在代碼段中。這樣在編譯的時候,每個資料會每條指定的位址都是相對于段的偏移量,我們隻需要設定CPU的CS,DS端寄存的位址。8086彙編語言中就有段定義語句,就是為了和存儲器結構對應。

計算機原理學習(5)-- x86-16 CPU和記憶體管理前言1. 8086 CPU2. 程式的記憶體結構3. MS-DOS記憶體結構4. MS-DOS 記憶體管理總結:參考:

上圖顯示了彙程式設計式編譯後背加載到記憶體的情況:

  1. 8086的彙編支援定義邏輯段,這裡定義了邏輯段和代碼段。(我們知道彙編語言是CPU指令的一種翻譯形式,和硬體密切相關,是以對于8086來說有特定的彙編語言)
  2. 在程式編譯時,給每條指令和資料配置設定一個偏移位址。
  3. 在加載程式之前,載入程式會在記憶體中找到可以存放每個段的位址,并且把段值寫入到執行檔案中,可以了解為給CSEG和DSEG指派。
  4. 正式載入程式時,會把CSEG,DSEG加載到之前找到的實體位址,并且會去更新CS寄存器為CSEG的值。
  5. 載入程式把IP寄存器設定為第一條指令的偏移位址。
  6. 把控制權交給我們的程式,此時如圖CS = 0x0002(開始執行CS*16 + IP)
  7. 執行第一條語句,把DSEG的段值寫入到AX,然後執行第二條,把AX的值寫入到DS, 也就我們設定了DS寄存器的段值。
  8. 當執行到MOV AX, VAR1時,因為是取資料操作,是以從DS段取資料,此時DS=0x0001。 最終VAR1在記憶體中的位址 = 0x0001*0x10 + 0x0000 = 0x00010。

這裡CS和DS的值不是編譯時确定的,而是在配置設定段記憶體時獲得的。但是DS的值是從DSEG寫入的,那麼DSEG的值是不是加載程式寫入到執行檔案中的呢?不是很确定。另外或許的是實體記憶體位址,而CS中并不是實體記憶體,是不是要用實體記憶體/0x10來計算出CS和DS的值呢?

2.3 8086的多種模式

前面說過了,段的大小最大為64位,那麼如果我們的程式的段大于64K或者是對于之前的8位程式,又是如何運作的呢?實際上8086根據分段的記憶體結構,有六種運作方式。對于8位機上的程式可以不考慮段位址直接以.com可執行檔案以“微模式”在8086上運作。這是當時8086與MS-DOS作為新平台取得市場成功的關鍵原因——大量已存的CP/M應用程式能很快得到利用。而對于大于64k的段則運作在大模式中。這塊内容完全不懂,有興趣就自己研究吧。

3. MS-DOS記憶體結構

前面讨論完了CPU的記憶體通路方式,最後讨論一下作業系統的記憶體管理。這裡選用了MS-DOS作業系統。這裡并沒有指定是那一個版本,隻是從大體上去介紹記憶體管理方式。MS-DOS是一個單任務的批處理作業系統,同時隻能有一個.COM或.EXE檔案被執行,所做系統沒有任務排程功能,使用.BAT檔案可以實作批處理功能。而早期的Windows1.x也是基于MS-DOS,隻是增加了圖形界面。

3.1 早期MS-DOS的記憶體布局

IBM和微軟在設計DOS作業系統時,當時CPU主要是8086,采用了20位位址線,是以最大記憶體通路隻1M。但是在在當時普片采用8bitCPU,最大記憶體通路64K的CPU來說,這個記憶體空間已經相當大了,是以MS-DOS就基于這個進行了設計。

計算機原理學習(5)-- x86-16 CPU和記憶體管理前言1. 8086 CPU2. 程式的記憶體結構3. MS-DOS記憶體結構4. MS-DOS 記憶體管理總結:參考:

DOS把記憶體劃分問了2個區域:

  • 正常記憶體: 也叫基本記憶體,是記憶體低端的640K。DOS系統本身、中斷向量表、系統資料、驅動程式都會常駐在這一段記憶體中,剩餘的就是使用者程式可以使用的空間,大概600K,而随着MS-DOS功能越來越多,DOS本身所占用的空間也越來越大。而MS-DOS提供的記憶體管理,也主要是管理正常記憶體塊。
  • 上位記憶體:這一塊記憶體區域是從640K-1M,是給外接卡裝置的資料緩沖區以及ROM-BIOS使用的。 在這段記憶體空間中有一些空閑的空間,稱為UMB(Upper Memory Block)。這些記憶體DOS系統無法進行管理。EMM386.exe可以管理這一部分記憶體。

3.2 MS-DOS 擴充記憶體(EMS)

随着PC的發展,越來越多硬體支援MS-DOS, 越來越多的軟體開始在MS-DOS上被使用,于是640K記憶體中,作業系統,驅動程式,殺毒程式,常駐程式的體積越來越來,而應用程式可以使用的空間越來越小。為了能讓8086使用更大的記憶體,Intel和MS聯合推出了EMS(Expanded Memory Specification)擴充記憶體。通過主機闆上的擴充槽,最多可以支援32M記憶體。

但是CPU并不不能直接通路擴充的記憶體,通過擴充記憶體管理程式,使用了上位記憶體空間中的64K空餘記憶體(UMB),這64K記憶體被分成4個頁,每頁16K,這部分頁稱為“頁架構”,EMS記憶體也分成一個個16K的頁,總數可達2000個。使用EMS的程式最多允許同時通路4個頁,當程式要通路到某個頁時,記憶體控制闆就把相應EMS頁的内容複制到頁架構中讓程式讀寫,讀寫完後把頁架構中頁的内容複制回相應的EMS記憶體頁,再把别的EMS頁内容複制到頁架構中讓程式讀寫。是以也被稱為“調頁式擴充記憶體“。

3.3 實模式和高位記憶體(HMA)

1982年,Intel釋出了新的80286 CPU,址線擴充到24位,最多可以通路16M記憶體。 但是在80286無法相容8086上的程式,是以Intel提出了實模式和保護模式兩種方式來解決這個問題。在實模式下,80286依然隻使用20位的位址線,最多通路1M記憶體,以前的8086程式可以正常運作,而在保護模式下,程式可以使用全部的16M記憶體。是以實模式,其實就是8086的運作模式。

在8086記憶體通路時,當段值+偏移都為最大時:FFFF0h+FFFFh=10FFEFh=1M+64K,得到的位址超出了1M的範圍,這一塊位址稱為高位位址。但是因為隻有20根位址線,是以會采用一種wrap-around的技術,将位址對1M求模,得到記憶體位址。但是80286開始擁有了24條位址線,于是在實模式下,當使用10FFEFh位址通路時,因為A20位址線的存在,是以會直接通路記憶體這一塊的位址。

計算機原理學習(5)-- x86-16 CPU和記憶體管理前言1. 8086 CPU2. 程式的記憶體結構3. MS-DOS記憶體結構4. MS-DOS 記憶體管理總結:參考:

IBM為了解決這個問題,采用了用鍵盤控制器來控制A20,稱為A20 Gate,當打開的時候,可以通路到高位記憶體,而禁用時則和8086行為一樣。IBM-PC大部分禁用了A20 Gate,現在大多PC通過BIOS調用來控制A20 Gate。 關于A20可以參考:對A20 GATE的思考

3.4 實模式和擴充記憶體(XMS)

80286有24根位址線,最大記憶體容量可以達到16M,但是現在的問題在于MS-DOS本身是運作于實模式下的,是以即便處理器支援更大的記憶體,也無法使用。是以DOS上的應用程式最多隻能使用640K的記憶體,這個也就是我們經常聽到DOS程式的640K限制的問題。但這并不是8086時期硬體導緻640K限制。

計算機原理學習(5)-- x86-16 CPU和記憶體管理前言1. 8086 CPU2. 程式的記憶體結構3. MS-DOS記憶體結構4. MS-DOS 記憶體管理總結:參考:

為了解決這個問題就使用看擴充記憶體XMS(Extended Memory Specification)。當然隻有在80286和更高的處理器才才能支援。幾乎所有使用DOS的機器上超過1M的記憶體都是擴充記憶體。擴充記憶體同樣不能被DOS直接使用,DOS5.0以後提供了Himem.sys這個擴充記憶體管理程式,可以通過它來管理擴充記憶體。 Emm386.exe可以把擴充記憶體(XMS)仿真成擴充記憶體(EMS),以滿足一些要求使用擴充記憶體的程式。

3.5 MS-DOS和保護模式

在DOS作業系統下,無論CPU支援多大的記憶體空間,程式都隻能使用正常記憶體空間的640K記憶體,運作在實模式中。但是80286之後的CPU可以支援保護模式,于是就有一些程式可以通過DPMI(DOS Protocted Mode Interface), DOS擴充器程式比如DOS4GW.exe使得CPU進入到保護模式,進而直接通路擴充的記憶體,但是此時,已經不是在DOS環境下了。而且對于80286來說一旦切換到保護模式就無法回到實模式,隻能reset CPU。

實際上大多介紹的保護模式是指80386的32位保護模式,而非80286的16位保護模式。而80386之後,保護模式基本沒有大的變化,後面将會詳細介紹32位保護模式下的記憶體結構和管理。

計算機原理學習(5)-- x86-16 CPU和記憶體管理前言1. 8086 CPU2. 程式的記憶體結構3. MS-DOS記憶體結構4. MS-DOS 記憶體管理總結:參考:

4. MS-DOS 記憶體管理

了解了MS-DOS的記憶體結構,最後我們看看MS-DOS是怎麼管理記憶體的。這一部分主要是看DOS如何管理正常記憶體的640K。

4.1 MS-DOS系統子產品

計算機原理學習(5)-- x86-16 CPU和記憶體管理前言1. 8086 CPU2. 程式的記憶體結構3. MS-DOS記憶體結構4. MS-DOS 記憶體管理總結:參考:

我們可以看到在640K的正常記憶體中,一些系統子產品專用了一部分記憶體。MS-DOS主要由一個引導程式好3個子產品程式完成啟動

  • BOOT: 這是一個位于磁盤0扇區上的引導程式,主要是檢查DOS系統盤,并把IO.SYS加載的
  • IO.SYS是系統的輸入輸出子產品,ROM-BIOS 是固化早BIOS中的裝置驅動; 系統啟動時IO.SYS接收到指令轉換為裝置控制指令,由ROM-BIOS中的驅動程式完成裝置操作。
  • MSDOS.SYS 這個是DOS的核心,主要進行記憶體,磁盤,外設的管理 
  • COMMOND.COM: 這個是MS-DOS和使用者之間的接口程式,用于接收使用者輸入的指令并執行。

4.2 MS-DOS 程序

MS-DOS是一個單任務的作業系統,是以不存在任務排程(80286也不支援多任務,80386支援任務切換)。當代碼編寫好生成可執行檔案之後,被加載到記憶體空間時,而在程式記憶體空間前有一個256位元組的程式段字首(PSP)。

計算機原理學習(5)-- x86-16 CPU和記憶體管理前言1. 8086 CPU2. 程式的記憶體結構3. MS-DOS記憶體結構4. MS-DOS 記憶體管理總結:參考:

而在DOS中,還有一個環境塊EVB用來記錄環境變量,可以把他看做是PSP的擴充。

4.3 記憶體管理

當程式被加載的時候,需要向實體記憶體申請空間并加載程式。那麼如何知道那些記憶體可以被使用呢? MS-DOS采用了記憶體控制塊(MCB)來辨別實體記憶體塊。DOS的記憶體塊以節為機關,一節等于16個位元組,每個記憶體塊的前面都有一個一節的MCB來描述這個記憶體塊。

計算機原理學習(5)-- x86-16 CPU和記憶體管理前言1. 8086 CPU2. 程式的記憶體結構3. MS-DOS記憶體結構4. MS-DOS 記憶體管理總結:參考:
  • 标志位: 一個位元組,Z辨別是最後一個分區,M辨別不是最後一個分區
  • 擁有者:當這個字段為0時,辨別是一個沒有使用記憶體塊,否則存放的是擁有此記憶體塊的程序的PSP段位址。
  • 記憶體塊大小: 以節為機關,不包括MCB塊。

是以通過一個MCB塊,可以使用MCB塊位址+記憶體塊大小+1 就能知道下一個MCB塊的位址。這樣整個記憶體就被串聯起來。下圖展示了MS-DOS 3.3啟動後記憶體的情況。

計算機原理學習(5)-- x86-16 CPU和記憶體管理前言1. 8086 CPU2. 程式的記憶體結構3. MS-DOS記憶體結構4. MS-DOS 記憶體管理總結:參考:

記憶體一共被分成了3部分:

  1. 第一部分中的塊主要是系統使用;
  2. 第二部分是COMMAND.CMD程式,一共使用了3個塊,其中程式資料和PSP還有環境各站一個塊,構成了COMMAND的程序實體。
  3. 最後一部分記憶體塊是給暫駐程式TPA(Transient Program Area),也就是我們程式使用的使用者記憶體空間。

4.4 使用者程式的裝載

當我們要把一個EXE程式裝載到記憶體時,裝載程式會檢查EXE的頭部資訊,檢查TAP的容量并确裝載的段的位址。而裝載時可以分為低位載入和高位載入。

計算機原理學習(5)-- x86-16 CPU和記憶體管理前言1. 8086 CPU2. 程式的記憶體結構3. MS-DOS記憶體結構4. MS-DOS 記憶體管理總結:參考:

而在載入一個COM檔案時,因為COM檔案沒有頭部資訊,并且COM檔案限制不能大于64K。

計算機原理學習(5)-- x86-16 CPU和記憶體管理前言1. 8086 CPU2. 程式的記憶體結構3. MS-DOS記憶體結構4. MS-DOS 記憶體管理總結:參考:

我們知道,在程式載入後,需要設定段寄存器的值,程式才能正确的被運作,下面列出了執行檔案被加載後段寄存器的情況

計算機原理學習(5)-- x86-16 CPU和記憶體管理前言1. 8086 CPU2. 程式的記憶體結構3. MS-DOS記憶體結構4. MS-DOS 記憶體管理總結:參考:

具體可以看:讀書筆記DOS下可執行檔案的加載

總結:

這一篇主要介紹了x86-16 處理器的記憶體結構和通路方式,後面還介紹了MS-DOS作業系統是如何管理記憶體的。 因為這一部分很久遠,并且我也沒怎麼接觸過,是以查閱了很多料,費了好多時間。但是可以找到的資料并不是很多。 但是我們的主要目的是了解早期的CPU和作業系統是如何管理記憶體的,程式是如何加載運作的。

後面我們會介紹x86-32 CPU的記憶體管理,有了這裡了解到的知識就能更好的了解為什麼現在的電腦是這樣運作的,為什麼使用保護模式,為什麼使用虛拟記憶體。

參考:

Intel 8086

8086處理器六種模式

《80x86彙編語言程式設計教程》

MS-DOS

DOS 記憶體的知識

純DOS下記憶體的管理—實模式下通路4GB記憶體

實模式、保護模式和虛拟模式

DOS下XMS,EMS,DPMI,DOS4GW研究 pdf

DOS下可執行檔案的加載

繼續閱讀