內容介紹 | |
開本:16開 紙張:膠版紙 包裝:平裝-膠訂 是否套裝:否 國際標準書號ISBN:9787302545491 作者:羅秋明 出版社:清華大學出版社 出版時間:2020年05月 
" 編輯推薦 觀察從C程序到可執行文件,以及在繫統中運行的全過程。 內容簡介 本書所討論的內容是“C語言程序設計”類課程的後續知識,涉及C程序在Linux環境下經過GCC編譯/鏈接生成可執行文件以及在繫統中運行的問題。本書能使讀者在面對C程序的工程實踐問題時,做到心中有數、處處不存疑。 全書共7章,第1章介紹環境準備,第2章介紹C程序的預處理、編譯、彙編和鏈接的全過程,並介紹了一點關於GCC編譯命令及編譯選項、GDB調試初步概念,第3章專注於編譯環節,即從C到彙編的轉換,第4章專注於鏈接過程,第5章介紹可執行文件在繫統中運行時,觀察進程與繫統的關繫、進程對庫的調用、程序異常行為等問題,第6、7章介紹一些性能剖析方法,包括GCC自帶工具、庫函數打樁方法、valgrind及perf工具的簡單使用等,第8章介紹一個綜合性的實例,即如何將HDFS文件繫統使用的gzip壓縮,從利用zlib庫在CPU上計算轉換成利用FPGA加速卡的過程。該實例涉及庫的使用和修改、makefile以及相應的C程序實現等多方面知識,讓讀者從一個工程需求的角度考察其方案與實現。每章後面都有一些練習題,其中有一個與zlib庫相關的任務貫穿了各章,讀者通過這個連貫的練習將各章知識融會貫通。 本書可以作為計算機及相關專業高年級本科生或研究生學習Linux環境下的C程序設計教學用書,對希望深入了解Linux內核的讀者和相關開發人員也非常有參考價值。 作者簡介 深圳大學計算機與軟件學院副教授,廣東省國產高性能計算繫統工程技術研究中心副主任、深圳市服務計算與應用重點實驗室常務副主任,長期從事高性能計算研究。華中科技大學計算機科學與技術博士學位。著《OpenMP編譯原理及實現技術》《Linux技術內幕》《操作繫統之編程觀察》譯《Intel Parallel Studio環境下的並行程序設計》。發表論文40多篇(含SCI/EI索引多篇),承擔和參與國家、省、市科研項目多項,2009-2010年參與基於龍芯3多核處理器的萬億次個人高性能計算機KD-60研制2011~2012年參與基於龍芯3號8核處理器的普及型高性能計算機KD-90研制,上述成果通過安徽省科技廳鋻定。2004-今,深圳大學計算機與軟件學院從事科研與教學工作,本科及研究生課程:《操作繫統》《現代操作繫統》《操作繫統課程設計》《計算機體繫結構》《Intel並行編程工具》等。 目錄 第1章實驗環境構建1 1.1安裝Linux1 1.1.1下載CentOS71 1.1.2CentOS7安裝2 1.2虛擬機安裝Linux9 1.2.1VirtualBox安裝9 1.2.2虛擬機配置13 1.2.3虛擬機安裝Linux20 1.3ssh遠程終端訪問20 1.3.1PuTTY客戶端21 1.3.2無密碼登錄24 1.3.3Xming圖形終端26 1.4初次接觸Linux28 第1章實驗環境構建1 1.1安裝Linux1 1.1.1下載CentOS71 1.1.2CentOS7安裝2 1.2虛擬機安裝Linux9 1.2.1VirtualBox安裝9 1.2.2虛擬機配置13 1.2.3虛擬機安裝Linux20 1.3ssh遠程終端訪問20 1.3.1PuTTY客戶端21 1.3.2無密碼登錄24 1.3.3Xming圖形終端26 1.4初次接觸Linux28 1.4.1簡單操作28 1.4.2運行HelloWorld程序33 1.5小結37
第2章程序編譯與運行38 2.1編譯的各階段39 2.1.1源代碼39 2.1.2預處理40 2.1.3編譯44 2.1.4彙編46 2.1.5鏈接48 2.1.6GCC編譯驅動49 2.2GCC基本用法51 2.2.1C語言標準53 2.2.2庫的使用54 2.2.3搜索路徑60 2.2.4編譯警告65 2.3GDB調試70 2.3.1代碼準備71 2.3.2運行代碼73 2.3.3查看變量和內存77 2.3.4圖形前端TUI83 2.4小結84 練習84 Linux GNU C程序觀察目錄 第3章數據、運算與控制86 3.1x8664 ISA86 3.1.1寄存器86 3.1.2內存空間與I/O空間91 3.2數據92 3.2.1數據大小、字節序92 3.2.2數組、結構體和聯合體95 3.2.3數據布局98 3.3運算102 3.3.1數據傳送102 3.3.2算術/邏輯運算104 3.3.3加載有效地址106 3.4控制107 3.4.1條件跳轉107 3.4.2函數調用127 3.5小結159 練習159
第4章鏈接與可執行文件161 4.1生成可執行文件161 4.1.1樣例代碼162 4.1.2進程影像164 4.1.3ELF文件與裝入168 4.2可重定位目標文件182 4.2.1目標文件的節(section)183 4.2.2符號及重定位187 4.2.3符號表196 4.3靜態鏈接200 4.3.1布局200 4.3.2符號解析205 4.3.3靜態重定位207 4.4動態鏈接214 4.4.1樣例代碼215 4.4.2動態鏈接庫216 4.4.3動態鏈接步驟230 4.5小結250 練習251
第5章鏈接腳本與makefile252 5.1二進制工具和鏈接腳本252 5.1.1binutils252 5.1.2鏈接器腳本254 5.2makefile267 5.2.1makefile基本格式267 5.2.2makefile規則270 5.2.3makefile變量274 5.2.4文件指示277 5.2.5函數279 5.2.6make281 5.3小結282 練習283
第6章程序運行284 6.1裝入與運行284 6.1.1ELF裝載器284 6.1.2內核代碼285 6.1.3進程與線程285 6.1.4工作環境287 6.2基本行為觀察289 6.2.1ptrace289 6.2.2strace295 6.2.3GDB斷點原理300 6.2.4ltrace301 6.3異常行為304 6.3.1非法操作304 6.3.2響應信號309 6.3.3core文件315 6.4小結325 練習326
第7章性能剖析327 7.1打樁方法327 7.1.1源代碼預處理時328 7.1.2靜態鏈接時330 7.1.3運行加載時332 7.2gprof334 7.2.1工作原理335 7.2.2gprof示例335 7.2.3性能數據解讀343 7.2.4圖形化顯示(gprof2dot.py graphviz)348 7.3gcov349 7.3.1基於函數分析的缺點349 7.3.2gcov逐行分析351 7.4其他分析工具355 7.4.1Valgrind355 7.4.2perf368 7.5小結375 練習376
第8章綜合實例: HDFS中實現zlib庫的旁路377 8.1項目需求377 8.2繫統分析378 8.2.1整體方案378 8.2.2Haddop的gzip JNI379 8.2.3zlib分析382 8.2.4測定z_stream成員大小385 8.3編碼實現387 8.3.1zlib日志387 8.3.2Log4c388 8.3.3使用libcprss.so庫396 8.4功能驗證398 8.4.1準備輸入文件399 8.4.2zlib原生庫的壓縮399 8.4.3libcprss.so庫的壓縮401 8.5小結401
附錄402 前言 我們在繫統軟件的教學和學生培養中,深感教材的缺乏。以往隻能在項目實踐中,讓學生通過網絡上的零散資料來完成相關知識的補充學習,然後纔能參與到項目中。我們認為,計算機作為實踐性很強的學科,如果課堂教學和實驗不能緊密聯繫具體的繫統,無法面對和解決工程問題,就不能算成功。Linux繫統作為一個開源的資源,為我們提供了良好的機會,可以將底層繫統軟件的相關技術細節完全呈現出來。為此,我們的步計劃是提供基本的一條學習通路,將應用程序和繫統打通,形成繫統軟件技術學習叢書,其進階學習流程如下。 學生在完成C語言程序設計、數據結構和算法課程的學習之後,可以通過本書補充C程序與繫統的知識。C語言程序設計作為“上半部”知識,而本書作為“下半部”知識,從而形成C程序自身完整的知識結構。 我們在繫統軟件的教學和學生培養中,深感教材的缺乏。以往隻能在項目實踐中,讓學生通過網絡上的零散資料來完成相關知識的補充學習,然後纔能參與到項目中。我們認為,計算機作為實踐性很強的學科,如果課堂教學和實驗不能緊密聯繫具體的繫統,無法面對和解決工程問題,就不能算成功。Linux繫統作為一個開源的資源,為我們提供了良好的機會,可以將底層繫統軟件的相關技術細節完全呈現出來。為此,我們的步計劃是提供基本的一條學習通路,將應用程序和繫統打通,形成繫統軟件技術學習叢書,其進階學習流程如下。 學生在完成C語言程序設計、數據結構和算法課程的學習之後,可以通過本書補充C程序與繫統的知識。C語言程序設計作為“上半部”知識,而本書作為“下半部”知識,從而形成C程序自身完整的知識結構。 然後將視角從一個程序擴展到整個繫統中,需要面對多個進程並發的操作繫統環境。此時僅靠本科操作繫統原理性課程的學習仍是不夠充分的。一方面,可以通過《操作繫統之編程觀察》(清華大學出版社,書號9787302489733)介紹的用proc文件繫統提供的內核運行數據,直觀地觀察Linux操作繫統的進程調度與均衡、進程間通信、內存管理和文件繫統等行為,加深理論概念的認識;另一方面從《操作繫統原型: xv6分析與實驗》(即將出版)對操作繫統實現中的關鍵機制進行探索,掌握其編碼實現的關鍵細節,弄懂操作繫統編碼實現的核心知識。 後,在有需要的時候學習《Linux技術內幕》(清華大學出版社,書號9787302451006)。通過對真實的、完善的(相對於xv6的原型代碼而言)、穩定的Linux內核代碼進行學習,掌握Linux內核實現細節並可以嘗試根據工程需要對Linux繫統進行修改增強。 上述4個相關聯、遞進的知識板塊及學習安排,是我們在PHPC(個人高性能計算機)繫統研制的學生培養過程中積累下來的,希望能對有志於投身繫統軟件開發的讀者有所幫助。
編者 2018年4月Linux GNU C程序觀察
我們在當前的C語言程序設計教學工作中,對C語言的語法和編程技術雖然都已經討論得非常充分,但是作為計算機的“繫統觀”的建立,隻能說僅完成了一半的任務。從C語言如何轉換到彙編語言進而生成機器碼形式的可執行文件,以及可執行文件如何裝入內存並在操作繫統環境中運行的細節,對大多數完成本科課程學習的學生而言,仍未達到解惑的程度。學生也許可以通過在網絡上找到的業界大牛們提供的零散材料,自行建立起相應的認識,但這畢竟是一個耗時和低效的學習過程。 本書希望將上述知識,組織成一個相對完整、便於學習與實踐的材料,在計算機繫統課程學習中(例如深圳大學的“計算機繫統2”)作為實驗補充材料,讓學生全面接觸從C語言轉換到彙編、進而生成機器碼形式的可執行文件直至運行的全過程。在這種學習安排下,即使學生未修學編譯原理課程,也能大致理解編譯過程所使用的代碼轉換模板、鏈接中的符號解析和重定位等知識。除此之外,本書也介紹了程序在繫統中運行的各種行為、代碼調試和性能剖析工具的使用,對程序生成過程和運行過程都進行細致的觀察——類似於電路與繫統課程使用的萬用表、示波器和頻譜儀。有了這些“測量工具”後,C語言的實驗教學纔能從當前的“猶抱琵琶半遮面”的境況,變得相對完整起來。
羅秋明 於深大荔園 2020.1
本書獲得深圳市科創委基礎研究項目JCYJ20170302153920897雲環境中的異構存儲資源分配與性能優化研究、JSGG20170822110100205基於開放技術的可信多路高端計算繫統研發的資助。感謝深圳大學計算機與軟件學院“計算機繫統2”課程組的老師,大家一起完成了廣東省教育廳應用型人纔培養課程建設項目“計算機繫統繫列核心課程”的實驗內容和教學材料的準備工作,其中的部分工作正是本書的內容。特別感謝劉剛老師在相關實驗的設計開發中給予的幫助。 還要感謝2018級的研究生杜海鑫、張靖、吳坤鑫和沙士豪三位同學,他們承擔了部分書稿的整理、校對和實驗代碼的設計及檢驗等工作。其中,杜海鑫同學完成了第8章zlib庫的代碼開發和部分撰寫工作,並對第4章、第5章和第8章內容進行整理和校對。吳坤鑫同學提供了7.2節、7.3節和7.4節的材料。張靖同學負責第1章、第2章和第3章材料的校對,沙士豪同學負責第6章和第7章材料的校對。 在上述老師和同學的大力支持下,本書終於完稿並與讀者見面。再次對他們表示衷心的感謝! | | |