今天主要看了《深入理解計算機系統》中的「程式的機器級表示」的後面幾個章節,主要看了過程呼叫的概念及其實現。
過程呼叫
過程有很多名字,例如函式、方法、例程等等,實現原理都是類似的。 ----------- 就是棧幀。
棧幀通過前兩天看第一章裡面說的,程序是建立在指令集架構和虛擬記憶體的基礎上的,由於我現在對於程序還沒有較為具體準確的認知,我暫且認為程序和過程是一樣的。
那麼過程就是建立在指令集架構和虛擬記憶體的基礎上的。棧就是虛擬的記憶體。
棧幀是如何實現過程呼叫的呢?
過程呼叫主要需要完成3件事情:
控制轉移。 – 講的是call指令和ret指令做了什麼。前者是將下一條指令位址入棧,然後進入過程**(也就是將call指定的位址放入pc中),後者是將剛才入棧的位址pop到pc中。
引數和返回值傳遞。引數傳遞是用特定的暫存器的,怎麼個特定?就是通過引數的位置+引數大小(型別)來規定使用的暫存器,也就是說編譯器會遵循某一套規則。返回值的話,也一樣,就是通過特定的乙個暫存器,%rax。
區域性變數分配。這個和第二點似乎有一些重合,主要講述在連續發生若干個過程呼叫的時候,如何做到暫存器之間互不干擾。因為從引數和返回值的傳遞中我們可以看到,不同的過程是共享一套暫存器的,子過程對於暫存器的操作,對於主過程是直接可見的,例如%rax就是典型。但是暫存器的數量是有限的,如何做到互不干擾呢?如何做到邏輯上我們常說的:不同的函式有自己的空間?x86-64對這個問題的解決辦法是:棧+區分不同的暫存器。因為我們一旦將乙個暫存器作為目標數,那麼就一定會對其造成覆蓋,那麼原來的值需要儲存嗎?如何儲存?
根據暫存器的不同,劃分為兩種方案:
- 由呼叫者儲存,也就是說在call之前,將我關心的暫存器入棧儲存(或者也可以不儲存,總之這些暫存器的修改由呼叫者自己負責),這樣的話子過程可以直接覆蓋,子過程也知道,這個暫存器的儲存不歸我管。
- 由被呼叫者儲存,也就是說我在使用乙個暫存器之前,必須先將其入棧儲存,用完之後在將其恢復,也就是說子過程需要保證這些暫存器的恢復。
- 總之,就是某些暫存器是需要子過程恢復的,而另一些則大家隨便用,誰用誰負責,自己對自己負責。
以上,主要就學了這麼點,書上還有很多細節。已經想不起來了。明天加油。
明天需要做兩道演算法題。
晚上看完《深入理解計算機系統》第三章的最後兩節,陣列和結構體。任務很重,盡量完成,至少看完乙個陣列吧。
寫了快50分鐘,趕緊洗漱睡覺!
2020校招備戰日記4 25
今天上午寫了一篇部落格 從下午開始就基本沒做啥了。週六因為家裡的事情很難學習,就當休息了吧。絕不動搖。我本就一無所有,可能也就只有堅持不懈才能讓我的賭注變大一點,否則我連賭本都沒有。服務端研發肯定是有市場的,現在的大學生還在不斷學習,不斷有新鮮力量加入呢,20年後看今天,可能和今天看20年前一樣吧,...
2020 春招 校招 c 筆試總結
1.浩鯨雲 筆試35個選擇題加3個程式設計題,答的慘不忍睹,回憶一下還記得的然後做個總結 1.1選擇題 1.1.1c 是絕對型別安全的嗎 型別安全很大程度上可以等價於記憶體安全,型別安全的 不會試圖訪問自己沒被授權的記憶體區域。型別安全 常被用來形容程式語言,其根據在於該門程式語言是否提供保障型別安...
2020校招面試之電信
電信沒有筆試,直接面試,而且以宣講會現場收的簡歷為主,基本上只網申沒現場交收簡歷的好像都沒收到面試通知。有三面 一面有三輪 2輪技術面,1輪綜合面 二面是hr面,三面是簽約面 一面 一面的2輪技術面感覺問的問題都差不多,兩個面試官之間沒有互通性 綜合面就自我介紹,問問為什麼選擇這個崗位,願不願意調劑...