Skip to content

Commit

Permalink
链接、装载与库内容总结输出
Browse files Browse the repository at this point in the history
  • Loading branch information
klc407073648 committed Sep 17, 2023
1 parent 04bbc09 commit 350d1e9
Show file tree
Hide file tree
Showing 18 changed files with 45 additions and 6 deletions.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
Loading
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
10 changes: 7 additions & 3 deletions md/book-note/linkersAndLoaders/linkersAndLoaders-chapter-1.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,11 +3,14 @@
[[toc]]

> 计算机硬件:中央处理器CPU、内存和I/O控制芯片。I/O控制器:协调I/O设备与总线之间的速度,也为了能够让CPU能够和I/O设备进行通信。
> 系统软件:平台性和程序开发。计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决。例如虚拟机技术也是在硬件和操作系统之间增加了一层虚拟层,使得一个计算机上可以同时运行多个操作系统。
> 操作系统:从早期的一个CPU运行一个程序 ———— 通过监控程序采用多道程序的方法,让一个程序无需使用CPU时,其他等待CPU资源的程序可以运行 ————
改进后,每个程序运行一段时间后都能主动让出CPU给其他程序(分时系统),存在问题(一个程序死循环导致其他程序得不到调用) ———— 引入多任务系统,所有应用程序都以进程方式运行,CPU采用抢占式即CPU在多个进程间快速切换,从而造成很多进程同时运行的假象。
> 操作系统:从早期的一个CPU运行一个程序 ———— 通过监控程序采用多道程序的方法,让一个程序无需使用CPU时,其他等待CPU资源的程序可以运行 ————改进后,每个程序运行一段时间后都能主动让出CPU给其他程序(分时系统),存在问题(一个程序死循环导致其他程序得不到调用) ———— 引入多任务系统,所有应用程序都以进程方式运行,CPU采用抢占式即CPU在多个进程间快速切换,从而造成很多进程同时运行的假象。
> 有限的物理内存分配给多个程序.
* 地址空间隔离:虚拟地址到物理地址的映射过程
* 地址空间隔离:虚拟地址到物理地址的映射过程
* 内存使用效率:
* 分段:
* 概念:将一段与程序所需内存空间大小的虚拟空间映射到某个地址空间
Expand All @@ -21,6 +24,7 @@
* 缺点:要求程序全部载入内存,没有足够的内存,程序不能执行。
* TODO:https://blog.csdn.net/qq_41885826/article/details/97368967
* 程序运行地址:虚拟地址到物理地址的映射过程。

> 多线程使用。

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,12 @@

[[toc]]

# 文章总结

![](/_images/book-note/linkersAndLoaders/内存.png)

# 程序环境

![](/_images/book-note/linkersAndLoaders/程序环境.png)

# 程序的内存布局
Expand Down Expand Up @@ -153,4 +159,4 @@ glibc的malloc函数处理机制:

* **对象池**:如果每一次分配的空间大小都一样,那么就可以按照这个每次请求分配的大小作为一个单位,把整个堆空间划分为大量的小块,每次请求的时候只需要找到一个小块就可以了。对象池的管理方法可以采用空闲链表,也可以采用位图,与它们的区别仅仅在于它假定了每次请求的都是一个固定的大小,因此实现起来很容易。

实际上很多现实应用中,堆的分配算法往往是**采取多种算法复合而成的**。比如对于glibc来说,它对于小于64字节的空间申请是采用类似于对象池的方法:而对于大于512字节的空间申请采用的是最佳适配算法:对于大于64字节而小于512字节的,它会根据情况采取上述方法中的最佳折中策略;对于人于128KB的申请,它会使用mmap机制直接向操作系统申请空间。
实际上很多现实应用中,堆的分配算法往往是**采取多种算法复合而成的**。比如对于glibc来说,它对于小于64字节的空间申请是采用类似于对象池的方法:而对于大于512字节的空间申请采用的是最佳适配算法:对于大于64字节而小于512字节的,它会根据情况采取上述方法中的最佳折中策略;对于大于128KB的申请,它会使用mmap机制直接向操作系统申请空间。
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@

[[toc]]

# 文章总结

![](/_images/book-note/linkersAndLoaders/运行库.png)

# 入口函数和程序初始化

典型程序的运行步骤:
Expand Down Expand Up @@ -45,7 +49,7 @@ MSVC CRT入口函数(MSVC CRT全名Microsoft Visual C++ C Runtime,是Windows下

IO(或I/O)的个称是Input/Output,即输入和输出。对于计算机来说,I/O代表了计算与外界的交互,交互的对象可以是人或其他设备。

对于程序来说,I/O涵盖的范围还要宽广一些。一个程序的I/O指代了程序与外界的交互,包括文件、管道、网络、命令行、信号等。更广义地讲,I/O指代任何操作系统理解为“文件"的事务。许多操作系统,包括Linux和Windows,都将各种具有输入和输出概念的实体一一一包括设备、磁盘文件、命令行等一一统称为文件,因此这里所说的文件是一个广义的概念。
对于程序来说,I/O涵盖的范围还要宽广一些。一个程序的I/O指代了程序与外界的交互,包括文件、管道、网络、命令行、信号等。更广义地讲,I/O指代任何操作系统理解为“文件"的事物。许多操作系统,包括Linux和Windows,都将各种具有输入和输出概念的实体一一一包括设备、磁盘文件、命令行等一一统称为文件,因此这里所说的文件是一个广义的概念。

在操作系统层面上,文件操作也有类似于FILE的一个概念,在Linux里,这叫做文件描述符(File Descriptor),而在Windows里,叫做句柄(Handle))。**用户通过某个函数打开文件以获得句枘,此后用户操纵文件皆通过该句柄进行。**

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@

[[toc]]

# 文章总结

![](/_images/book-note/linkersAndLoaders/系统调用与API.png)

# 系统调用介绍

每个操作系统都会提供一套接口,以供应用程序使用。这些接口往往通过中断来实现,比如Linux使用0x80号中断作为系统调用的入口,Windows采用0x2E号中断作为系统调用入口。
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@

[[toc]]

# 文章总结

![](/_images/book-note/linkersAndLoaders/运行库实现.png)

# C语言运行库

在开始实现MiniCRT之前,首先要对它进行基本的规划。“麻雀虽小五脏俱全”,虽MiniCRT很小,但它应该具备CRT的基本功能以及遵循几个基本设计原则,这些我们归结为如下几个方曲:
Expand Down
3 changes: 3 additions & 0 deletions md/book-note/linkersAndLoaders/linkersAndLoaders-chapter-2.md
Original file line number Diff line number Diff line change
Expand Up @@ -3,8 +3,11 @@
[[toc]]

> 预处理(预编译): 处理那些源代码文件中的以“#”开始的预编译指令。
> 编译:扫描、语法分析、语义分析、源代码优化、代码生成和目标代码优化,生成汇编代码。
> 汇编:将汇编代码转变成机器可以执行的指令。
> 链接:将各个模块之间相互引用的部分都处理好,使得各个模块之间能够正确地衔接。即把一些指令对其他符号地址的引用加以修正。
# 概述
Expand Down
2 changes: 2 additions & 0 deletions md/book-note/linkersAndLoaders/linkersAndLoaders-chapter-3.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,8 @@

[[toc]]

# 文章总结

![](/_images/book-note/linkersAndLoaders/目标文件里有什么.png)

# 概述
Expand Down
4 changes: 4 additions & 0 deletions md/book-note/linkersAndLoaders/linkersAndLoaders-chapter-4.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@

[[toc]]

# 文章总结

![](/_images/book-note/linkersAndLoaders/静态链接.png)

# 概述

使用下面这两个源代码文件“a.c”和“b.c”作为例子展开分析:
Expand Down
4 changes: 4 additions & 0 deletions md/book-note/linkersAndLoaders/linkersAndLoaders-chapter-7.md
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@

[[toc]]

# 文章总结

![](/_images/book-note/linkersAndLoaders/动态链接.png)

# 为什么需要动态链接

静态链接存在的问题:**浪费内存和磁盘空间、模块更新困难**
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,10 @@

[[toc]]

# 文章总结

![](/_images/book-note/linkersAndLoaders/共享库版本.png)

# 共享库版本

## 共享库兼容性
Expand Down Expand Up @@ -51,7 +55,7 @@ Linux有一套规则来命名系统中的每一个共享库,它规定共享库

Linux下的Glibc从版本2.1之后开始支持一种叫做基于符号的版本机制(Symbol Versioning)的方案。这个方案的基本思路是让每个导出和导入的符号都有一个相关联的版本号,它的实际做法类似于名称修饰的方法。

Linux系统下共享库的符号版本机制并没有被广泛应用,主要使用共享库符号版本机制的是Glibc软件包中所提供的20多个共享库。目前2.6的Glibc中的C语言运行库lib-2.6.1.so来说,它的符号版本演化如下:
Linux系统下共享库的符号版本机制并没有被广泛应用,主要使用共享库符号版本机制的是Glibc软件包中所提供的20多个共享库。目前2.6的Glibc中的C语言运行库libc-2.6.1.so来说,它的符号版本演化如下:

GLIBC_2.0、GLIBC_2.1、GLIBC_2.1.1、GLIBC_2.1.2、GLIBC_2.1.3、GLIBC_2.2、GLIBC_2.2.1 ...

Expand Down

0 comments on commit 350d1e9

Please sign in to comment.