程序员的自我修养

俞甲子

出版时间

2009-03-31

ISBN

9787121085116

评分

★★★★★

标签

编程

书籍介绍
多数人学编程,学的是如何把代码写出来;这本书偏偏追问代码写完之后发生了什么。它把目光投向编译、链接、装载这些被日常开发刻意忽略的环节,去解释一个程序究竟是如何从一堆文本变成内存里真正跑起来的东西。书里那些被反复提及的细节——动态链接器自举时为何不能调用函数、为何要绕开全局变量、符号介入为何逼着编译器把内部调用改成外部调用——正是它区别于泛泛而谈的编译原理书之处:它不满足于告诉你'是什么',而是逼你理解'为什么只能这样'。有读者坦言,读懂它靠的是第二遍顺着作者东奔西跑的思路重走一遍。它适合那些被'该死的编译模型'困扰多年、愿意花力气把底层机制真正打通的人,而不适合寻求速成的读者。
AI导读
核心看点
  • 深入剖析编译、链接、装载全过程
  • 详解ELF与PE文件格式及动态链接
  • 提供MiniCRT源码展示运行库原理
读者共识
  • 填补国内系统底层知识书籍空白
  • 行文思路清晰,适合初学者入门
  • 虽有小瑕疵,但仍是经典必读之作
精彩摘录
  • "可以使用volatile关键字来试图阻止过度优化,volatile基本可以做到两件事情: 1、阻止编译器为了提高速度将一个变量缓存到寄存器内而不写回。 2、阻止编译器调整操作volatile变量的指令顺序。"
  • "实际上在动态链接器的自举代码中,除了不可以使用全局变量和静态变量之外,甚至不能调用函数,即动态链接器本身的函数也不能调用。这是为什么呢?其实我们在前面分析地址无关代码时已经提到过,实际上使用PIC模式编译的共享对象,对于模块内部的函数调用也是采用外部函数调用一样的方式,即使用GOT/PLT的方式,所以在GOT/PLT没有被重定位之前,自举代码不可以使用任何全局变量,也不可以调用函数。"
  • "这样看起来第一个模块内部调用或跳转很容易解决,但实际上这种方式还有一定的问题,这里存在一个名作共享对象“全局符号介入”问题。"
  • "所以对于bar()函数的调用,编译器只能选择第三种,即当作模块的外部符号处理。 ... 即使用static关键字定义bar函数,这种情况下,编译器要确定bar()函数不会其他模块覆盖,就可以使用第一类的方法,即模块内部调用指令。"
  • "由于可能存在的全局符号介入的问题,foo函数对于bar的调用不能够采用第一类模块调用的方法,因为一旦bar函数由于全局符号介入被其他模块中的同名函数覆盖,那么foo如果采用相对地址调用的话,那么这个相对地址就需要重定位,这由于共享对象的地址无关性矛盾。所以对于bar()函数的调用,编译器只能选择第三种,即当作模块外部符号处理。"
  • "程序源代码被编译以后主要分成两种段:程序指令和程序数据。代码段属于程序指令,而数据段和.bss段属于程序数据。"
  • "1:当程序被装载后,数据和指令分别被映射到两个虚存区域。由于数据区域对于进程来说是可读写的,而指令区域对于进程来说是只读的,所以这两个虚存区域的权限可以被分别设置成可读写和只读。这样可以防止程序的指令被有意或无意地改写。 2:对于现代的CPU来说,它们有着极为强大的缓存体系。由于缓存在现代的计算机中地位非常重要,所以程序必须尽量提高缓存的命中率。指令区和数据区的分离有利于提高程序的局部性。现代CPU的缓存一般都被设计成数据缓存和指令缓存分离,所以程序的指令和数据被分开存放对CPU的缓存命中率提高有好处。 3:最重要的原因。 当系统中运行着多个该程序的副本时,它们的指令都是一样的,内存中只需保存"
  • "其中: 第一列是VMA的地址范围 第二列是VMA的权限,r代表可读,w代表可写,x代表可执行,p代表私有,s代表共享 第三列是偏移,表示VMA对应的Segment在映像文件中的偏移 第四列是映像文件所在设备的主设备号和次设备号 第五列是映像文件的节点号 最后一列是映像文件的路径"
目录
第1部分 简介
第1章 温故而知新
1.1 从HELLO WORLD 说起
1.2 万变不离其宗
1.3 站得高,望得远

显示全部
用户评论
: TP31/8261
浑沦吞枣似地扫了一遍,,,讲解的很好,如果想要理解计算机的底层链接装载包括main之前系统干了些什么事儿,这本书真的很不错。
书名太233
好书
就国内出版的书而言中上吧,如果有系统编程相关经验的话内容其实也只能算是扫盲级别的。书中错误其实还是蛮多的,严重的原则性错误大概有那么一两处,不碍事的小瑕疵基本散布在各个章节(后面重复出现EBP加加减减傻傻分不清楚我都快orz了...),还好基本不妨碍阅读所以也懒得写到笔记上,自己看的时候注意下就好了....
借地标拥有福气《驱魔人的自我修养》。高开低走,开头几个副本巴士、女巫写得不错,游刃有余,灵异老题材也整了点新意出来,但我不喜欢把叙述视角转到配角上去。可惜干完女巫以后就开始没有骨架了,副本没有精干,像是没有大纲权靠脑子里的拼图凑剧情凑出来的,有点可惜。
书写得很不错!通俗易懂,满足了我的好奇心!
快速阅读,理解结构框架,类似龙书
把计算机的很多原理解释的非常清楚,强烈推荐
这本书读的还是挺有收获的 作者很用心 (若干年前读的 竟然没标记
下载
收藏