《程序员的自我修养:链接、装载与库》-pdf,txt,mobi,kindle,epub电子版书免费下载

由于链接总是被和谐,需要本书电子版的朋友关注公众号:【奥丁读书小站】(njdy668),首页回复书名或者数字3569, 自动弹出下载地址.

副标题:链接、装载与库

内容简介:

对装载、链接和库进行了深入浅出的剖析,并且辅以大量的例子和图表,可以作为计算机软件专业和其他相关专业大学本科高年级学生深入学习系统软件的参考书。同时,还可作为各行业从事软件开发的工程师、研究人员以及其他对系统软件实现机制和技术感兴趣者的自学教材。

试读

1.1 从Hello World说起

毫无疑问,“Hello World”对于程序员来说肯定是如雷贯耳。就是这样一个简单的程序,带领了无数的人进入了程序的世界。简单的事物背后往往又蕴涵着复杂的机制,如果我们深入思考一个简单的“Hello World”程序,就会发现很多问题看似很简单,但实际上我们并没有一个非常清晰的思路;或者在我们脑海里有着模糊的印象,但真正到某些细节的时候可能又模糊不清了。比如对于C语言编写的Hello World程序:

#include <stdio.h>

int main()

{

printf(“Hello World\n”);

return 0;

}

对于下面这些问题,你的脑子里能够马上反应出一个很清晰又很明确的答案吗?

? 程序为什么要被编译器编译了之后才可以运行?

? 编译器在把C语言程序转换成可以执行的机器码的过程中做了什么,怎么做的?

? 最后编译出来的可执行文件里面是什么?除了机器码还有什么?它们怎么存放的,怎么组织的?

? #include <stdio.h>是什么意思?把stdio.h包含进来意味着什么?C语言库又是什么?它怎么实现的?

? 不同的编译器(Microsoft VC、GCC)和不同的硬件平台(x86、SPARC、MIPS、ARM),以及不同的操作系统(Windows、Linux、UNIX、Solaris),最终编译出来的结果一样吗?为什么?

? Hello World程序是怎么运行起来的?操作系统是怎么装载它的?它从哪儿开始执行,到哪儿结束?main函数之前发生了什么?main函数结束以后又发生了什么?

? 如果没有操作系统,Hello World可以运行吗?如果要在一台没有操作系统的机器上运行Hello World需要什么?应该怎么实现?

? printf是怎么实现的?它为什么可以有不定数量的参数?为什么它能够在终端上输出字符串?

? Hello World程序在运行时,它在内存中是什么样子的?

对于上面的问题,如果你确信能够非常清楚地了解里面的各个细节,并且对其中的过程和机制都了如指掌,那么很遗憾,这本书不是为你准备的;如果你发现对其中一些问题并不是很了解,甚至从来没有想到过一个Hello World还能引出这么多值得思考的问题,而你又想了解它们,那么恭喜你,这本书就是为你准备的。随着各个章节的逐步展开,我们会从最基本的编译、静态链接到操作系统如何装载程序、动态链接及运行库和标准库的实现,甚至一些操作系统的机制,力争深入浅出地将这些问题层层剥开,最终使得这些程序运行背后的机制形成一个非常清晰而流畅的脉络。

在开始进入庞大而又繁琐的系统软件之前,让我们先进行热身活动,那就是一起来回顾计算机系统的一些基本而又重要的概念。整个计算机系统回顾过程将分为两个部分,分别是硬件部分和软件部分。本书的主要目的不是介绍计算机系统结构,第1章的回顾只是巩固和总结计算机软硬件体系里面几个重要的概念,这些概念在我们后面的章节中将时时伴随着我们,失去了它们的支撑,后面的章节将会显得繁琐而又晦涩。如果你自认为这些基本概念很简单,那么你可以大概地浏览一遍几个知识点的标题,然后直接跳到第2章;反之,如果你觉得有些概念还不是很清楚,甚至从来没听说过这些概念,那么请你仔细阅读相关章节,相信这个过程对你阅读本书甚至对你深入了解计算机大有裨益。

1.2 万变不离其宗

计算机是个非常广泛的概念,大到占用数层楼的用于科学计算的超级计算机,小到手机上的嵌入式芯片都可以被称为计算机。虽然它们的外形、结构和性能都千差万别,但至少它们都有“计算”这个概念。在本书里面,我们将计算机的范围限定在最为流行、使用最广泛的PC机,更具体地讲是采用兼容x86指令集的32位CPU的个人计算机。原因很简单:因为笔者手上目前只有这种类型的计算机可供操作和实验,不过相信90%以上的读者也是,所以在这一点上我们很快能达成共识。其实选择具体哪种平台并不是最关键的,虽然各种平台的软硬件差别很多,但是本质上它们的基本概念和工作原理都是一样的,只要我们能够掌握一种平台上的技术,那么其他的平台都是大同小异的,很轻松地可以举一反三。所以我们相信,只有你能够深刻地理解x86平台下的系统软件背后的机理,当有一天你需要在MIPS指令集的嵌入式平台上做开发,或者需要为64位的Windows或Linux开发应用程序的时候,你很快就能找到它们之间的相通之处。

撇开计算机硬件中纷繁复杂的各种设备、芯片及外围接口等,站在软件开发者的角度看,我们只须抓住硬件的几个关键部件。对于系统程序开发者来说,计算机多如牛毛的硬件设备中,有三个部件最为关键,它们分别是中央处理器CPU、内存和I/O控制芯片,这三个部件几乎就是计算机的核心了;对于普通应用程序开发者来说,他们似乎除了要关心CPU以外,其他的硬件细节基本不用关心,对于一些高级平台的开发者来说(如Java、.NET或脚本语言开发者),连CPU都不需要关心,因为这些平台为它们提供了一个通用的抽象的计算机,他们只要关心这个抽象的计算机就可以了。

早期的计算机没有很复杂的图形功能,CPU的核心频率也不高,跟内存的频率一样,它们都是直接连接在同一个总线(Bus)上的。由于I/O设备诸如显示设备、键盘、软盘和磁盘等速度与CPU和内存相比还是慢很多,当时也没有复杂的图形设备,显示设备大多是只能输出字符的终端。为了协调I/O设备与总线之间的速度,也为了能够让CPU能够和I/O设备进行通信,一般每个设备都会有一个相应的I/O控制器。早期的计算机硬件结构如图1-1所示。

图1-1 早期的计算机硬件结构 …

后来由于CPU核心频率的提升,导致内存跟不上CPU的速度,于是产生了与内存频率一致的系统总线,而CPU采用倍频的方式与系统总线进行通信。接着随着图形化的操作系统普及,特别是3D游戏和多媒体的发展,使得图形芯片需要跟CPU和内存之间大量交换数据,慢速的I/O总线已经无法满足图形设备的巨大需求。为了协调CPU、内存和高速的图形设备,人们专门设计了一个高速的北桥芯片,以便它们之间能够高速地交换数据。

由于北桥运行的速度非常高,所有相对低速的设备如果全都直接连接在北桥上,北桥既须处理高速设备,又须处理低速设备,设计就会十分复杂。于是人们又设计了专门处理低速设备的南桥(Southbridge)芯片,磁盘、USB、键盘、鼠标等设备都连接在南桥上,由南桥将它们汇总后连接到北桥上。20世纪90年代的PC机在系统总线上采用的是PCI结构,而在低速设备上采用的ISA总线,采用PCI/ISA及南北桥设计的硬件构架如图1-2所示。

位于中间是连接所有高速芯片的北桥(Northbridge,PCI Bridge),它就像人的心脏,连接并驱动身体的各个部位;它的左边是CPU,负责所有的控制和运算,就像人的大脑。北桥还连接着几个高速部件,包括左边的内存和下面的PCI总线。

“《程序员的自我修养:链接、装载与库》-pdf,txt,mobi,kindle,epub电子版书免费下载”的2个回复

评论已关闭。