深入理解计算机原理
Warekiller
这个作者很懒,什么都没留下…
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
深入理解计算机系统 第二部分 在系统上运行的程序
继续我们对计算机系统的探索,进一步来看看构建和运行应用程序的系统软件,链接器把程序的各个部分联合成一个文件,处理器可以将这个文件加载到内存,并且执行它。现代操作系统与硬件合作,为每个程序提供一种幻象,好像这个程序是在独占地使用处理器和主存。而实际上,在任何时刻,系统上都有多个程序在运行。...原创 2018-09-01 00:34:37 · 273 阅读 · 0 评论 -
DNS
#include "csapp.h"/*Internet address structure*/struct in_addr{ unsigned int s_addr; /* Network byte order(big-endian)*/}/* DNS host entry structure */struct hostent{ char *h_name; /*Official d...翻译 2019-04-23 11:36:07 · 191 阅读 · 0 评论 -
虚拟内存
虚拟内存诞生的原因:在系统中运行的进程共享CPU和主存资源,当运行的进程太多,有限的主存资源和过多的主存需求就会造成矛盾,会存在饱和值。造成一些进程无法正常工作,而且内存还很容易出错,当一个进程在另一个进程的存储空间中写入内容时,会造成不可知的错误。为了更好的管理内存资源,虚拟内存必须为每个进程提供一个大的(确保进程可以顺利的运行),一致的(我们应该对需要进行运行的进程一视同仁)和私有的(确保...原创 2018-09-30 10:40:29 · 1115 阅读 · 0 评论 -
链接器的由来
原始的链接器概念早在高级编程语言出现之前就已经存在了最早的程序员 用机器语言编写程序,并记录在纸带或卡片上原创 2018-09-12 23:48:09 · 256 阅读 · 0 评论 -
可执行文件生成过程概述
预处理预处理命令-$gcc -E hello.c -o hello.i-$cpp hello.c > hello.i处理源文件中以“#”开头的预编译指令,包括:删除“#define”并展开所定义的宏处理所有条件预编译指令,如:“#if”,“#ifdef”,”endif”等插入头文件到“#include”处,可以递归方式进行处理删除所有的注释“//”和“/*...原创 2018-09-12 22:22:52 · 1925 阅读 · 0 评论 -
7.6 符号解析
链接器解析符号引用的方法是将每个引用与它输入的可重定位目标文件的符号表的一个确定的符号定义关联起来。对那些和引用定义在相同模块中的局部符号的引用,符号解析是非常简单明了的。编译器只允许每个模块中每个局部符号有一个定义,静态局部变量也会有本地链接器符号,编译器还要确保它们拥有唯一的名字。、 不过,对全局符号的引用解析就棘手得多。...原创 2018-09-12 19:12:18 · 238 阅读 · 0 评论 -
7.4 可重定位目标文件
下图展示了一个典型的ELF可重定位目标文件的格式。ELF头(ELF Header)以一个16字节的序列开始,这个序列描述了生成该文件的系统的字的大小和字节顺序,ELF头剩下的部分包含帮助链接器语法分析和解释目标文件的信息。其中包括ELF头的大小,目标文件的类型(如可重定位,可执行性,或者共享的),机器类型(如x86-64),节头部表(section header table)的文件偏移,以及节头部...原创 2018-09-06 19:54:25 · 738 阅读 · 0 评论 -
三类目标文件
可重定位目标文件 -其代码和数据可和其他可重定位文件合并为可执行文件 . 每个.o文件由对应的.c文件生成 . 每个.o文件代码和数据地址都从0开始可执行目标文件 -包含的代码和数据可以被直接复制到内存中并执行 -代码和数据地址为虚拟地址空间中的地址共享的目标文件 -特殊的可重定位目标文件,能在装入或运行时被装入到内存并自动被链接,称为共享库文件。...原创 2018-09-16 15:07:59 · 499 阅读 · 0 评论 -
链接过程的本质
链接的本质三类目标文件目标文件中目标代码举例目标文件的格式标准ELF标准格式的两种视图//一个C语言程序举例---------------------------main.c-----------------------------int buf[2] = {1,2}; //全局变量void swap();int main(){ swap(); ret...原创 2018-09-16 11:20:47 · 410 阅读 · 0 评论 -
7.3 目标文件
目标文件与三种形式:可重定位目标文件。包含二进制代码和数据,其形式可以在编译时和其他可重定位目标文件合并起来,创建一个可执行目标文件可执行目标文件。包含二进制程序代码和数据,其形式可以被直接复制到内存并执行。共享目标文件。一种特殊类型的可重定位目标文件,可以在加载或者运行时被动态的加载进内存并链接。编译器和汇编器生成可重定位目标文件(包括共享目标文件)。链接器生成可执行目标文件。从技...原创 2018-09-03 19:00:16 · 187 阅读 · 0 评论 -
7.2 静态链接
像Linux LD程序这样的静态链接器(static linker)以一组可重定位目标文件和命令行参数作为输入,生成一个完全链接的,可以加载和运行的可执行目标文件作为输出。输入的可重定位目标文件由各种不同的代码和数据节(section)组成,每一节都是一个连续的字节序列。指令在一节中,初始化了的全局变量在另一节中,而未初始化的变量又在另外一节中。 为了构造可执行文件,链接器必须完成两个主...原创 2018-09-03 18:44:16 · 156 阅读 · 0 评论 -
7.1 编译器驱动程序
考虑下面的C语言程序,他将作为贯穿本章的一个小的运行示例,帮助我们说明关于链接器是如何工作的一些重要知识点。----------------------------code/link/main.cint sum(int *a, int n);int array[2] = {1,2};int main(){ int val = sum(array,2); return...原创 2018-09-03 08:22:00 · 828 阅读 · 0 评论 -
7.5 符号和符号表
每个可重定位目标模m都有一个符号表,它包含m定义和引用的符号的信息。在链接器的上下文中,有三种不同的符号:由模块m定义并能被其他模块引用的全局符号。全局链接器符号对应于非静态的C函数和全局变量;由其它模块定义并被模块M引用的全局符号。这些符号称为外部符号,对应于在其他模块中对应的非静态C函数和全局变量。只被模块m定义和引用的局部符号。他们对应于带static属性的C函数和全局变量。这些符...原创 2018-09-07 22:04:05 · 1349 阅读 · 0 评论 -
3.7.1 运行时栈
C语言过程调用机制的一个关键特性(大多数其他语言也是如此)在于使用了栈数据结构提供的后进先出的内存管理原则。在过程P调用过程Q的例子中,可以看到当Q在执行时,P以及所有在向上追溯到P的调用链中的过程,都是暂时被挂起的。当Q运行时,他只需要为局部变量分配新的存储空间,或者设置到另一个过程的调用。另一方面,当Q返回时,任何它所分配的布局变量存储空间都可以被释放。因此,程序可以用栈来管理它的过程所需要的...原创 2018-09-04 22:39:59 · 1769 阅读 · 1 评论 -
3.7 过程
过程是软件中一种很重要的抽象。它提供了一种封装代码的方式,用一组指定的参数和一个可选的返回值实现了某种功能。然后,可以在程序中不同的地方调用这个函数。设计良好的软件用过程作为抽象机制,隐藏某个行为的具体实现,同时有提供清晰简洁的接口定义,说明要计算的是哪些值,过程会对程序状态产生什么样的影响。不同编程语言中,过程的形式多样:函数(function),方法(method),子例程(subroutin...原创 2018-09-04 21:37:06 · 294 阅读 · 0 评论 -
链接
链接(linking)是将各种代码和数据片段收集和组合成为一个单一文件的过程,这个文件可被加载(复制)到内存并执行。链接可以执行于编译时(compile time),也就是在源代码被翻译成机器代码时;也可以执行于加载时(load time),也就是在程序被加载器(loader)加载到内存并执行时;甚至执行于运行时(run time),也就是由应用程序来执行。在早期的计算机系统中,链接时手动执行的。...原创 2018-09-01 00:51:14 · 160 阅读 · 0 评论 -
套接字接口
套接字接口(socket interface)是一组函数,他们和Unix I/O函数结合起来,用于创建网络应用。大多数现代系统上都实现套接字接口,包括所有的Unix变种,Windows和Macintosh系统。从Unix内核的角度来看,一个套接字就是通信的一个端点。从Unix程序的角度来看,套接字就是一个有相应描述符的打开文件。因特网的套接字地址存放在如下代码所示的类型为sockaddr_i...原创 2019-04-23 12:19:06 · 1954 阅读 · 0 评论
分享