程序員的自我修養(yǎng)

出版時(shí)間:2009-4  出版社:電子工業(yè)出版社  作者:俞甲子,石凡,潘愛民  頁數(shù):459  
Tag標(biāo)簽:無  

前言

作者序1兩年前,甲子跟我提起,他在考慮寫一本講述計(jì)算機(jī)程序基本工作原理的書,由于代碼背后的許多細(xì)節(jié)現(xiàn)在難以找到完整而又實(shí)用的資料,因此,系統(tǒng)性地講述這些技術(shù)要素一定非常有意義。這是我非常感興趣的話題,因?yàn)樽罱鼛啄陙?,我每次給學(xué)生講課或作技術(shù)報(bào)告時(shí),經(jīng)常會(huì)提到程序背后的一些細(xì)節(jié)知識(shí),而當(dāng)有人請(qǐng)我推薦一些參考資料時(shí),我很難想得出有什么恰當(dāng)?shù)膮⒖紩晒W(xué)習(xí)。我自己也曾想過要寫一點(diǎn)這方面的書,只是一直下不了決心做這件事情。甲子的提議讓我意識(shí)到,寫這樣一本書的機(jī)會(huì)來了。于是,我們認(rèn)真規(guī)劃了書的選題。按我的建議,這應(yīng)該是三卷本的書,每卷獨(dú)立,合起來成一體系。第一卷是基礎(chǔ)篇,介紹程序的基本運(yùn)行過程,即是您現(xiàn)在看到的這本書。其他兩卷還需要時(shí)日和機(jī)緣。在過去兩年中,我曾經(jīng)以“Inside Windows Programs”為題在多所高校作過報(bào)告,旨在介紹Windows程序背后的一些支撐技術(shù)。對(duì)于正在學(xué)習(xí)計(jì)算機(jī)或軟件專業(yè)的學(xué)生,或者正在從事軟件開發(fā)的工程師們,我認(rèn)為理解這些支撐技術(shù)是很有必要的。試想,即使一個(gè)簡(jiǎn)單的“Hello World!”程序,也依賴于背后的輸入輸出庫(或流庫)及系統(tǒng)提供的模塊,這種依賴性已經(jīng)成為現(xiàn)代軟件在操作系統(tǒng)環(huán)境下運(yùn)行的一個(gè)必要條件。然而,有關(guān)這些支撐技術(shù)的系統(tǒng)性資料卻少而又少,雖然Internet上并不缺乏任何一方面的細(xì)節(jié)信息,但是,能將程序的編譯和運(yùn)行過程所涉及的各種技術(shù)全面地串連起來介紹的,卻尚未有先例。甲子曾經(jīng)在2006年夏天跟我實(shí)習(xí)過兩個(gè)月,他幫我搭建了一個(gè)在Windows已有體系結(jié)構(gòu)下將交換空間重定向到遠(yuǎn)程機(jī)器物理內(nèi)存的原型系統(tǒng)。完成這一系統(tǒng)并非易事,而且甲子事前并無Windows內(nèi)核編程經(jīng)驗(yàn),但是,他憑借扎實(shí)的計(jì)算機(jī)系統(tǒng)軟件功底,成功地打通了從頁面錯(cuò)誤(page fault)異常例程到遠(yuǎn)程機(jī)器內(nèi)存管理器之間的數(shù)據(jù)通路。在這一段實(shí)習(xí)經(jīng)歷中,我不僅看到了他駕馭代碼和系統(tǒng)的能力,也感受到他做事認(rèn)真負(fù)責(zé)的態(tài)度。因此,當(dāng)他提出要寫一本介紹程序基礎(chǔ)的書時(shí),我認(rèn)為他是非常合適的人選??紤]到寫書的艱巨性,他推薦石凡同學(xué)加入進(jìn)來,這才有了我們?nèi)齻€(gè)人的組合。我原先擔(dān)心寫作的進(jìn)度,畢竟寫這樣一本書需要大量的時(shí)間投入。幸運(yùn)的是,在甲子和石凡的不懈努力下,這本書終于面市了。本書講解的內(nèi)容,涉及在Windows和Linux兩個(gè)系統(tǒng)平臺(tái)上,一個(gè)應(yīng)用程序在編譯、鏈接和運(yùn)行時(shí)刻所發(fā)生的各種事項(xiàng),包括:代碼指令是如何保存的,庫文件如何與應(yīng)用程序代碼靜態(tài)鏈接,應(yīng)用程序如何被裝載到內(nèi)存中并開始運(yùn)行,動(dòng)態(tài)鏈接如何實(shí)現(xiàn),C/C++運(yùn)行庫如何工作,以及操作系統(tǒng)提供的系統(tǒng)服務(wù)是如何被調(diào)用的。每個(gè)技術(shù)專題都配備了大量圖示和代碼實(shí)例,力求將復(fù)雜的機(jī)制以簡(jiǎn)潔的形式表達(dá)出來。本書最后還提供了一個(gè)小巧且跨平臺(tái)的C/C++運(yùn)行庫MiniCRT,綜合展示了與運(yùn)行庫相關(guān)的各種技術(shù)。關(guān)于寫作這本書的功勞,我不敢掠美。在創(chuàng)作之初,包括擬定提綱及甄選內(nèi)容方面,我跟甲子有過認(rèn)真而細(xì)致的討論;在寫作過程中,我對(duì)甲子和石凡的初稿提出過一些建議,尤其在表述方面,同時(shí)我也協(xié)助他們與編輯進(jìn)行了溝通和交流。對(duì)于正文的內(nèi)容,我并無實(shí)質(zhì)性的貢獻(xiàn),但基于我對(duì)甲子和石凡兩位年輕人的了解,我相信他們自身的技術(shù)實(shí)踐功底,以及足夠的技術(shù)闡釋能力。我期待這本書能夠真正地提升程序員的自我修養(yǎng),讓程序員總是生活在“知其然,更知其所以然”的代碼曼妙中。最后,我要感謝這本書的四位編輯,他們是何艷、方舟、劉鐵鋒和陳元玉,謝謝他們?yōu)檫@本書付出的努力。還要感謝博文視點(diǎn)團(tuán)隊(duì)的負(fù)責(zé)人周筠女士,謝謝她給予兩位年輕作者的扶持和關(guān)愛。潘愛民2009年2月于北京微軟七、作者序2兩年前,我在浙江大學(xué)的一著名BBS的C++板塊上擔(dān)任版主,而俞甲子則是板上的資深版友(以及前版主)。那時(shí)候我對(duì)鏈接裝載、運(yùn)行庫等內(nèi)容比較感興趣,自己摸索著在博客上寫了一篇關(guān)于鏈接的入門文章,而這就是一切的開始。我猜想俞甲子可能對(duì)寫這么一本書早有想法,看到我的文章正好找到了同路人。他找到了我和潘愛民老師,我們一拍即合,就開始了這長達(dá)兩年的寫作歷程??紤]到當(dāng)時(shí)俞甲子已經(jīng)在鏈接部分有了相當(dāng)?shù)姆e累,因此我不得不放棄我最有興趣的一部分轉(zhuǎn)而在運(yùn)行環(huán)境上做文章。我把glibc和msvcrt的源代碼翻了個(gè)底朝天,了解到了許多平時(shí)不可能接觸到的內(nèi)幕和技術(shù)細(xì)節(jié)。事實(shí)上,這基本是一個(gè)現(xiàn)學(xué)現(xiàn)賣的過程,我一邊學(xué)習(xí)著新的知識(shí),一邊把新知識(shí)組織整理寫成文字。讀者在看某些章節(jié)的時(shí)候,會(huì)發(fā)現(xiàn)這些章節(jié)的講解過程就是一個(gè)源代碼的挖掘過程,這實(shí)際上也就是我的學(xué)習(xí)過程。學(xué)習(xí)研究他人的代碼是枯燥而耗時(shí)的,我很高興能夠做這樣一個(gè)先行者,將我的經(jīng)驗(yàn)寫進(jìn)書里,讓讀者能夠避免重復(fù)勞動(dòng),直接獲得其中的經(jīng)驗(yàn)和關(guān)鍵技術(shù)。本書所講的內(nèi)容不是活躍在當(dāng)今IT舞臺(tái)上的高新技術(shù),也不是雄踞計(jì)算機(jī)某個(gè)領(lǐng)域的王牌霸主,而是默默服務(wù)于所有計(jì)算機(jī)應(yīng)用的掃地僧。也許閱讀本書不能夠直接在平時(shí)學(xué)習(xí)工作中的生產(chǎn)力上得到體現(xiàn),但了解計(jì)算機(jī)的臺(tái)前幕后會(huì)對(duì)讀者產(chǎn)生潛移默化的影響。當(dāng)你的程序無法啟動(dòng)的時(shí)候,你可能會(huì)在腦海里多設(shè)想一種可能性;當(dāng)你的代碼鏈接失敗的時(shí)候,你可能會(huì)更快地意識(shí)到問題的所在;當(dāng)你的程序發(fā)生非法操作的時(shí)候,你可能不至于面對(duì)微軟的錯(cuò)誤報(bào)告毫無頭緒。有人總愛用“時(shí)效性”評(píng)價(jià)當(dāng)今的IT技術(shù)。仿佛一項(xiàng)技術(shù)的生存期就只有幾年。我不能說這樣的想法是錯(cuò)誤的,如今的技術(shù)的確在飛速地更替和發(fā)展。但是本書所講的技術(shù),大多是成型在十年前,乃至二十年前,它們是整個(gè)計(jì)算機(jī)行業(yè)技術(shù)的根本,也幾乎是現(xiàn)在所有計(jì)算機(jī)應(yīng)用的基礎(chǔ)。在當(dāng)今的計(jì)算機(jī)技術(shù)發(fā)生根本性變革之前,這些技術(shù)還將繼續(xù)存在并保持活力。我很榮幸能夠有機(jī)會(huì)和讀者分享這些技術(shù),但寫作水平有限(我在語文課上歷來不是個(gè)好學(xué)生),最終在文字和結(jié)構(gòu)上頗有缺憾,只能在這里說一聲抱歉。在這里要感謝我小學(xué)、初中和高中的語文老師,謝謝你們當(dāng)初對(duì)我的教導(dǎo),盡管最終可能辜負(fù)了你們的希望。感謝潘老師、博文視點(diǎn)的編輯及所有支持我們的朋友們,謝謝你們對(duì)我們的幫助。最后要感謝我的父母,沒有你們,我永遠(yuǎn)不可能走到今天這一步。石凡2009年2月于杭州八、作者序3CPU體系結(jié)構(gòu)、匯編、C語言(包括C++)和操作系統(tǒng),永遠(yuǎn)都是編程大師們的護(hù)身法寶,就如同少林寺的《易筋經(jīng)》,是最為上乘的武功;學(xué)會(huì)了《易筋經(jīng)》,你將無所不能,任你創(chuàng)造武功;學(xué)會(huì)了編程“易筋經(jīng)”,大師們可以任意開發(fā)操作系統(tǒng)、編譯器,甚至是開發(fā)一種新的程序設(shè)計(jì)語言!——佚名念書的時(shí)候,作為標(biāo)準(zhǔn)的愛好技術(shù)的宅男,每天掃一遍各大高校BBS的技術(shù)版面,基本好比一日三餐一樣平常。我對(duì)計(jì)算機(jī)技術(shù)方面的口味很雜,從匯編版到C++到Linux內(nèi)核開發(fā)、Linux應(yīng)用開發(fā)、游戲開發(fā)、網(wǎng)絡(luò)、編程語言、體系結(jié)構(gòu)、移動(dòng)開發(fā)、開源閉源我都會(huì)參上一腳。我始終認(rèn)為技術(shù)優(yōu)劣取決于需求,與很多持有“編程語言血統(tǒng)論”的程序開發(fā)者不同,我不認(rèn)為C++或Java本身有什么直接可比性,或者OOP與函數(shù)式編程誰優(yōu)誰劣,我始終堅(jiān)持認(rèn)為作為開發(fā)者,MOP(Market/Money Oriented Programming)才是唯一不變的編程范式。于是我往往不參與那些技術(shù)、平臺(tái)、語言教派之間的宗教戰(zhàn)爭(zhēng),這種論戰(zhàn)基本上每周都會(huì)有,我很佩服論戰(zhàn)各方見多識(shí)廣、旁征博引、高屋建瓴的論斷,但我往往只是灌灌水調(diào)節(jié)一下思緒。相反,我很關(guān)注一些與語言、平臺(tái)等相對(duì)獨(dú)立的基本的系統(tǒng)概念方面的問題,這些問題比較具體,也比較實(shí)用,比如:為什么程序是從main開始執(zhí)行?“malloc分配的空間是連續(xù)的嗎?”“PE/ELF文件里面存的是什么?”“我想寫一個(gè)不需要操作系統(tǒng)可以直接在硬件上跑的程序該怎么做?”“目標(biāo)文件是什么?鏈接又是什么?”“為什么這段程序鏈接時(shí)報(bào)錯(cuò)?”“句柄到底是什么東西?”這些問題看似很簡(jiǎn)單但實(shí)際上有很多值得深入挖掘的地方,比如第一個(gè)問題圍繞著main函數(shù)執(zhí)行前后可以延伸出一大堆問題:程序入口、運(yùn)行庫初始化、全局/靜態(tài)對(duì)象構(gòu)造析構(gòu)、靜態(tài)和動(dòng)態(tài)鏈接時(shí)程序的初始化和裝載等。我們把這些問題歸結(jié)起來,發(fā)現(xiàn)主要是三個(gè)很大的而且連貫的主題,那就是“鏈接、裝載和庫”。事實(shí)上,現(xiàn)在市面上和網(wǎng)絡(luò)上能找到的計(jì)算機(jī)技術(shù)方面的書籍和資料中,什么都很齊全,唯獨(dú)關(guān)于這三個(gè)主題的討論十分稀缺,即使能找到一些也是猶如殘缺的典籍,不僅不完整而且很多已經(jīng)過時(shí)了。關(guān)于現(xiàn)在通用的Windows和Linux平臺(tái)的鏈接、裝載及PE/ELF文件的詳細(xì)分析,實(shí)在很少見。這個(gè)領(lǐng)域中,最為完整、也最為權(quán)威的莫過于John R. Levine的《Linkers & Loaders》,這本書我也前前后后通讀了好幾遍,雖然它對(duì)鏈接和裝載方面的描述較為完整,但是過于理論化,對(duì)于實(shí)際的系統(tǒng)機(jī)制描述則過于簡(jiǎn)略。我始終認(rèn)為對(duì)于一個(gè)問題比較好的描述方式,是由一個(gè)很小很簡(jiǎn)單的問題或示例入手,層層剝開深入挖掘,不僅探究每個(gè)機(jī)制“怎么做”,而且要理解它們“為什么這樣做”,力求深入淺出、圖文并茂,盡力把每一步細(xì)節(jié)都呈現(xiàn)給讀者。這是我一貫的想法,也是我們?cè)诒緯信υ噲D達(dá)到的效果。第一次有想寫這樣一本書的念頭是在2006年底,當(dāng)時(shí)我正在念研一,想起未來還有一年多漫長而又相對(duì)空閑的研究生生涯,覺得寫一本這樣的書大概是比較好的“消遣活動(dòng)”。于是我第一時(shí)間想到了在微軟研究院實(shí)習(xí)時(shí)的導(dǎo)師潘愛民老師,潘老師在寫作技術(shù)書籍方面有很深的功底和豐富的經(jīng)驗(yàn)。我把想法告訴潘老師以后,他十分支持,于是我又找到了當(dāng)時(shí)剛好保送研究生、時(shí)間上也相對(duì)充裕的石凡,我們?nèi)齻€(gè)都對(duì)這個(gè)選題十分感興趣,可謂一拍即合。當(dāng)時(shí)也沒多想,以為寫書大概也就跟BBS發(fā)帖連載差不多吧。一旦寫起來才發(fā)現(xiàn)自己完全輕視了寫書的工作量。書中的每一個(gè)章節(jié)、每一個(gè)小段、每一個(gè)例子甚至每一個(gè)用詞有時(shí)候都要斟酌很久,生怕用得不恰當(dāng)誤導(dǎo)了讀者?!罢`人子弟”這四個(gè)字罪名可不輕,大有推出午門斬首五遍以儆效尤之過。寫書的時(shí)間的確很倉促,雖然我們都是在讀研時(shí)寫的,按理說相對(duì)于已經(jīng)工作的作者來講,已經(jīng)是有很多閑余的時(shí)間了,但還是經(jīng)常手忙腳亂。想到以前看書看到作者寫的序里,經(jīng)常使用“時(shí)間倉促,水平有限”的話,推想作者不過是出于謙虛不免要客套一下。現(xiàn)在輪到自己寫序了,終于感覺到了這八個(gè)字的分量。即使到現(xiàn)在已近完稿,我們還是心里十分忐忑,因?yàn)檫€有不少地方的確寫得不夠完善。也聽到了很多第一批讀者的反饋意見,很多建議都正中這本書的軟肋,我們也根據(jù)大家的意見又一次進(jìn)行了修改,這已經(jīng)是反反復(fù)復(fù)的第N次修訂了。這本書前前后后花了兩年多的時(shí)間一直沒有完稿,由于截稿時(shí)間快到了,我們才終于定稿,因?yàn)閷?shí)在沒有辦法做到完美,只能向無限接近完美努力。最后,我們?cè)凇爸焙汀熬幹敝g猶豫了很久,想到本書凝聚了我們很多的心血,還是誠惶誠恐地寫上了“著”字,權(quán)當(dāng)給自己壯膽了。我們也相信,本書雖然沒做到完美,但是它一定會(huì)給你帶來一些你以前想看、想了解而又找不到的東西?;蛘咭郧霸诰幊踢^程中困惑了你很久,但始終沒有找到解釋的問題,當(dāng)在本書中終于找到答案且大呼“原來如此!”時(shí),我們也就很欣慰了!關(guān)于本書的書名筆者們也討論了很久,征詢過很多意見,最終還是決定用“程序員的自我修養(yǎng)”作為書名,將“鏈接、裝載與庫”作為副標(biāo)題。書名源自于俄羅斯的演員斯坦尼斯拉夫斯基創(chuàng)作的《演員的自我修養(yǎng)》,作者為了寫這本書前前后后修改了三十年之久,臨終前才同意不再修改,拿去出版。使用這個(gè)書名一方面是本書的內(nèi)容的確不是介紹一門新的編程語言或展示一些實(shí)用的編程技術(shù),而是介紹程序運(yùn)行背后的機(jī)制和由來,可以看作是程序員的一種“修養(yǎng)”;另一方面是向斯坦尼斯拉夫斯基致敬,向他對(duì)作品精益求精的精神致敬。在本書的創(chuàng)作過程中,很多人對(duì)我們的支持和幫助難以言表。這里我要感謝博文視點(diǎn)的幾位編輯何艷、方舟、劉鐵鋒和陳元玉等,他們?yōu)楸緯冻隽撕芏嘈难?;特別要感謝博文視點(diǎn)的周筠老師,這本書能夠面世離不開她的支持和努力。另外也要感謝浙江大學(xué)的張曉龍博士,他為本書提出了很多建議,并且貢獻(xiàn)了“DLL HELL”一節(jié)。俞甲子2009年2月于杭州

內(nèi)容概要

本書主要介紹系統(tǒng)軟件的運(yùn)行機(jī)制和原理,涉及在Windows和Linux兩個(gè)系統(tǒng)平臺(tái)上,一個(gè)應(yīng)用程序在編譯、鏈接和運(yùn)行時(shí)刻所發(fā)生的各種事項(xiàng),包括:代碼指令是如何保存的,庫文件如何與應(yīng)用程序代碼靜態(tài)鏈接,應(yīng)用程序如何被裝載到內(nèi)存中并開始運(yùn)行,動(dòng)態(tài)鏈接如何實(shí)現(xiàn),C/C++運(yùn)行庫的工作原理,以及操作系統(tǒng)提供的系統(tǒng)服務(wù)是如何被調(diào)用的。每個(gè)技術(shù)專題都配備了大量圖、表和代碼實(shí)例,力求將復(fù)雜的機(jī)制以簡(jiǎn)潔的形式表達(dá)出來。本書最后還提供了一個(gè)小巧且跨平臺(tái)的C/C++運(yùn)行庫MiniCRT,綜合展示了與運(yùn)行庫相關(guān)的各種技術(shù)?! ”緯鴮?duì)裝載、鏈接和庫進(jìn)行了深入淺出的剖析,并且輔以大量的例子和圖表,可以作為計(jì)算機(jī)軟件專業(yè)和其他相關(guān)專業(yè)大學(xué)本科高年級(jí)學(xué)生深入學(xué)習(xí)系統(tǒng)軟件的參考書。同時(shí),還可作為各行業(yè)從事軟件開發(fā)的工程師、研究人員以及其他對(duì)系統(tǒng)軟件實(shí)現(xiàn)機(jī)制和技術(shù)感興趣者的自學(xué)教材。

書籍目錄

第1部分 簡(jiǎn)介   第1章 溫故而知新   1.1 從HELLO WORLD 說起    1.2 萬變不離其宗   1.3 站得高,望得遠(yuǎn)     1.4 操作系統(tǒng)做什么   1.5 內(nèi)存不夠怎么辦   1.6 眾人拾柴火焰高   1.7 本章小結(jié) 第2部分 靜態(tài)鏈接  第2章 編譯和鏈接   2.1 被隱藏了的過程   2.2 編譯器做了什么   2.3 鏈接器年齡比編譯器長   2.4 模塊拼裝——靜態(tài)鏈接   2.5 本章小結(jié)  第3章 目標(biāo)文件里有什么    3.1 目標(biāo)文件的格式   3.2 目標(biāo)文件是什么樣的   3.3 挖掘SIMPLESECTION.O    3.4 ELF 文件結(jié)構(gòu)描述  3.5 鏈接的接口——符號(hào)    3.6 調(diào)試信息   3.7 本章小結(jié)  第4章 靜態(tài)鏈接    4.1 空間與地址分配   4.2 符號(hào)解析與重定位   4.3 COMMON 塊   4.4 C++相關(guān)問題    4.5 靜態(tài)庫鏈接   4.6 鏈接過程控制   4.7 BFD 庫   4.8 本章小結(jié)  第5章 WINDOWS PE/COFF    5.1 WINDOWS 的二進(jìn)制文件格式PE/COFF  134   5.2 PE 的前身——COFF    5.3 鏈接指示信息    5.4 調(diào)試信息    5.5 大家都有符號(hào)表    5.6 WINDOWS 下的ELF——PE    5.7 本章小結(jié)  第3部分 裝載與動(dòng)態(tài)鏈接   第6章 可執(zhí)行文件的裝載與進(jìn)程    6.1 進(jìn)程虛擬地址空間    6.2 裝載的方式    6.3 從操作系統(tǒng)角度看可執(zhí)行文件的裝載    6.4 進(jìn)程虛存空間分布    6.5 LINUX 內(nèi)核裝載ELF 過程簡(jiǎn)介    6.6 WINDOWS PE 的裝載    6.7 本章小結(jié)   第7章 動(dòng)態(tài)鏈接    7.1 為什么要?jiǎng)討B(tài)鏈接    7.2 簡(jiǎn)單的動(dòng)態(tài)鏈接例子    7.3 地址無關(guān)代碼    7.4 延遲綁定(PLT)    7.5 動(dòng)態(tài)鏈接相關(guān)結(jié)構(gòu)    7.6 動(dòng)態(tài)鏈接的步驟和實(shí)現(xiàn)    7.7 顯式運(yùn)行時(shí)鏈接    7.8 本章小結(jié)   第8章 LINUX 共享庫的組織   8.1 共享庫版本    8.2 符號(hào)版本    8.3 共享庫系統(tǒng)路徑    8.4 共享庫查找過程    8.5 環(huán)境變量    8.6 共享庫的創(chuàng)建和安裝    8.7 本章小結(jié)   第9章 WINDOWS 下的動(dòng)態(tài)鏈接   9.1 DLL 簡(jiǎn)介    9.2 符號(hào)導(dǎo)出導(dǎo)入表    9.3 DLL 優(yōu)化    9.4 C++與動(dòng)態(tài)鏈接    9.5 DLL HELL    9.6 本章小結(jié)  第4部分 庫與運(yùn)行庫   第10章 內(nèi)存    10.1 程序的內(nèi)存布局    10.2 棧與調(diào)用慣例    10.3 堆與內(nèi)存管理    10.4 本章小結(jié)  第11章 運(yùn)行庫    11.1 入口函數(shù)和程序初始化   11.2 C/C++運(yùn)行庫    11.3 運(yùn)行庫與多線程    11.4 C++全局構(gòu)造與析構(gòu)    11.5 FREAD 實(shí)現(xiàn)    11.6 本章小結(jié)   第12章 系統(tǒng)調(diào)用與API  12.1 系統(tǒng)調(diào)用介紹    12.2 系統(tǒng)調(diào)用原理    12.3 WINDOWS API    12.4 本章小結(jié)  第13章 運(yùn)行庫實(shí)現(xiàn)    13.1 C 語言運(yùn)行庫    13.2 如何使用MINI CRT    13.3 C++運(yùn)行庫實(shí)現(xiàn)    13.4 如何使用MINI CRT++    13.5 本章小結(jié)  附錄A   A.1 字節(jié)序(BYTE ORDER)   A.2 ELF 常見段   A.3 常用開發(fā)工具命令行參考  索引

章節(jié)摘錄

第1部分 簡(jiǎn)介   第1章 溫故而知新   1.2 萬變不離其宗計(jì)算機(jī)是個(gè)非常廣泛的概念,大到占用數(shù)層樓的用于科學(xué)計(jì)算的超級(jí)計(jì)算機(jī),小到手機(jī)上的嵌入式芯片都可以被稱為計(jì)算機(jī)。雖然它們的外形、結(jié)構(gòu)和性能都千差萬別,但至少它們都有“計(jì)算”這個(gè)概念。在本書里面,我們將計(jì)算機(jī)的范圍限定在最為流行、使用最廣泛的PC機(jī),更具體地講是采用兼容x86指令集的32位CPU的個(gè)人計(jì)算機(jī)。原因很簡(jiǎn)單:因?yàn)楣P者手上目前只有這種類型的計(jì)算機(jī)可供操作和實(shí)驗(yàn),不過相信90%以上的讀者也是,所以在這一點(diǎn)上我們很快能達(dá)成共識(shí)。其實(shí)選擇具體哪種平臺(tái)并不是最關(guān)鍵的,雖然各種平臺(tái)的軟硬件差別很多,但是本質(zhì)上它們的基本概念和工作原理都是一樣的,只要我們能夠掌握一種平臺(tái)上的技術(shù),那么其他的平臺(tái)都是大同小異的,很輕松地可以舉一反三。所以我們相信,只有你能夠深刻地理解x86平臺(tái)下的系統(tǒng)軟件背后的機(jī)理,當(dāng)有一天你需要在MIPS指令集的嵌入式平臺(tái)上做開發(fā),或者需要為64位的Windows或tinux開發(fā)應(yīng)用程序的時(shí)候,你很快就能找到它們之間的相通之處。撇開計(jì)算機(jī)硬件中紛繁復(fù)雜的各種設(shè)備、芯片及外圍接口等,站在軟件開發(fā)者的角度看,我們只須抓住硬件的幾個(gè)關(guān)鍵部件。對(duì)于系統(tǒng)程序開發(fā)者來說,計(jì)算機(jī)多如牛毛的硬件設(shè)備中,有三個(gè)部件最為關(guān)鍵,它們分別是中央處理器CPU、內(nèi)存和I/O控制芯片,這三個(gè)部件幾乎就是計(jì)算機(jī)的核心了;對(duì)于普通應(yīng)用程序開發(fā)者來說,他們似乎除了要關(guān)心CPU以外,其他的硬件細(xì)節(jié)基本不用關(guān)心,對(duì)于一些高級(jí)平臺(tái)的開發(fā)者來說(如Java、.NET或腳本語言開發(fā)者),連CPU都不需要關(guān)心,因?yàn)檫@些平臺(tái)為它們提供了一個(gè)通用的抽象的計(jì)算機(jī),他們只要關(guān)心這個(gè)象的計(jì)算機(jī)就可以了?!  ?/pre>

媒體關(guān)注與評(píng)論

這是一本深人闡述鏈接、裝載和庫等問題的優(yōu)秀圖書,讀來讓人愉悅,你從巾可以清晰地了解程序的前世今生,徹底理解敲人的代碼如何變成程序任系統(tǒng)中運(yùn)行。通讀本書不管對(duì)于開發(fā)還是trouble shootin9都會(huì)很有幫助。建議每一位希望從事系統(tǒng)開發(fā)、或希望更實(shí)務(wù)地理解操作系統(tǒng)和編譯器、或不滿足于只寫代碼的優(yōu)秀程序員都擁有這樣一本書。         ——鄒飛,趨勢(shì)科技(中國)研發(fā)中心資深軟件要程師本書從大處著眼,小處著手,以通俗易懂的語言,深入淺出地對(duì)系統(tǒng)軟件的底層形成機(jī)制進(jìn)行條分縷析,正合藥山禪師所謂“高高山頂立,深深海底行”。循著作者的思緒一路走來,有如醍醐灌頂。暢快淋漓。非常高興有預(yù)覽此書初稿的寶貴機(jī)會(huì),我在瀏覽書稿和查核相關(guān)資料的過程中,學(xué)到了很多以前未知或知之不深的內(nèi)容。         ——馮亮,阿里巴巴(中國)網(wǎng)絡(luò)技術(shù)有限公司運(yùn)維部系統(tǒng)架構(gòu)師

編輯推薦

《程序員的自我修養(yǎng):鏈接、裝載與庫》深入淺出地對(duì)系統(tǒng)軟件的底層形成機(jī)制進(jìn)行條分縷析真正提升程序員的自我修養(yǎng)

圖書封面

圖書標(biāo)簽Tags

評(píng)論、評(píng)分、閱讀與下載


    程序員的自我修養(yǎng) PDF格式下載


用戶評(píng)論 (總計(jì)162條)

 
 

  •   這本書寫得非常好?,F(xiàn)在編程IDE的發(fā)展已經(jīng)屏蔽了程序之所以為可執(zhí)行文件的過程:編譯、鏈接、裝載。它分析了Unix/Linux和Windows下的不同之處,比如說so和dll的不同。我覺得難能可貴的是,它在書的最后幾章重點(diǎn)討論了運(yùn)行庫、系統(tǒng)調(diào)用、包裝API等在Unix/Linux下和在Windows下的原理和原理的不同之處。最后一章還演示了一個(gè)自己實(shí)現(xiàn)的Mini CRT 示例,看了以后覺得作者功底確實(shí)很深厚,不得不推薦一下這本書。

    另外,三位作者的語言使用很得當(dāng),解釋枯燥的原理時(shí)經(jīng)常會(huì)有幽默性的語句出現(xiàn),插圖比喻也顯得很生活化。從這點(diǎn)來看,我能在一個(gè)星期內(nèi)讀完這本書,幾位作者對(duì)文字的駕馭也起到了很大的作用。

    讀完后關(guān)閉書卷,作者們?yōu)槲移饰龅牟僮飨到y(tǒng)、運(yùn)行庫、鏈接、裝載、運(yùn)行庫 等一系列概念如一副副立體畫一樣,展現(xiàn)在眼前。雖然在大學(xué)的時(shí)候計(jì)算機(jī)類教材很枯燥,幸虧工作后能遇到這種好書,為我等程序員們歸納知識(shí)提供了很大的便利。<程序員的自我修養(yǎng)>這個(gè)標(biāo)題名至實(shí)歸。
  •   書本身解釋的還是不錯(cuò)的,同時(shí)買了《操作系統(tǒng):精髓與設(shè)計(jì)原理》和《程序員的自我修養(yǎng)—鏈接、裝載與庫》兩本都不錯(cuò),個(gè)人感覺后一本更好一些。
  •   以最快的速度看完了這本書,對(duì)動(dòng)態(tài)庫的裝載鏈接原理有了更深的認(rèn)識(shí),尤其是對(duì)在工作中碰到的相關(guān)問題處理起來更加得心應(yīng)手。
  •   將鏈接編譯,運(yùn)行庫,可執(zhí)行文件等基礎(chǔ)講的很清楚,真不錯(cuò)。
  •   C到底怎么運(yùn)行、操作系統(tǒng)如何裝載,這本書是從操作系統(tǒng)的角度剖析一段代碼如何運(yùn)行,屬于硬基本功,當(dāng)然啃起來很吃力,但是心里很滿足
  •   是一本學(xué)習(xí)鏈接、裝載和庫的好書。值得珍藏
  •   鏈接、裝載與庫——正是自己想要的,希望看完能有所收獲
  •   這本書讓我了解了在編譯、鏈接過程中是怎樣執(zhí)行的,這對(duì)于想深入研究嵌入式是很有幫助的,還有書中后面關(guān)于庫的一些我還沒有去了解,相信會(huì)和前半部分一樣會(huì)有更加深刻的理解的。
  •   一個(gè)程序從代碼一直到運(yùn)行這個(gè)過程是怎樣的?這本書里面有很多我想知道的答案,而且深入程度適中,我覺得這本書適合大部分想了解不多不少底層運(yùn)作知識(shí)的程序員。
  •   對(duì)于編譯,鏈接和加載,之前只是一知半解,看了這本書全明白了,由于其中對(duì)于動(dòng)態(tài)庫&amp;amp;ldquo;全局符號(hào)介入&amp;amp;rdquo;的問題,項(xiàng)目上需要注意?。?/li>
  •   從操作系統(tǒng)和編譯鏈接角度讓開發(fā)人員更理解自己所寫的代碼會(huì)發(fā)生哪些變化,如何維護(hù)和編寫更高效的代碼,絕對(duì)是本好書,但不適合初學(xué)者。
  •   作者深入剖析了程序的裝載與鏈接的過程,很有啟發(fā)意義
  •   這本書對(duì)鏈接、庫介紹說明的比較詳細(xì),我是初學(xué)者,某些地方看起來還是有點(diǎn)暈,不過通過學(xué)習(xí)還是可以理解的
  •   一本深入學(xué)習(xí)鏈接庫的好書
  •   工作幾年了卻一直是在做應(yīng)用層系統(tǒng)。每當(dāng)遇到一些底層的問題時(shí),總是不得其法。說不懂,其實(shí)也了解一些,但也說不出所以然。這本書我還沒有讀完,目前的理解是:它是一本關(guān)于程序“本質(zhì)”的書——程序從我們寫的高級(jí)語言代碼,到底層的機(jī)器碼,中間的過程是如何進(jìn)行的。讀完之后相信我會(huì)對(duì)這個(gè)過程有個(gè)更系統(tǒng)更深入的理解。當(dāng)然它不一定適合所有的人。想我這樣對(duì)于系統(tǒng)底層理解不夠深刻的菜鳥,需要結(jié)合看一些操作系統(tǒng)的書,并反復(fù)學(xué)習(xí)??傊畬W(xué)無止境啊。
  •   操作系統(tǒng)底層的一些東東,對(duì)了解軟件運(yùn)行很有幫助
  •   個(gè)人覺得真正的程序員是應(yīng)該對(duì)底層底層的東西有必要的了解的,正所謂本書所強(qiáng)調(diào)的程序員的自我修養(yǎng)。若想了解程序的是怎么加載運(yùn)行的,那么這本書是你所需要的!強(qiáng)烈推薦!
  •   這本書關(guān)于程序從編寫到運(yùn)行的機(jī)制
  •   書很好,內(nèi)容很不錯(cuò),不過一直沒有時(shí)間看完,在看的過程中,補(bǔ)了很計(jì)算機(jī)基礎(chǔ)的東西,想深入學(xué)習(xí)下程序運(yùn)行的原理的同學(xué)可以讀一下,收獲挺大的
  •   學(xué)習(xí)編程的人看了會(huì)有很大的幫助。能理解程序運(yùn)行的內(nèi)層原理。
  •   從代碼到16進(jìn)制數(shù),很棒的書~優(yōu)秀的程序員必須了解自己程序的每個(gè)字符~這就是自我修養(yǎng)
  •   把編譯和運(yùn)行這個(gè)階段的事情,闡述的很清楚,對(duì)提高對(duì)系統(tǒng)的理解、排錯(cuò)能力很有好處。
  •   很少又講連接正在與庫的書,經(jīng)典
  •   嘿嘿,拿到手中迫不及待的讀完了,受益匪淺,原來對(duì)連接、庫等很模糊的概念,讀完書后清晰了,強(qiáng)烈推薦給大家
  •   國內(nèi)經(jīng)典的計(jì)算機(jī)書籍不多,這本可謂是很有深度,尤其是對(duì)于那些喜歡鉆研,喜歡了解底層的家伙來說,我閱讀這本書已經(jīng)是第二遍了,從電子書,到從圖書館借來的書,再到自己去買。每次讀都有新的收獲,尤其是邊看代碼,邊讀書。
  •   深入淺出,對(duì)鏈接、加載有較清晰的講解
  •   可以讓讀者了解代碼如何轉(zhuǎn)換成可執(zhí)行程序的一本好書,易懂,目前看了一半,值得推薦
  •   之前看了別人寫的鏈接腳本不懂,所以買來看看,看了再評(píng)書的好壞。。。
  •   對(duì)鏈接等原理講述得比較詳細(xì)。
  •   1,很喜歡
    2,原因是這本書就像是一把鑰匙,打開了一扇正確的門,對(duì)于任何想深入了解系統(tǒng)方面知識(shí)的程序員,這本書絕對(duì)是入門的好書
    3,作者得寫作態(tài)度非常端正,尊重讀者的作者同樣會(huì)獲得讀者的尊重
  •   我的數(shù)據(jù)庫老師在課上曾經(jīng)推薦過這本書,這本書的作者我也認(rèn)識(shí),現(xiàn)在作者已經(jīng)開了公司,干得還不錯(cuò)。最近重讀這本書,感覺作者對(duì)連接這部分講解的不錯(cuò),但是裝載處理的不是很好,可能和這部分細(xì)節(jié)不多吧
  •   這本書很不錯(cuò)。是我目前見過的關(guān)于C編程的比較出色的一本,對(duì)程序的實(shí)現(xiàn)有了很好的講解,有助于對(duì)編程的理解。
  •   寫得非常不錯(cuò),的確是一本國內(nèi)不多見的優(yōu)秀原創(chuàng)書。大家都抄來抄去,能有這么一本好書不容易,我們要愛護(hù)。我一口氣讀了100多頁,是位年輕的作者。盡管他打著潘愛民的旗號(hào),但是作者的探索精神,“打破砂鍋紋(問)到底”的精神,都超過了潘愛民。該書適合各路人士(新手和老手)。非常希望作者能對(duì)這本書的文字和布局再仔細(xì)錘煉一下,不要趕時(shí)髦,僅保留重要的內(nèi)容,以書名闡述的“修養(yǎng)”的嚴(yán)謹(jǐn)態(tài)度,剃除原文中那些“博克”習(xí)氣的文字,文字再精煉些,修正一些編輯性錯(cuò)誤。還有,補(bǔ)充書中各種論點(diǎn)的參考文獻(xiàn)和閱讀書目,提高可信行。那樣,我覺得每位學(xué)習(xí)計(jì)算機(jī)專業(yè)的人都該在案頭備這么一本書,這本書有望成長為一本該領(lǐng)域的圣經(jīng)。各位,先睹為快!
  •   這本書不會(huì)讓你的編程水平突飛猛進(jìn), 但是對(duì)底層數(shù)據(jù)模型更加了解的人會(huì)對(duì)代碼更加有發(fā)言權(quán)
  •   對(duì)想了解一些底層技術(shù)和原理實(shí)現(xiàn)的很有幫助,寫的也很清晰,易讀,讀后收獲不小,雖然我的電子版的,但還是買一本
  •   難得看到的國人寫的一本計(jì)算機(jī)的好參考書。這本書雖然內(nèi)容不多,一兩天可以看完,但是讓我感覺把很多知識(shí)都復(fù)習(xí)了一遍,頗有神清氣爽的感覺~

    一個(gè)小細(xì)節(jié)是書里的示意圖繪圖質(zhì)量都很高,這種細(xì)節(jié)上認(rèn)真的態(tài)度我感覺很難得——好吧,我只是個(gè)普通讀者,不是特別的什么粉或者什么黑什么的——前段時(shí)間看了《C語言深度解剖--解開程序員面試筆試的秘密》,覺得水平和態(tài)度都比這本書差不少=,=
  •   這本書太贊了?。?! 內(nèi)容非常 具體深入 是學(xué)習(xí)程序開發(fā)的人 值得推薦的
  •   內(nèi)容很豐富,是程序員提高自身編程素質(zhì)的一劑良藥,很實(shí)用,力薦?。?!
  •   書籍以linux講解為主,windows平臺(tái)為鋪??傮w不錯(cuò)。
  •   這本書真的很好,解釋了我所有的疑惑(--夸張了?)云風(fēng)推薦的我覺得很值
  •   這本書是一個(gè)程序員真正需要的東西。不要等到用到的時(shí)候再去看
  •   作為程序員以及IT技術(shù)人員確實(shí)應(yīng)該好好讀一讀
  •   系統(tǒng)的梳理了整個(gè)編譯過程,把以前零散的知識(shí)點(diǎn)串了起來
  •   很棒,很精彩,即使不需要精通,了解一下也還是必要到的,適合所有沒有系統(tǒng)了解過這方面的人
  •   作者對(duì)系統(tǒng)下層很熟,我學(xué)到了不少東西。很少能看到這樣的好書。
  •   推薦程序員閱讀,提高自身修養(yǎng)
  •   這是本非常不錯(cuò)的書,看了之后就不會(huì)問編譯之類的問題了,對(duì)程序的執(zhí)行過程講的非常好,使編程知其然,也知知其所以然
  •   對(duì)于想了解底層一點(diǎn)的東西而基礎(chǔ)又不是很好的人非常適合。力薦!
  •   作為一個(gè)程序員有必要了解一下。
  •   講的原理很多,還有實(shí)例。
  •   看過電子檔,感覺太好了,就買下了,很同學(xué)一起買了兩本。學(xué)嵌入式的,尤其是基于linux的,特別有用。
  •   程序員非常經(jīng)典的一本書,不可不讀。程序員以后發(fā)展非常有好處。
  •   很好的一本書,很適合程序員讀
  •   本書的講解很詳細(xì),又很精練,信息收集得很全面,解惑相當(dāng)?shù)轿弧M扑]購買,尤其是想了解內(nèi)部原理的編程者?,F(xiàn)在還只看了前面的幾章,就感覺非常不錯(cuò)。
  •   看了電子版的,再看實(shí)物,比想象中厚很多啊,很給力
  •   涉及到了我們學(xué)習(xí)中的不少困惑之處,很多教科書都不展開闡述的一些內(nèi)容,被作者寫的很生動(dòng),便于理解。讀起來一氣呵成??上Ш蟀氩糠值奈墓P差了一大截,讀起來有點(diǎn)拗口,并且思維跳躍性太大。估計(jì)是兩個(gè)作者的緣故吧。
  •   知識(shí)點(diǎn)深入剖析,令人豁然開朗~
  •   程序員練級(jí)精品。提高內(nèi)功好幫手。
  •   好書自然要推薦,程序員必看。
  •   書的質(zhì)量還是很好的,內(nèi)容還沒怎么看。但是拿在手上沉甸甸的。印刷質(zhì)量很好,對(duì)于C++程序員的一些底層的困惑,解釋的很清楚。期待后續(xù)版
  •   書保證是正品這是堅(jiān)持一直在當(dāng)當(dāng)買書的原因,這本書是同事讓幫忙買的,具體內(nèi)容還沒看,先給個(gè)物流和當(dāng)當(dāng)?shù)姆?wù)給個(gè)好評(píng)先
  •   這本書看了好久了,價(jià)格有點(diǎn)高,不錯(cuò)內(nèi)容很不錯(cuò),最后狠心自己買了,以后要認(rèn)真看。
  •   擴(kuò)充知識(shí)面,提高自身修養(yǎng)
  •   修養(yǎng)之途,歷練!
  •   這本書真的很不錯(cuò),之前是在圖書館看到的,稍微瀏覽了一下,書講的很通俗,但是很深入
  •   書非常好 ,公司工程師看的。
  •   好書,值得深入研究。
  •   絕對(duì)的經(jīng)典啊,了解編譯pe文件等的不二選擇
  •   借別人的看過一遍,感覺不錯(cuò),就自己買一本,雙十一,第二天就到了,物流還是很給力的
  •   我認(rèn)識(shí)這本書的主要作者,
    正如作者的性格一樣,這本書有扎實(shí)的功底、清晰的思路、睿智又不失風(fēng)趣
    拜讀此書,受益匪淺。
  •   自我修煉的好書
  •   已買待看再待分享
  •   剛買到書,還沒來得及看。稍后再上評(píng)論
  •   很底層的一本書,前輩們推薦,細(xì)細(xì)品嘗中……
  •   對(duì)書中的很多細(xì)節(jié)還是不理解,學(xué)習(xí)了編程好幾年,從來沒想過底層的方面~~
  •   想買這本書已經(jīng)很久了,今天終于到了,雖然到的有點(diǎn)晚,催了幾次,但書確實(shí)是好書。
  •   這本書非常好!可以幫助很好理解底層方面的知識(shí)!
  •   之前找別人結(jié)果這本書看,覺得相當(dāng)不錯(cuò),所以自己也買一本啊
  •   很不錯(cuò)的一本書,需要慢慢看
  •   如果你想了解底層,那么非常建議您看這本書
  •   很不錯(cuò)的一本書,買過了,等著看
  •   非常不錯(cuò)的一本書,還沒看,不過已經(jīng)是經(jīng)典了。
  •   很好的一本書,值得慢慢品味!
  •   是本好書,目前國內(nèi)書市上也就這本書可以了
  •   看到這本書居然是本科生寫的,確實(shí)有點(diǎn)震驚,不過書確實(shí)寫的不錯(cuò)
  •   以前陸陸續(xù)續(xù)看了很多書,這本書能將看過的聯(lián)系到一起來
    作者很清楚初學(xué)者所缺乏的知識(shí)點(diǎn),比較推薦功底還不是很深的人細(xì)看,如果搭配其他的書就更牛了
  •   這本書在網(wǎng)上初看了一下,挺好的,值得珍藏!
  •   發(fā)貨挺快,物流也挺好的。書是朋友推薦的,很好的一本書~
  •   對(duì)于日常編程可能沒注意或來不及思考的問題,這本書可能會(huì)讓你思考得更遠(yuǎn)。
  •   當(dāng)我拿起這本書的時(shí)候,有一種莫名的激動(dòng)
  •   這本書不錯(cuò),講得比較低層
  •   沒想到是學(xué)生寫的。。真的不容易。。非常的好。。。鼓勵(lì)鼓勵(lì)。。
  •   非常好看的書,研究底層知識(shí)的人值得一看。
  •   感覺很不錯(cuò),值得學(xué)習(xí)參悟
  •   非?;A(chǔ)的書,從底層學(xué)習(xí)
  •   國人寫的書,很少有我覺得不錯(cuò)的!這書確實(shí)不錯(cuò),值得學(xué)習(xí)和推薦??!
  •   書內(nèi)容很新,書很好,適合想學(xué)習(xí)的
  •   書很好,得好好看
  •   書沒得說,經(jīng)典好書,包裝要是好點(diǎn)就好了
  •   老師推薦,買了看看,感覺不錯(cuò),不過一直沒看完
 

250萬本中文圖書簡(jiǎn)介、評(píng)論、評(píng)分,PDF格式免費(fèi)下載。 第一圖書網(wǎng) 手機(jī)版

京ICP備13047387號(hào)-7