首页 > 编程知识 正文

相对地址是逻辑地址吗,逻辑地址和物理地址的计算

时间:2023-05-03 23:07:37 阅读:155645 作者:4333

在内存管理中,逻辑地址是一个比较难理解的概念。 因为逻辑地址是逻辑(思想上、空间上)的概念,不是物理上存在的,所以很难想象逻辑地址是什么样的。

理解逻辑地址时,如果一个操作系统最多支持64个进程,每个进程的线性地址空间为4g(32位CPU的地址范围),那么总共需要4G*64内存,这么大的内存在哪里我曾经怀疑过。

现在,当我描述这种混乱时,CPU以时分方式处理,并且当将时间片分配给具有时间片的进程时,该进程的4G线性存储器空间被“激活”,并且CPU读取程序的逻辑地址,并且逻辑地址是段将时间片分配给下一个进程时,将保存上一个进程的执行环境。

这样可以减少多任务系统环境中物理内存不足的问题,物理内存只存储当前需要的数据和经常使用的数据,其他数据存储在硬盘上并根据需要加载。

程序运行的过程是指CPU取指、取数据、执行指令、保存结果的过程; 在这个过程中,CPU读取的地址都是逻辑地址。

程序的逻辑地址是从哪里来的呢? 编译时? 加载时? 运行时?

编译完成后,动态库、全局变量、静态变量和函数的逻辑地址“基本上”是固定的。 (编译时不会分配内存,但会根据声明时的类型进行占位符。 )

查看*.map文件,解析a.out文件得到逻辑地址,与gdb调试时比较,编译的逻辑地址和运行时的逻辑地址一致。

*.map文件编译结果: g *.cpp -Wl、-Map、*.map

a.out文件: objdump -D a.out | less

实际编译的逻辑地址由两部分组成:段选择器和段偏移地址。 可以在段选择器表中找到段基地址。 段基地址段偏移地址=线性地址。

另一方面,在Linux上,因为段基地址全部为0,所以得出逻辑地址=段偏移地址=线性地址的结论。

下图摘录于《Linux内核完全注释》,用于说明Linux的内存地址转换过程。

局部变量、堆存储器的逻辑地址在运行时决定。

在以下示例中,您将看到在运行时分配了局部变量内存的逻辑地址。

# include stdio.h # include stdlib.hvoid f1 ({ static inti=0; I; if(10==I )返回; int*p=(int* ) malloc (sizeof ) int ); printf(p==%x(n ),p ); //p是堆内存的地址同时也是局部变量,由于内存没有被释放,每次运行都会分配新的内存,所以p在这里每个输出都不一样f1 (); }void f2 () { static int i=0; I; if(10==I )返回; int*P2=(int* ) malloc ) sizeof(int ); printf(p==%x(n ),p2 ); //p输出值相同的free(p2 ); f2 (); (}int main ) ) F1); //f2 ); 返回1; }

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。