大家好,我是Cone,一名畢業于雙非本科的抖音全堆疊程式猿,
今天來和大家分享《程式員的自我修養————鏈接、裝載與庫》這本書的全書導讀經驗,它在去年我拿下微信、抖音、百度等大廠sp及以上offer有非常大的幫助,分享與你,希望能夠對你帶來啟發,
前言
最近在作業之余,重新認真閱讀學生時代讀過的書籍,閱讀到了這本對我秋招幫助很大的書,重新思考了一些原來讀這本書時的問題,比如:windows系統相關知識,我到底要不要精讀?一些晦澀難懂的知識該怎么辦?等等,所以打算梳理一篇該書的導讀內容,希望對你能夠有所幫助,
PS:如果你還沒有讀過本書,建議你去認真閱讀本書,你肯定能識訓不小,
閱讀前所需要具備的基礎知識
下面為你整理了,你閱讀本書前,最好所具備的前言知識,這樣能夠在你閱讀的時候減少很多閱讀障礙,如果你缺少一些前言知識,也沒關系,努努力,啃一啃,遇到問題時,去努力尋找相關知識弄懂解決,肯定會有不小識訓,
?C/C++編程語言基礎?匯編語言基礎?作業系統基礎?計算機組成原理基礎
全書概覽

如上圖所示,全書分為四個部分,
第一部分:溫故而知新
通過hello、world 第一個C程式引出相關一些列問題,拋出本書的目的,并回顧了作業系統相關的知識,包括硬體、執行緒、行程、記憶體等基礎知識,
第二部分:靜態鏈接
全面講解了編譯的基本概念和程序以及聯結器歷史,然后通過講解目標檔案為引出靜態鏈接做鋪墊,最后詳細介紹了靜態鏈接知識,
第三部分:裝載與動態鏈接
首先講解了可執行檔案的轉載講解出記憶體中的行程虛擬空間布局、載入方式以及加載程序,之后詳細介紹了動態鏈接相關知識,后面追著介紹了Liunx下的動態庫特性,
第四部分:庫與運行庫
這一部分主要介紹了運行時記憶體利用相關知識、以及運行庫基本知識和實作,還講解了C++的全域析構與構造實作,最后還講解了系統呼叫及其原理,
章節概覽
下面是一些章節的概覽,有些知識Windows的知識也不需要去完全掌握,畢竟我們可能很少接觸windows開發吧,
第一章:溫故而知新
本章也就是全書概覽上的第一部分,主要介紹一些背景知識和閱讀本書的一點鋪墊知識,比如:CPU、記憶體等硬體,作業系統行程、執行緒相關知識,
第二章:編譯和鏈接
本章主要介紹基本的編譯概念以及編譯幾大程序還有聯結器相關知識,
第三章:目標檔案
本章介紹了Windows和Liunx系統的目標檔案,回答了目標檔案是什么,目標檔案有哪些型別,目標檔案如存盤等問題,
第四章:靜態鏈接
本章主要講解靜態鏈接基礎知識和靜態鏈接基本步驟和程序,還講解舉例了最“小”鏈接,
第五章:Windows PE/COFF
本章介紹Windows平臺的目標檔案和可執行檔案,
第六章:可執行檔案的轉載與行程
本章通過介紹行程的基本概念,地址空間布局等知識引申出了可執行檔案的加載程序,
第七章:動態鏈接
本章主要講解Liunx系統下的.so動態庫的動態鏈接程序,
第八章:Liunx動態庫
本章主要詳解介紹動態庫的相關知識,包括動態庫的分布和組織等,
第九章:Windows下的動態鏈接
本章主要講Windows下面的動態鏈接機制 第十章:記憶體 這章主要講運行時記憶體相關知識,包括堆與堆疊,堆的分配演算法,函式呼叫堆疊等,
第十一章:運行庫
本章主要介紹運行庫的概念、c/c++運行庫、Glibc和MSVC CRT相關知識,
第十二章:系統呼叫與API
本章主要講系統呼叫知識,包括系統呼叫流程以及相關API介紹,
第十三張:運行庫實作
本章主要實作了一個支持堆、基本檔案操作等功能的Mini CRT.
導讀建議
通常閱讀一本書,我們會有一個問題:我需要從書中得到一些什么?可能是已有知識的總結回顧、也可能是新知識的獲取,不管怎么樣,我們會有想要得到的識訓,那么閱讀《程式員的自我修養》這本書,你能得到什么呢?
?以CPU會為核心回顧計算機體系知識?了解代碼編譯的基本概念和步驟?Liunx系統下目標檔案格式以及如何存盤?靜態鏈接基本概念,為什么要有靜態鏈接?目標檔案如何被靜態鏈接到一起行程可執行檔案?靜態鏈接時的空間地址分配、符號決議和重定位如何進行?可執行檔案如何被系統加載,與行程的地址空間如何映射?動態鏈接基本概念以及鏈接時相關問題?運行時的記憶體分配以及入口程式初始化 上面是一些基本能得到的識訓,我們從中可以抽象為三個重要問題:?原始碼是如何被編譯成可執行程式的??可執行程式是如何被加載到記憶體的??記憶體中的行程空間布局是怎么樣的?
帶著這個三個問題,去閱讀本書,效果會更好,
首先我們從書本脈絡出發,嘗試回答第一個問題
原始碼是如何被編譯成可執行程式的?
這個涉及相關編譯問題,從上面的章節概覽可以知道,在第二章:編譯和鏈接就能找到相關答案,所以你需要認真閱讀第二章全部內容,不過這里只稍微展開講了編譯的大致程序,并沒有講解可執行檔案如何生成的,生成可執行檔案還需要鏈接,所以順著下去需要搞懂鏈接,
那么在學習鏈接之前,書本第三章:目標檔案里面有什么,就講解了需要鏈接的輸入產物長什么樣子,以及鏈接前的基本知識:鏈接的介面(基本單位)等,所以第三章是一個基礎知識章節,主要讓你掌握目標檔案內容和格式,是為后面章節做鋪墊的,你能大致清楚目標檔案的基本知識,第三章也是需要全部認真閱讀的,
接下來就是鏈接了,第四章:靜態鏈接,本章首先根據目標檔案,講解了兩種鏈接方法,之后講解了鏈接的兩個步驟,然后引申出C++的相關問題,其次講解了靜態庫的鏈接,最后有一個小實驗,讓你動手體驗,
到這里你很好的回答上面的這個問題了,你能知道靜態鏈接是在做什么,它生成了什么,為什么需要它了, 接下來我們繼續下一個問題,
可執行程式是如何被加載到記憶體的?
回答完前面那個問題后,你了解了可執行程式的檔案內容以及格式,前文開篇提到需要由作業系統的基礎知識,作業系統知識中程式運行的基本單位是行程,可執行程式加載到記憶體肯定首先需要了解行程的地址空間,其次需要知道是以什么方式加載到記憶體的,
在加載到記憶體之前需要進行行程的建立等操作,所以在本書第六章主要為你解答這些問題, 認真理解靜態鏈接之后,我們會有一個疑問,那些在靜態鏈接沒有被重定位的符號怎么辦?符號表里都是存在的偏移地址,那真實地址如何確定,這就涉及到了動態鏈接了,在靜態鏈接沒有完成的工程,由程式加載時進行動態鏈接完成,本書在第七章詳細介紹了動態鏈接的相關知識,包括步驟實作、懶加載等等,
在了解完動態鏈接之后,可能還想要動態鏈接時鏈接的動態庫特性,所以在第八章介紹了Liunx下動態庫相關的知識, 讀完前面八章內容,你已經非常熟悉編譯鏈接加載相關知識了,
那么可執行檔案通過動態鏈接以及加載,完了之后是運行,運行離不開空間布局,所以接下來一個問題就是第三個問題了,
記憶體中的行程空間布局是怎么樣的?
行程的空間布局直接影響會影響程式的運行,運行時也需要用到一些堆、堆疊等空間,所以在本書第十章講解了記憶體相關知識,包括行程的空間布局、堆疊與呼叫慣例、堆與記憶體管理等知識,讀完本章,你能夠大致明白,程式運行時的一些地址是怎么回事,
程式運行你肯定好奇入口,也就是計算機是如何進入執行程式的,那么本書第十章:運行庫,第一節為你講解了相關知識, 讀到這里你對于計算機的編譯、鏈接、加載、運行有了很深刻的認識,從全域層面進行了系統性的學習,
回答完三個問題,相信正在閱讀的你已經心中有底了,
帶著問題閱讀書籍往往是有非常棒的效果,
導讀總結
p1-109,建議精讀,讀懂讀透,讀完就能系統的計算機編譯鏈接相關知識,P127,使用ld鏈接腳本,本節需要自己動手嘗試,計算機是一門工科,多動手體會,
P149-175,講解可執行檔案的轉載和行程,需要精讀,
P179-P219,講解動態鏈接,這一部分內容稍有難度,需要花些精力認真讀,P229-P248 講解動態庫,如果動態鏈接有些吃力,這一章可跳過也不影響,P283-334,這一部分就需要回到上面的第三個問題了,也需要認真弄懂,
整體下來前面175頁的知識讀下來會比較輕松,同時也能掌握很多的知識,從動態鏈接開始難度有會有提升了,但是只有理解了動態鏈接,你才能理解程式編譯鏈接時給動態鏈接留下介面是為什么,當然你也可以大致把動態庫理解為一堆功能代碼的共享,導讀總結就到這里了,希望你讀完有所識訓,
閱讀到這里,趕緊行動起來吧~
這里為你精心準備了電子書:
鏈接:https://pan.baidu.com/s/1zmegxUifY4x9aN7H17ui3Q 密碼:o589
總結
正如這本書的取名一樣,程式員也需要有自身的技術修養,在自我修養這條路上,筆者和大家一起成長,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/332388.html
標籤:其他
上一篇:利用TOPSIS綜合評價打分模型實作cloudsim中虛擬機分配策略(不可遷移)VmAllocationPolicy
