《深刻理解計算機系統》

1 計算機系統漫遊

  • 計算機系統:硬件 + 軟件ubuntu

  • 信息:位 + 上下文(用來區分不一樣的數據對象)
    • 上下文:用來區分不一樣的數據對象,如:在不一樣上下文中一樣的字節序列能夠表示整數、字符串或機器指令等。

程序翻譯的各個階段(編譯系統)

  • 預處理階段:預處理器(cpp),根據#開頭的命令修改原始 C 程序,如:將incude文件的內容插入到程序文本中。
  • 編譯階段:編譯器(ccl),編譯爲彙編語言。
  • 彙編階段:彙編器(as),翻譯成機器語言,並打包成可重定位的目標程序的格式。
  • 鏈接階段:將用到的庫中的函數加入到程序。

系統硬件組成

system-chart

存儲

  • 高速緩存:處理器處理的快而數據傳輸慢,數據傳輸成爲瓶頸,因此產生了高速緩存技術。。

storage

操做系統

  • 進程(Process):給程序獨立使用 CPU、主存、I/O 設備的假象。任什麼時候刻操做系統只有一個進程在運行,進程會交錯執行(併發運行)。
  • 線程(Thread):一個進程能夠包含多個線程。
  • 虛擬處理器:爲程序提供獨立使用主存的假象。
  • 文件:只不過是字節序列,磁盤、鍵盤、顯示器。甚至網絡均可看作文件,系統的輸入輸出均可以看作系統函數讀寫文件來實現的。

2 信息的表示和處理

2.1 信息存儲

2.1.4 尋址和字節順序

對於跨越多字節的程序對象,咱們須要確認:緩存

  1. 對象的地址,幾乎全部機器上對象地址都是字節序列中的最小地址
  2. 存儲器中如何對這些字節排序,有兩種規則:小端法和大端法

例如,變量x類型爲int,值爲0x01234567,位於地址0x100處,大端法和小端法存儲爲:sass

大端法:網絡

地址 0x100 0x101 0x102 0x103
數據 01 23 45 67

小端法:併發

地址 0x100 0x101 0x102 0x103
數據 67 45 23 01

2.1.7 布爾代數和環

整數運算:<Z , +, x, -, 0 ,1>(0, 1 爲加法和乘法的單位元)函數

布爾代數:<{0, 1}, |, &, ~, 0, 1>編碼

上面兩種結構有不少類似性,但注意~ a 不是 a 在 | 運算下的逆元(a | ~a != 0, a + -a == 0操作系統

PS:線程

  • 布爾代數知足分配性、相補性、冪等性、吸取性、DeMorgan 定律
  • 布爾與和異或(EXCLUSIVE-OR)至關於模 2 的乘法和加法

2.4 浮點

浮點數及其運算的標準:IEEE(讀做 I-Triple-E) 標準 754翻譯

符號 指數 有效數
單精度(32bit) 1 8 23
雙精度(64bit) 1 11 52

指數採用二進制移碼(Exponent bias)表示。

  • 規格化值:指數域不全爲 0 且不全 1
  • 非規格化值:指數域全爲 0,此時指數值爲1 - Bias(Bias 是指數域對應了二進制原碼值)
  • 特殊值:指數域全爲 1

3 程序的機器表示

3.4 訪問信息

3.2 程序編碼

// code.c
int accum = 0;
int sum(int x,int y){
  int t = x + y;
  accum += t;
  return t;
}

生成彙編文件:$ gcc -O2 -S code.c

編譯:$ gcc -O2 -c code.c

反編譯:$ objdump -d code.o,結果入下

ubuntu@DESKTOP-5JD9B9T:~$ objdump -d code.o

code.o:     文件格式 elf64-x86-64


Disassembly of section .text:

0000000000000000 <sum>:
   0:   8d 04 37                lea    (%rdi,%rsi,1),%eax
   3:   01 05 00 00 00 00       add    %eax,0x0(%rip)        # 9 <sum+0x9>
   9:   c3                      retq

3.4.1 操做指示符

尋址的通用形式Imm(Eb, Ei, s),其地址是Memory[Immediate + Register[Eb] + Register[Ei] * scale](當即數 + 基址 + 變址)

3.4.2 數據傳送指令

mov S, D:S ---> D

3.5 算數和邏輯操做

3.5.1 加載有效地址

加載有效地址(Load Effective Address)指令 leal 其實是 movl 指令的變形。

這條指令將第一個操做數計算出的地址寫入第二個操做數。

例如:leal 7(%edx, %edx, 4), %eax將設置%eax的值爲7 + %edx + 4 * %edx。(%edx爲 3,則%eax設置爲 22)

3.5.2 一元和二元操做

  • 一元操做:只有一個操做數,既是源又是目的。

  • 二元操做:第二個操做數既是源又是目的。

3.6 控制

3.6.3 跳轉指令和它們的編碼

跳轉(jump)指令會致使執行切換到程序中的一個全新的位置。這些跳轉的目的地一般用一個標號(label)指明。

執行 PC 相關尋址時,程序計數器的值是跳轉指令後面的那條指令的值,而不是跳轉指令自己的地址。處理器會將更新程序計數器做爲執行一條指令的第一步。例如:

地址
指令1  0x08  
指令2  0x0a
...
指令n  0x1b

若是指令1的操做是跳轉到指令n,則偏移爲0x11,由於0x0a + 0x11 = 0x1b

3.6.4 翻譯條件分支語句

相關文章
相關標籤/搜索