計算機系統基礎學習小筆記(0)

2021-10-02 08:47:34 字數 2702 閱讀 6009

深入理解計算機系統對我們有什麼好處呢?

不少人在最初學c語言的時候,對這個語言的很多內容感到迷惑不解,比如說c語言的靈魂:指標。當然,也有不少人在使用c/c++時,遇到過一些非常奇怪的執行崩潰問題,比如記憶體訪問越界,爆棧等。這個時候,如果我們沒有了解過任何有關計算機執行原理的內容,這些奇怪的問題就會像一團烏雲一樣,一直漂浮在我們腦海上空。

如果我們能夠更加深入理解計算機的結構,如果我們能夠更加清楚地知道乙個程式是如何在計算機上執行的,那麼在面對形形色色的問題時,我們就能夠更加容易地抓住問題的根源,從而解決問題。

這一系列的筆記是在看南大袁春風教授的計算機系統基礎網課時進行記錄的,以後要是忘了可以回來再看看(捂臉 )。

上面提到過,在寫c/c++程式的時候,經常會遇到非常奇怪的問題,下面還有一些非常有趣的例子,**於袁教授的課程:

這個情況就涉及到編譯器對程式的優化問題,第一段的**,除以-1被優化成取負指令neg,沒有發生除法溢位,而第二種寫法中,這樣的寫法讓編譯器沒有採取優化除以-1為取負的方式,而是老老實實使用除法指令,不出意外地出現了sigfpe

(變數如果加了voletile修飾,則會從記憶體中重新裝載內容,而不是直接從暫存器中拷貝內容)

這個例子在之後pwn的棧溢位中會體現出來,而且在不同位的機器下,情況也未必相同,這個例子需要我們了解棧幀中資料的布局。這裡d[1]和a[2]的空間有可能相連,然後在呼叫的時候,a[i]被改變為1073741824,而從**中不難看出a總共就2個空間,但是在呼叫了2,3,4的時候,會發現返回的d[0]值居然也發生了改變,這說明d[0]的位置就在a陣列後面不遠處,在呼叫了fun(4)的時候,發生了保護錯,這是程式的一種安全防護措施,防止人們通過漏洞利用對其後空間的關鍵資料(比如函式返回值)篡改,從而改變程式的執行走向。(而這種改變函式返回值的方法也是棧溢位漏洞利用的基本操作)

這個例子也非常有趣,從**表面來看,功能和時間空間複雜度完全一樣,但是真正執行的時候,兩者的速度卻差了20倍還多,要理解這個問題,就必須要了解陣列(尤其是高維陣列)是如何在記憶體中存放的。記憶體空間在計算機中永遠都是一維線性的,那麼高維陣列要想儲存,就必須「降維」,拉直成一維連續空間,不同的語言對陣列的儲存方式也不一樣,c語言採取了行優先,這就導致陣列的儲存在一維表示下是a[0][0],a[0][1],…,a[1][0],a[1][1],…,…,a[n][n],這一點會導致後續在訪問空間的時候,行優先的遍歷方式更加快速。那麼你也許會疑惑,就算列優先遍歷,咱訪問空間,還是得老老實實按照下標[i][j]計算得來,怎麼行優先就快了呢?這還需要我們了解cache機制訪問區域性性……總之,要慢慢來了解。

這個例子也是指令的差別,眾所周知,在printf中,資料如果和格式化字串不相匹配,有可能會輸出意料之外的內容,這個就是典型的情況,很顯然下面的double(a)是正常的,那麼double *p=(double*)&a;這樣的強制轉換,怎麼就輸出了0呢?這就是在編譯階段,前者使用的是fldl指令,而後者是fildl,fldl指令在這裡,就是把a所在空間的01序列,直接用浮點數的方式列印出來,而fildl指令是將01序列轉換為int型資料,再列印出來,指令上乙個字母的差距,功能相差了十萬八千里。

課程目標

馮諾依曼結構及其主要思想

結構介紹完之後,認識一下計算機最基本的部件

程式計數器是程式能順序執行的乙個關鍵部件,通過pc(program counter)和mar(memory address register),可以從儲存器中獲取程式段(包括指令和運算元)通過mdr(memory data register),放入ir(instruction register)和gprs,由控制器等核心部件,完成指令執行和運算。具體過程如下圖:

裡講的非常清楚(膜拜袁教授)

下次還會水一些計算機系統概述的內容(跑)

檢視之後內容

計算機系統基礎學習小筆記(1)

計算機系統基礎

includeint main return 0 如果將表示式換成 2147483647 1 2147483647 結果又會怎麼樣呢 編譯器如何處理字面量 高階語言中運算規則 高階語言與指令之間的對應 機器指令的執行過程 機器級資料的表示和運算 sum int a unsigned int len ...

計算機系統基礎筆記(1)

ia 32 英特爾32位架構。isa 指令集體系結構,簡稱體系結構 系統結構,cpu本身是指令集 結構 的乙個實現 例項。isa是軟體和硬體的介面。intel的isa是ia 32。本課程三個主題 表示 轉換 執行控制流 課程目的 以ia 32 linux c gcc為平台,描述程式執行的底層機制 系...

計算機系統基礎 學習開篇

title 計算機系統基礎 學習開篇 author qian jipeng tags 作為乙個非科班出身的半吊子程式設計師 程式設計師?在和計算機專業的同學交流的過程中,切實感受到知識面的匱乏,總體體現在對計算機系統的理解。確實,作為一名雙非院校信管專業的學生,本身起步就比別人慢了不少,若沒有紮實的...