深刻理解計算機操做系統:第2章 信息的表示和處理(學習筆記)

現代計算機存儲和處理的信息都是用二進制表示的,即0和1。ios

用多個二進制比特位的不一樣組合和不一樣解釋可以表示數量有限的元素,好比用32位比特的組合則有2^32種可能,所以它能表示從0開始到4294967295 (2^32個)。程序員

須要程序員關注的是三種二進制解釋:1. 無符號二進制的組合解釋;2. 有符號二進制的組合解釋;3. 浮點數二進制的組合解釋。編程

這些不一樣解釋組合可以進行的操做也不同,好比有符號和浮點數雖然邏輯上都能加減乘除,但CPU的具體硬件運算實現細節實現確定不一樣。編程語言

 

因爲是用多個二進制比特位的來進行組合的,所以其可以表示的數量是有限的。超出表示範圍以後是什麼行爲?這種超出範圍的描述稱爲:溢出。在C++中,無符號類型溢出表現是初始值對全部可能的值取模後的餘數;有符號行爲則不肯定。spa

 

對於整數來講,其表示是精確的,假設1用0000 0000 0000 0000 0000 0000 0000 0001表示,那麼0000 0000 0000 0000 0000 0000 0000 0001就是1,不會是2。操作系統

對於浮點數來講,其表示是近似值,由於某段範圍內小數的個數是無窮的,沒法徹底表示,好比1和2之間的小數個數就不能徹底表示出來。指針

 

操做系統爲每一個進程抽象了虛擬內存的概念,使得每一個程序認爲它得到到的內存是連續的。事實上,內存空間是不連續的。此外,操做系統還對內存空間進行劃分,有些專門存儲代碼指令,有些專門存儲數據信息,根據這些不一樣劃分,操做系統能夠附加一些措施,從而阻止緩衝區溢出攻擊。例如,咱們能夠在C/C++中經過自行分配一段堆內存,而後在該堆內存上構建二進制指令,再嵌入彙編,使用jmp指令跳轉到堆內存上執行構建的二進制指令。Linux和Windows經過使用一種叫作dep的技術來檢查當前內存是用於存儲數據的,不該該當作指令執行,從而阻止惡意代碼。code

 

在C/C++等編程語言中,雖然存取不一樣類型的變量都是經過訪問變量名來實現的,但其底層實現並不相同,以下:blog

#include <iostream>

int main()
{
    int i;
    i = 5;
    short s;
    s = 6;

    return 0;
}

經過反彙編,查看二進制機器碼,能夠發現不一樣類型的變量的讀寫用的是不一樣指令,對於int類型的局部變量的寫入,只用了一條指令,而short類型的局部變量的寫入,用了兩條指令,先是寫入到eax寄存器,而後再從eax的低位寄存器ax中寫入到變量中。進程

 

從這裏也能夠聯想到C/C++中的指針,爲何會有不一樣類型的指針,這是由於語言層面的類型指針在編譯以後所生成二進制機器碼不一樣,固然讀寫的字節數也不同。

相關文章
相關標籤/搜索