`
envy2002
  • 浏览: 153853 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

关于linux程序在内存中的分布管理

阅读更多

 

 

 

 

这段时间,一直在看汇编,想学习一下linux内核,但是看着看着,感觉汇编操作底层,虽然能力很大,但是不好管理。假如有这个代码 mov ax, [msg+1234h]-->把ds*16+msg+1234h内存里面的东西移动到ax寄存器中,msg表示这段程序的起始地址,但是当我们把这个程序编译连接好后,那么这段代码可能是 mov ax, [2234h]。当我们把这段代码整体平移到0000h起始的地方,这段代码能一定执行吗,不一定吧,有可能报错的。

 

 

比如,把二进制代码从紫色部位,移动到绿色部位,移动后这个代码可能不worK的。因为你的本意是移动相对那个位置的内存内容到AX寄存器中,(比如紫色从左往右数的第2个到AX中)但是编译连接,整体移动后,你却还是移动那个位置的内容(正确的是移动绿色第2个),那怎么解决这个问题呢?

 

这就是连接器的作用了,比如现在有3个程序片段,编译之后都是编号地址都是随机分布的,或相交,或分离。(这里可能说的不正确,只是打个比方)。但是连接的作用就不同了,连接器会分析,分析的范围是整体的。比如你要链接1,2,3三个片段,那么他们的链接效果如下:

 

 

连接器会把三个文件作一个整体性的排序(或者安排吧),实地址替换里面的符号。

 

如果只链接两个呢,那么可能结果如下。

 

 

或者是这样

 

当然了,这只是我的猜测,不一定正确。

 

再说说多道程序,现在有三个程序,从头到尾都是汇编编写,每个程序有若干片段,如果三个程序都链接好了之后,那么假设他们都从地址0h开始加载,那不就又冲突了吗,实模式可没有那么好的内存管理啊。这好像就是保护模式了。

 

如图:

 

有三个程序,每个程序执行的时候,会给每个程序一个选择子,来选择一段内存,加入都从0h地址开始执行,但是A程序是0h,B 程序是10000H开始,C是20000H开始,即使A,B,C的汇编代码一样,但是进入保护模式,CPU会根据每个程序用一种特殊的方法来寻址。(当然这些分段内存是足够大的),这样这些程序加载就不会冲突了,也保证能够正确执行。这些对实模式的汇编指令都是透明的,开启一个开关,寻址的空间发生了变化,这些指令全然不知,呵呵

 

当然,这些都是我的猜测。

 

 

 

 

分享到:
评论

相关推荐

    Linux操作系统内存管理.pdf

    Linux操作系统的内存管理机制旨在解决进程需要使用的代码和数据都放在内存中,比放在外存中要快很多的问题。为了解决这个问题,Linux操作系统提出了虚拟内存的概念,使得每个进程用于3GB的独立用户内存空间和共享的...

    深入理解linux虚拟内存管理(中+英)

    Linux虚拟内存管理是操作系统设计中的核心部分,它允许程序访问比实际物理内存更大的地址空间,同时优化了内存的使用效率。这一系统通过映射技术,将进程的虚拟地址转换为实际物理地址,使得多个进程可以共享同一...

    linux内存管理结构图

    1. **节点(Node)**: 在Linux内存管理中,节点是指具有物理内存的处理器或系统板。每个节点对应一个物理内存条,可能包含多个内存区。节点的概念在多处理器系统中尤为重要,因为它允许系统并行处理内存请求。 2. **...

    Linux内存管理--Linux物理内存三级架构.pdf

    然而,在非一致性存储结构(NUMA)的系统中,内存分布并非均一,存在多个节点,节点之间的内存访问速度可能不同。Linux内核通过数据结构pg_data_t来表示内存节点。例如,ARM架构通常采用UMA结构,而NUMA结构常见于某些...

    linux内存管理

    在探讨Linux如何实现内存管理之前,我们首先需要理解Intel x86架构下的内存管理基础——分段与分页机制。 **分段机制**: - **段选择器**:包含16位的段选择器,其中包括13位的描述符索引、1位的GDT/LDT(全局描述...

    Linux虚拟内存管理

    下面是一个示例程序,用于展示32位和64位Linux系统中虚拟地址空间的分布情况: ```c #include #include #include #include int global_num = 0; char global_str_arr[65536] = {'a'}; int main(int argc, ...

    linux下内存数据库

    在Linux操作系统中,内存数据库是一种将数据存储在内存中,以提供快速访问和处理的数据管理方式。这种数据库系统不依赖磁盘I/O操作,因此在读写速度上有显著优势,特别适用于高性能、低延迟的应用场景。哈希表是内存...

    Linux程序设计_严冰.zip

    - 地址空间布局:了解堆、栈、数据段和代码段在进程内存中的分布。 5. **进程间通信(IPC)** - 管道(pipe)和有名管道(fifo):实现简单进程间的通信。 - 套接字(socket):支持网络通信,理解TCP/IP和UDP...

    嵌入式LINUX内存使用与性能优化

    - **物理内存**:嵌入式Linux系统中的物理内存是有限的,理解其分布和工作原理是优化的基础。通常包括RAM(随机存取存储器)和ROM(只读存储器)。 - **虚拟内存**:通过虚拟地址映射技术,使得程序可以访问超过...

    操作系统内存管理实验报告

    操作系统内存管理是计算机科学中的核心领域,特别是在Linux这样的操作系统中,理解内存的分配、管理和优化至关重要。本实验报告聚焦于在Red Hat 9环境下进行的内存管理实践,旨在深入理解内存分片、分配策略以及其对...

    linux系统存储管理

    分段管理则是在更高级别的逻辑组织,允许程序按照逻辑段(如代码、数据、堆栈)来组织内存,但现代Linux系统更多地依赖于页式管理。 3. **页表与页表项**:页表是虚拟内存到物理内存映射的关键数据结构,其中包含每...

    Linux内核内存管理解析.docx

    通过运行上述程序,我们可以观察到不同类型的内存区域是如何在内存中分布的。代码段包含程序的指令;数据段存储已初始化的全局变量;BSS段存储未初始化的全局变量;栈则用于存储函数调用过程中的局部变量;堆则用于...

    嵌入式Linux应用程序开发详解(完整版)

    这些章节可能会讲述ARM处理器的特性和如何在ARM平台上编译和运行Linux程序。 通过阅读这本书,读者不仅可以学习到Linux应用程序开发的基本技术,还能了解到如何在嵌入式系统中应用这些技术。无论是对Linux系统感...

    linux 内存管理

    在深入探讨Linux 0.11内核中的内存管理与地址空间映射之前,我们先来明确几个核心概念,这将有助于理解后续的详细说明。在计算机科学中,**内存管理**指的是操作系统如何控制和协调计算机硬件资源中的主存储器的分配...

    Linux的内存和IO访问技术

    在Linux系统中,内存管理涉及到了内存区域的分布,包括常规内存和高端内存的区别。在早期Linux内核中,常规内存是有限的,它的地址空间直接映射到物理内存。而高端内存是指那些不能直接映射到内核空间的内存区域,...

    linux内核学习笔记(2)——内存寻址

    在Linux操作系统中,内核是系统的核心,负责管理和调度计算机的资源。这篇“Linux内核学习笔记(2)——内存寻址”将深入探讨Linux内核如何管理内存以及内存寻址的基本原理。内存寻址是计算机科学中的核心概念,它...

    glibc内存管理ptmalloc源代码分析4.pdf

    虽然ptmalloc提供了强大的内存管理功能,但在使用过程中也需要注意一些事项,如避免内存泄漏、合理设置配置选项、处理好多线程环境下的并发访问等,以确保应用程序的稳定性和性能。 综上所述,glibc内存管理尤其是...

    linux-0.01源码带注释说明.zip

    这是Linux-0.01系统的源码,及其注释说明。压缩包包括了Linux最小系统的全部代码...比如,对于Linux启动代码可以顺着Linux启动顺序一步一步阅读,对于内存管理部分可以单独进行阅读。 (5)需要反复阅读,慢慢理解。

    Linux下的存储管理.pdf

    Linux 2.4内核的存储管理系统支持非均匀存储访问(NUMA)架构,并采用了基于区(ZONE)的物理内存管理策略,这使得系统能有效地处理内存分布,同时保持了逻辑上的统一性,适应了从桌面应用到高端服务器市场的广泛...

    linux_kernel_map.zip_linux_linux 内核_linux_kernel_map

    10. **物理内存分布**:图中可能还会显示物理内存的分布情况,如DRAM、SRAM等,以及如何通过物理地址空间映射到虚拟地址。 这张"linux_kernel_map.png"图对于理解Linux内核的内存管理和运行机制非常有帮助,尤其是...

Global site tag (gtag.js) - Google Analytics