你肯定連變數都不會

北風之神發表於2022-01-22

本文要討論的內容:關於 變數

警告:本文是給昨晚看2022-01-21看直播的朋友的總結文章,其它朋友直接關閉本頁面就可以了。

變數的功能:用來儲存資料,估計你只知道這麼多了

本文預警:你可能看不懂

你肯定連變數都不會
然後你會

你肯定連變數都不會

程式資料+程式指令

雖然昨晚拿的是c語言講解,golang也是一樣的。

package main

import "fmt"

var bf uint32=9502

func bfx() uint32{
        return bf
}
func main() {

   fmt.Println(bf)
   fmt.Printf("bf=%p\r\n",&bf)
   fmt.Printf("main=%p,bfx=%p,bfx=%T\n",main,bfx,bfx)

}

一個程式【已經編譯好的binary 檔案,在Linux系統中以ELF格式儲存,你可以手寫ELF檔案,就可以得到一個可執行檔案,不需要你寫什麼語言,我相信你寫個”hello,world”程式肯定會有用某一語言來實現,除了這個,你不會了】

一個程式【ELF檔案】上儲存的資料分為2類:程式指令+程式資料,它們在記憶體中全是二進位制儲存,我們檢視時,資料可以以16進位制,字元方式顯示。我們的ELF檔案將“資料”以許可權進行區分是指令還是資料。

  • 認識 程式 與 text 文字
    demo.go===>只是普通的text文字檔案,並不是嚴格意義上的程式
    demo ===>elf格式儲存的檔案【它是靜態連結檔案,虛擬地址已經分配完成】,是我們嚴格意義上的程式 ===>cpu它只會認識這檔案裡面儲存的指令+資料且在執行時,取出這檔案裡的資料

你肯定連變數都不會

  • 啟動執行檢視bf和main,bfx符號的地址
    符號Symbol 即bf,main,bfx【你們稱為變數,函式】

你肯定連變數都不會

你肯定連變數都不會

  • 符號bf詳解

你肯定連變數都不會

這裡的符號bf,捲毛程式設計師稱為變數,這個虛擬地址是0x540024,為了便於操作這記憶體上的資料

bf上面儲存的資料是:程式資料 上面儲存的資料是:程式資料

這個虛擬地址我們起了個別名為bf,當我們對bf操作時,就是對0x540024上的資料進行操作,這個bf它所在的虛擬地址範圍是【下圖是golang程式啟動後,程式的詳細布局圖】

你肯定連變數都不會

  • 符號main/bfx詳解

    詳細在上圖,main,bfx虛擬地址上儲存的是程式資料詳細在上圖,main,bfx虛擬地址上儲存的是程式資料

  • 底層大概情況
    [你要是有興趣,可以想想建立多程式時,內部是怎麼樣的]
    你肯定連變數都不會

當啟動之後,程式會和ELF檔案建立對映關係【作業系統內部會維護資料結構】ELF檔案中的程式指令+程式資料會區域性的裝載到記憶體電路中,CPU在乎的某個地址【實體地址】上的指令和資料,CPU取出指令後對資料進行處理,CPU要的是一串的程式指令和程式資料【其實全是二進位制】

虛擬地址0x540024上儲存的資料是1e25[即10進位制9502,如果程式之間轉換你都不會,說明你基礎有必要加強],它的地址範圍大小是4Byte,這4個大小的記憶體區域位於 程式的 資料區中【我們會根據某範圍虛擬記憶體地址上的許可權進行命名是資料區,還是程式碼區,還是堆區,棧區】人類為了便於操作這4位元組的記憶體空間,起了個助記符號為bf

你肯定連變數都不會

你肯定連變數都不會

bf上的程式資料和bfx,main符號上的程式指令會被編譯器處理儲存在/home/go/demo ELF檔案中,啟動執行後【之前我講過 程式的誕生和滅亡文章,不過你可能都不看】,會動態區域性載入到實體記憶體中(作業系統來控制),從而CPU取得bfx,main上的程式指令及bf等(還有其它特殊符號上的程式指令和程式資料)上的程式資料===》輸入到內部邏輯電路中驅動CPU工作。

你肯定連變數都不會

【由於二進位制檔案內容非常大,我這裡只是擷取部分,裡含有程式指令+程式資料全是二進位制數字訊號,我昨晚直播時講過徒手擼16進位制程式碼編寫程式(相當於後擼二進位制寫程式,不依賴任何語言)】

總結

本文的目的:是總結給昨晚看直播朋友的一個複習,不合適新手程式設計師,更不適合菜雞。內容的充分理解是基於我前面講過的內容及昨晚的直播的。如果你進來一臉蒙逼,然後焯關閉了頁面,我覺得正常。

本作品採用《CC 協議》,轉載必須註明作者和本文連結
北風之神,佬想交流技術和感情的可以Add my vx:Le-stdugy

相關文章