我正在阅读有关流程的内容。我遇到了一个主题“如何创建流程”,其中我遇到了以下问题:-
内核所看到的进程映像在其自己的空间中运行user address space
——一个不受其他用户干扰的受保护空间。该地址空间有多个段:-
A。文本段
B.数据段
C.用户细分
我还是不明白这是什么意思,请有人就这个话题启发我。
答案1
Linux 或 unix 进程的内存 (RAM) 只是一个线性字节数组。每个字节都有一个数字,从 0 到某个最大值。这就是进程的“地址空间”。地址空间的大小取决于它是 32 位还是 64 位 CPU,但内存中的任何字节都可以根据该字节的地址进行读取或写入,该地址只是一个数字。
一个进程有不同的部分,比如可执行代码、它所使用的数据,以及可执行代码进行的函数调用的后进先出激活记录堆栈。这些是片段。一块地址空间专用于可执行代码,即“代码段”。地址空间的另一块被分配给初始化变量(通常是全局变量),这可能是数据段,尽管它通常被命名为“数据段”。这 ”BSS段" 通常存在于未初始化的变量中,并且通常您可以增长该段。函数激活记录的 LIFO 堆栈通常不会显式显示。
进程地址空间的其他一些部分可以专门用于动态加载库、C++ 构造函数或析构函数、动态链接器代码等,这可能会变得非常复杂。
然后是可执行文件格式的问题。大多数 Linux 或 Unix 进程都有一个“ELF”文件格式,尽管 Mac 使用 Mach-O 格式。许多进程的初始地址空间都有相应的可执行文件片段。
我认为这个网页将使您了解什么填充了进程的地址空间。尽量记住“地址”是一个数字,基本上只是命名内存中的一个字节。一些作者还将执行过程与其磁盘上的文件混淆,因此在思考或阅读时尽量保持清晰。
就地址空间的用途而言……每个正在运行的进程都存在一个用户地址空间。这可以防止一个进程写入另一个进程的数据并导致第二个进程崩溃。也就是说,地址空间用于防止有错误的程序破坏其他程序。此外,地址空间段相互处理数据,允许一个用户的程序在内存中保存您不希望其他用户看到的信息。地址空间允许您控制对内存中数据的访问。