參考材料:深入理解電腦系統(第3章)
1. (3.2.1)電腦machine-level programming重要的兩類抽象:
一個重要抽象,是將format and behavior of a machine-level program抽象形成instruction set architecture,即ISA(指令集體繫結構)
對於ISA,要有以下基本觀念:IA32的ISA和x86-64的ISA,以及其他大多數ISA,在抽象時都將指令按順序執行抽象。但是處理器的硬體可以並發地執行許多指令,並且採用了一些safeguards來確保並存執行之後的結果和一條一條順序執行的結果一樣。
第二個重要抽象,是將整個電腦中的memory system用虛擬位址來抽象,使得memory system就好像一個“連續”的位元組塊。要有的基本觀念是,這個抽象對應的實際電腦basis是一些分離的hardware memories,和operating system software(?)
2.(3.2.1)
作業系統負責管理虛擬位址空間,將虛擬位址翻譯成實際processor memory中的物理地址
3.(3.2.2)
當一個源檔案產生了'.o'的目標二進位檔案後,無法直接查看。
但是還是有個查看目標代碼檔案內容的方法,就是對'.o'目標檔案使用反組譯碼器(disassembler)。它的輸出還是二進位檔案,但是,反組譯碼器將這些二進位按照指令進行了分段。讓我們知道哪一段是一個指令(格式上與彙編器產生的彙編檔案一樣,分行的)
關於ISA的指令(以IA32為例),我們要有以下基本觀念:都是和編碼中的基本思想相關
一是,ISA中每條指令佔用位元組數不等,常用的指令所需的位元組數少,不太常用的指令的位元組數多--》這樣的話,相對於每條指令佔用等長位元組數的ISA,這種佔用位元組數不等的ISA為程式產生的總空間要更少。
二是,ISA中的指令在設計時,達到了一個效果,對於一個二進位指令串,從某個位元組開始,解碼的結果是唯一的,這是達到了編碼理論中“唯一可譯性”的要求。(如何為指令設計編碼可以達到“唯一可譯性”呢?可以看薑丹老師的《資訊理論》)。
(我想。大概正是反組譯碼器正是利用了唯一可譯性,從而將一串指令位元組序列分割開來的。)