程式設計師的自我修養6

2021-08-08 06:19:19 字數 1346 閱讀 3631

並不是建立空間而是建立對映函式所需要的相應的資料結構,在i386的linux下,建立虛擬位址空間實際上只是分配乙個頁目錄(page-directory),甚至不設定頁對映關係,這些對映等到後面程式發生頁錯誤時再進行設定。

當程式執行發生頁錯誤時,作業系統將從物理記憶體中分配乙個物理頁,然後將該「缺頁」從磁碟中讀取到記憶體中,再設定缺頁的虛擬頁和物理頁的對映關係,這樣程式才得以正常執行

這種對映關係只是儲存在作業系統內部的乙個資料結構,linux中將程序虛擬空間中的乙個段叫做虛擬記憶體區域(vma,virtual memory),在windows中將這個叫虛擬段(virtual section),其實是同一概念

「segment」的概念實際上是從裝載的角度重新劃分了elf的各個段

在將目標檔案鏈結成可執行檔案的時候,鏈結器會盡量把相同許可權屬性的段分配在同一空間

在記憶體中,共享乙個目標檔案模組的好處是不僅僅是節省記憶體,它還可以減少物理頁面的換入換出,也可以增加cpu快取的命中率,因為不同程序間的資料和指令訪問都集中在了同乙個共享模組上

乙個程式在不同的平台上執行時,可以動態地由作業系統提供動態鏈結庫,這些動態鏈結庫相當於在程式和作業系統之間增加了乙個中間層,從而消除了程式對不同平台之間的依賴的差異性

在使用動態鏈結庫的情況下,程式本身被分為了程式主要模組,(program)和動態鏈結庫(lib.so),但實際上他們都可以是整個程式的乙個模組

共享物件的最終裝載位址在編譯時是不確定的

位址無關**(pil,position-independent code)技術:將指令中要被修改的部分分離出來,跟資料部分放在一起,這樣指令部分就可以保持不變,而資料部分可以在每個程序中擁有乙個副本

其他模組的全域性變數的位址是跟模組裝載的位址有關的,elf的做法是在資料段裡面建立乙個指向這些變數的指標陣列,也被稱為全域性偏移表(global offset table),當**需要引用該全域性變數時,可以通過got中相對應的項間接引用

位址無關**技術除了用在共享物件技術上面,它也可以用於可執行檔案,乙個以位址無關方式編譯的可執行檔案被稱作位址無關可執行檔案(pie,position-independent executable)

動態鏈結器本身不依賴於其他任何共享物件;其次是動態鏈結器本身所需要的全域性和靜態變數的重定位工作由它本身完成。對於第二個條件,這種具有一定限制條件的啟動**往往被稱為自舉(bootstrap)

完成基本自舉後,動態鏈結器將可執行檔案和鏈結器本身的符號表都合併到乙個符號表當中,我們可以稱他為全域性符號表(global symbol table)當乙個新的共享物件被裝載進來的時候,他的符號表會被合併到全域性符號表中

乙個共享物件裡面的全域性符號被另乙個共享物件的同名全域性符號覆蓋的現象又被稱為共享物件全域性符號接入(global symbol interpose)

程式設計師的自我修養

一忌 輕易言敗,沒有自信 沒有永不放棄精神的程式設計師,只是乙個有程式設計師名號的假程式設計師。乙個真正的程式設計師,知道在程式設計的過程中,可能會遇到不計其數的困難和問題,可能有極多的挫折和失敗,而成功只有一次。就為解決乙個問題,我們可能連續十幾甚至幾十小時的坐在計算機前不停的工作。乙個問題解決了...

程式設計師的自我修養

一忌 輕易言敗,沒有自信 沒有永不放棄精神的程式設計師,只是乙個有程式設計師名號的假程式設計師。乙個真正的程式設計師,知道在程式設計的過程中,可能會遇到不計其數的困難和問題,可能有極多的挫折和失敗,而成功只有一次。就為解決乙個問題,我們可能連續十幾甚至幾十小時的坐在計算機前不停的工作。乙個問題解決了...

程式設計師的自我修養

對合作夥伴的尊重與包容 每個人的水平必然是不相同,大家各有擅長,並且在不斷進步中。所以遇到同事或者合作的友商犯了比較低階 對你來說可能是 的錯誤是很正常的事情,我們更多的是應該給與尊重與包容,而不是嘲笑或者消極對待。在不斷的鼓勵同事和合作夥伴之後,能感受到大家對我的信賴,特別是和友商的合作變得非常的...