`
envy2002
  • 浏览: 149360 次
  • 性别: 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-0.01源码带注释说明.zip

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

    Linux内核阅读

    对于源代码的阅读,要想比较顺利,事先最好对源代码的知识背景有一定的了解。对于linux内核源代码来讲,我认为,基本要求是:1、...我们知道现代的操作系统一般由进程管理、内存管理、文件系统、驱动程序、网络等组成。

    边干边学Linux__第二版_doc格式

    9.9 Linux源程序的目录分布 9.10 学习Linux的常用工具 9.11 查看Linux内核状况 9.12 编程序检查系统状况 9.13 Linux编程环境 第10章 系统调用 10.1 一个简单的例子 10.2 系统调用基础知识 第11章 进程创建 11.1 进程...

    Linux内核工作原理 word版本 强烈推荐

    进程管理描叙了进程的概念以及Linux核心是如何创建、管理与删除系统中的进程。 进程间及进程与核心间通讯以协调它们的活动。Linux支持大量进程间通讯(IPC)机制。信号与管道是 其中的两种,Linux同时还支持系统V ...

    linux集群软件mosix

     由于MOSIX是在Linux的核心中实现的,因此它的操作对应用程序而言是完全透明的。可以用它来定义不同的集群类型,这些集群中的机器可以相同也可以不同。  与Turbocluster、Linux Virtual Server、Lsf等集群系统不同...

    Linux操作系统内核源码目录结构详解

    在阅读源码之前,还应知道Linux内核源码的...现代的操作系统一般由进程管理、内存管理、文件系统、驱动程序和网络等组成。Linux内核源码的各个目录大致与此相对应,本文将为大家介绍Linux操作系统内核源码目录结构。

    C语言嵌入式Linux编程第4期:堆栈管理

    本课程是《C语言嵌入式Linux编程》第4期主要内容包括: 1)程序运行过程中堆栈的内存分布2)栈初始化、大小、栈在函数调用和参数传递过程中的作用3)栈与作用域、栈对形参和实参的管理4)黑客栈溢出攻击原理及实践5...

    Linux设置虚拟内存的教学与实战教程

    它使得应用程序认为它拥有连续的可用的内存(一个连续完整的地址空间),而实际上,它通常是被分隔成多个物理内存碎片,还有部分暂时存储在外部磁盘存储器上,在需要时进行数据交换。 对于 C 语言里面的变量,我们...

    操作系统实验

    本设计的目的是通过请求页式存储管理中页面置换算法模拟设计,了解虚拟存储技术的特点,掌握请求页式存储管理的页面置换算法。要求: (1)通过随机数产生一个指令序列,共320条指令。指令的地址按下述原则生成: ①50...

    山东科技大学【操作系统实验】报告+全部源码(可运行)

    1.显示进程的虚拟内存地址空间分布信息 2.获取一个进程的虚拟存储区域信息 3.计算vma每个vma区域的大小,以及代码段和数据段的大小. 实验五:proc文件系统及查看进程信息 请读者自己完成一个类似cat的读取程序,可以...

    javapms门户网站源码

    在模型管理中,用户可自定义模型字段,模型列表如下图所示: 模型字段定义如下图所示: 2.3.3.2. 文档类型 系统默认四种文档类型,分别为普通、图文、焦点和头条,用户在页面上调用文档标签时可以通过tId属性区分...

    linux-0.11:这个repo用来分析linux 0.11源码及整个现代多任务操作系统实现原理

    GDTR,LDTR,IDTR和TR,用于指定内存分段管理所用系统表的基地址GDTR [32位线性基地址,16位表长度] IDTR [32位线性基地址,16位表长度] LDTR [16位段选择符,32位线性基地址,段长度],指令LLDT和SLDT分布用于加载...

    YUMI-2.0.6.7.exe

    YUMI在创建自启动u盘的时候,会在u盘中创建mbr,并且还带有自己的引导界面,从而可以对多个需要自启动系统进行有效的管理。使用方法  在step1处选择U盘所在的盘符(需要先插U盘、SD卡等移动存储设备),在step2...

    dotnet framework 2.0

    您可以将运行库看作一个在执行时管理代码的代理,它提供内存管理、线程管理和远程处理等核心服务,并且还强制实施严格的类型安全以及可提高安全性和可靠性的其他形式的代码准确性。事实上,代码管理的概念是运行库的...

    网络安全技术概述.docx

    如果这些指令是放在有root权限的内存中,那么一旦这些指令得到了运行,黑客就以root权限控制了系统,这样系统的控制权就会被夺取,此类攻击在LINUX系统常发生。在WINOOWs系统下用户权限本身设定不严谨,因此应比在...

    计算机专业主要学习哪些课程.docx

    如果不懂操作系统,你在未来学习编程语言的高级特效,涉及到线程进程调度,内存分配,或者是学习 Linux 相关的知识时,都会一头雾水,所以,只有学会了操作系统,我么才能够更好地学习其他语言和技术。 基于此,...

    Kingsoft WPS Office Pro 2016 v10.8.0.5391 专业增强版.zip

    互联网化多平台同步的发展战略是WPS 2013最重要的市场发展定位,WPS 2013的发布首次实现各平台版本同步更新,同时,在WPS 2013中启用了全新的底层原生跨平台V9引擎,新引擎能实现在Linux、iOS、Mac等多平台的代码...

    工程硕士学位论文 基于Android+HTML5的移动Web项目高效开发探究

    Sqlite 一款轻型的数据库,是遵守ACID的关系型数据库管理系统,它包含在一个相对小的C库中 W3C 万维网联盟,创建于1994年,是Web技术领域最具权威和影响力的国际中立性技术标准机构。主要的工作是发展 Web 规范,...

    JMeter操作手册大全.docx

    计算机中所有程序的运行都是在内存中进行的,因此内存的性能对计算机的影响非常大。 现代的操作系统为了最大利用内存,在内存中存放了缓存,因此内存利用率100%并不代表内存有瓶颈,衡量系统内有有瓶颈主要靠SWAP...

Global site tag (gtag.js) - Google Analytics