【php精品源码栏目提醒】:网学会员在php精品源码频道为大家收集整理了“程序员自我修养-链接、装载、库 - 其它资料“提供大家参考,希望对大家有所帮助!
1、基本知识,计算机硬件的发展简史。
对于程序员来说,撇开计算机硬件中纷杂的设备,关键的有三部分。
分别是: 中央处理器 CPU、内存、I/O 控制芯片 作为普通开发者程序员来说,除了关心 CPU,其他硬件细节基本不用关心, 有些高级语言连 CPU 都不用关心。
早期的 CPU,频率不是很高,和内存一样,它们都是连在同一个总线 BUS 上,由于早期 IO 设备,如:键盘、显示终端大都是只能是显示字符的终端, 没有很复杂的图形设备等,为了协调 IO 和 CPU 的速度,也为了 CPU 和 IO 之间能进行通信,一般每个设备都会有一个相应 IO 控制器。
如图: 后来,由于 CPU 速率上升,导致内存跟不上 CPU 频率,,于是产生了与内 存频率一致的系统总线。
而 CPU 采用倍频的方式和内存通信。
接着随着图形化操作系统普及,特别是 3D 游戏与多媒体发展,使得图形芯 片要和 CPU 和内存之间进行大量的交换数据,慢速的 IO 总线已经无法满足 图形设备的巨大需求。
为了协调协调 CPU、内存、高速图形设备,人们专门 设计了高速的北桥芯片,以便他们之间能够高速的交换数据。
由于北桥芯片运行速度非常高,所有设备都接上北桥芯片,北桥芯片既要处 理高速设备,又要处理低速设备,设计将会非常复杂,于是人们又专门设计 了处理低速设备的南桥芯片。
磁盘、USB、键盘等都接到南桥芯片上,由南 桥将他们汇总后连接到北桥上。
20 世纪 90 年代出,PC 机在系统总线上采用的是 PCI 结构,在低速设备上采 用的 ISA 结构,采用 PCI/ISA 结构南北桥设计的硬件结构如下图: 后续 CPU 主频不断倍增,直到瓶颈,人们开始考虑增加 CPU 的数量,来提 高运行效率。
2、SMP:对称多处理(SymmetricalMulti-Processing)简单的讲,每个 CPU 在 系统中的地位和发挥的功能都是一样的是相互对称的。
3、多核处理器(Multi-coreProcessor):将多个处理器“合并打包出售”,这 些处理器之间共享比较昂贵的缓存部件,只保留多个核心,并且以一个处理 器的外包装进行出售。
实际就是 SMP 的简化版。
4、“Anyprobem in computer science can be solved by another layer of indirection” “计算机科学领域的任何问题都可以通过增加一个间接地中间层来解决”5、计算机软件结构体系,各种软件的位置图:6、API(ApplicationProgramming Interface):应用程序编程接口; 系统调用接口:System call Interface 软件中断:Software Interrupt 硬件规格:Hardware Specification 多道程序:Multiprogramming 分时系统:Time-Sharing System 多任务系统:Multi-tasking 抢占式:Preemptive7、内存页:页的大小可以为 4K 或者 4M虚拟页:VP(Virtual Page)物理页:PP(Physical Page) 磁盘页:DP(Disk Page) 页错误:Page Fault8、虚拟存储的实现需要依靠硬件支持,对于不同的 CPU 来说是不同的,但几 乎所有硬件都采用 MMU(MemoryManagement Unit)部件来进行页映射, 如下图:9、线程:Thread,也称为轻量级进程 LWP(LightweightProcess),是程序执行 流的最小单元。
一个标准的线程由线程 ID,当前指令指针 PC,寄存器集合 和堆栈组成。
10、进程线程关系图11、一个在处理器上不断切换不同线程的行为,叫线程调度 (ThreadSchedule),线程调度的状态有三种 运行(running):此时线程正在执行 就绪(ready):此时线程可以立即执行,但 CPU 被占用。
等待(waiting):此时线程在等待某一个时间(通常是 I/O 或者同步)发生, 无法执行。
12、时间片:TimeSlice13、我们一般把频繁等待的线程称为 IO 密集型线程(IOBound Thread);把很 少等待的线程称为 CPU 密集型线程(CPUBound Thread); IO 密集型总是比 CPU 密集型先得到线程优先级提升。
优先级条件下,线程 存在饿死(Starvation)的现象,如果一个线程优先级较低,它可能永远都 得不到执行,因此调度系统会根据等待时间提升优先级。
优先级调度下,线 程的优先级改变一般有三种方式: 用户指定优先级; 根据进入等待状态的频繁程度提升或者降低优先级; 长时间得不到执行而被提升优先级。
14、静态编译 使用 GCC 编译一个程序一般分为 4 个阶段: 预处理Prepressing、编译(Complication)、汇编(Assembly)、链接 (Linking) GCC 编译过程图: 15、编译过程主要分为 6 步:扫描、词法分析、语义分析、源代码优化、代码生 成、目标代码优化,如下图所示:16、将一张图片 460CA391SSB.jpg 插入到 1.o 文件中,生成一个段,必要的时候在外面定义图片的变量如:_binary_460CA391SSB_jpg_start(图片在内存中的起始地址),_binary_460CA391SSB_jpg_end(图片在内存中的结束地址)_binary_460CA391SSB_jpg_size(图片在内存中的大小)就是可以使用,如果是一个可执行程序段,就会调用该可执行程序:objcopy -I binary -O elf32-i386 -B i386 460CA391SSB.jpg 1.o17、:objdump -ht 1.o 查看 1.o 中的内容Sections:Idx Name Size VMA LMA File off Algn0 .data 00012e8f 00000000 00000000 00000034 20CONTENTS ALLOC LOAD DATASYMBOL TABLE:00000000 l d .data 00000000 .data00000000 g .data 00000000 _binary_460CA391SSB_jpg_start00012e8f g .data 00000000 _binary_460CA391SSB_jpg_end00012e8f g ABS 00000000 _binary_460CA391SSB_jpg_size18、如果需要指定变量所处的段,使用_attribute_sectionquotnamequot就可以把相应的变量存放到指定段名为 name 的区域,如:_attribute_sectionquottestdquot int ggval43;19、查看目标文件的文件头:readelf -h 1.oELF Header:Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00Class: ELF32Data: 2s complement little endianVersion: 1 currentOS/ABI: UNIX - System VABI Version: 0Type: REL Relocatable fileMachine: Intel 80386Version: 0x1Entry point address: 0x0Start of program headers: 0 bytes into fileStart of section headers: 77540 bytes into fileFlags: 0x0Size of this header: 52 bytesSize of program headers: 0 bytesNumber of program headers: 0Size of section headers: 40 bytesNumber of section headers: 5Section header string table index: 2ELF 文件头 Magic 的这 16 个字节用来表示 ELF 文件的平台属性,如下:字节序 主板本号 后面这 9 位 ELF 未定义,一般为 0,也有用来进行扩展表示7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00ASII 码里 DEL 控制符 字符‘E’ 字符‘L’ 字符‘L’ 表示是 32 位02表示是 64 位20、a.out 可执行文件的 Magic 魔方数为 01 07,为什么呢?主要是历史原因,因为 unix 早年是在 PDP 小型机上诞生的,当时的系统加载可执行文件后从第一个字节开始执行,人们一般在文件的最开始放置一条 jmp 指令,这条跳转指令跳过 7 个字节的文件头到真正的可执行文件入口,而 0x01 0x07 就是当时 PDP-11 的机器跳转 7 个机器字的跳转指令。
为了以前系统保持兼容,这条跳转指令被当作魔方保存到现在。
21、readelf -S(S 大写) 1.o 查看 elf 文件中所有的段执行此命令前:objcopy -I binary -O elf32-i386 -B i386 460CA391SSB.jpg 1.o命令行:readel
上一篇:
程序员笔记
下一篇:
高等数学课程复习资料