LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 1263|回复: 9

还是要问基础知识!

[复制链接]
发表于 2006-2-11 00:39:26 | 显示全部楼层 |阅读模式
程序定位方式

动态定位方式:这种定位方式是利用类似变址寻址方法,由硬件(这儿的硬件是什么?是基址寄存器吗?)
支持完成。 程序装入主存时(程序运行时是把程序的所有部分都装入主存的吗?),在程序运行前, 装入主存的过程中,指令或数据地址不作修改,只把主存的起始地址装入该程序对应的基址寄存器中(是一个程序占用一个基址寄存器吗?)。在程序运行时,利用地址加法器,指令中的逻辑地址与已经存放在基址寄存器中的程序起始地址相加,就形成了主存的物理地址。指令的地址码不需全部修改(为什么有一部分是需要修改的?)。这种方式主要优点是在程序执行时由硬件形成主存物理地址,一个程序可以不连续分配在主存物理空间内,提高主存利用率,多个用户可以共享主存同一个程序段,支持虚拟存储器实现。缺点是需要硬件支持,实现存储管理的软件算法比较复杂。
发表于 2006-2-12 22:03:04 | 显示全部楼层
这段话有点奇怪,有的地方好像讲的是内核,有的地方又像是应用层的东西。
这段话的出处在哪?
回复 支持 反对

使用道具 举报

发表于 2006-2-13 10:15:49 | 显示全部楼层
这个应该说是一个程序在加载时前的静态地址与加载后的实际内存物理地址之间的映射问题。

假如说程序在运行时需要引用一个数据段中的符号,这个符号在链接时给出的段内偏移是1000。但在加载时,整个数据段被加载到以3000开始的地址范围。此时符号的物理地址就要加上这个3000。基本的原理就是这样。
但是具体的实现涉及到虚拟内存管理和计算机体系结构方面的知识。要说明白就有点困难。最好能问具体一点的问题,也便于我们回答。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-2-13 23:06:32 | 显示全部楼层
这是《计算机体系结构》 指令系统设计原理中的一小节的内容http://www.fjtu.com.cn/fjnu/cour ... lesson/char4/j3.htm
我把相关的一段帖出来。kj版主说的大原理我也知道,只是其中的一些细节还是想不明白!
2.程序定位方式

  把一个程序交给处理机运行,必须首先把这个程序的指令和数据装入到主存储器中。一般情况下,程序所分配到的主存物理空间与程序本身的逻辑地址空间是不同的,把指令和数据中的逻辑地址(相对地址)转变成主存物理地址(绝对地址)的过程称为程序定位。程序定位有三种方式。
  (1) 直接定位方式:采用直接定位方式是程序员在编写程序时或编译程序对源程序进行编译时,就已经确切知道该程序应占用的主存物理空间。因此可以直接使用实际主存物理地址来编写或编译程序。目前大多不用这种方式。
  (2) 静态定位方式:这种定位方式是专门用装入程序来完成的,并要求程序本身可以重定位。在程序运行前,装入主存的过程中,把那些带有标识的指令或数据中的逻辑地址全部变成主存的物理地址,集中一次完成地址变换,一旦装入主存就不能再变动了。这种方式优点主要是用装入程序软件一次完成, 实现简单,不需要增加硬件设备。缺点主要是在程序运行前一次装入主存,然后就不能再移动了,不够灵活, 主存储器利用率不高, 多个用户不能共享主存同一个程序。
  (3) 动态定位方式:这种定位方式是利用类似变址寻址方法,由硬件支持完成。 程序装入主存时,在程序运行前,装入主存的过程中,指令或数据地址不作修改,只把主存的起始地址装入该程序对应的基址寄存器中。在程序运行时,利用地址加法器,指令中的逻辑地址与已经存放在基址寄存器中的程序起始地址相加,就形成了主存的物理地址。指令的地址码不需全部修改。这种方式主要优点是在程序执行时由硬件形成主存物理地址,一个程序可以不连续分配在主存物理空间内,提高主存利用率,多个用户可以共享主存同一个程序段,支持虚拟存储器实现。缺点是需要硬件支持,实现存储管理的软件算法比较复杂。
回复 支持 反对

使用道具 举报

发表于 2006-2-14 09:53:04 | 显示全部楼层
我所理解的动态定位方式,就是利用虚拟内存机制来实现程序的逻辑地址空间与实际内存的物理地址空间的映射转换问题。这样的话,硬件应该是MMU。对于有虚拟内存管理机制的机器,程序在加载并不是全部装入内存,而是加载当前运行所需要的部分。
这种方式是最灵活的,也是现在主流的操作系统所采用的方式。
回复 支持 反对

使用道具 举报

发表于 2006-2-14 17:52:01 | 显示全部楼层
嗯,同意 kj 兄的意见
你的问题可以适当参考相应体系结构的文档
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-2-16 08:50:54 | 显示全部楼层
Post by kj501
对于有虚拟内存管理机制的机器,程序在加载并不是全部装入内存,而是加载当前运行所需要的部分。
这种方式是最灵活的,也是现在主流的操作系统所采用的方式。

版主,静态链接的代码也是这样的吗?那么是不是对于有虚拟内存管理的机器,使用静态库和动态库不再像以前那样有速度上的差别呢?
回复 支持 反对

使用道具 举报

发表于 2006-2-17 09:41:34 | 显示全部楼层
这个涉及到对虚拟内存管理和程序执行加载过程的理解。对于有虚拟内存管理机制的计算机,一个程序在运行时并不是全部将硬盘上的可执行文件全部装入内存后,才开始执行程序。而是由一个内核中的函数loader(也被称为加载器)来执行这个加载过程。加载器利用虚拟内存管理机制,利用mmap函数直接将硬盘文件映射到内存线性地址空间中。然后初始化程序运行环境,使程序进入运行状态。当内核正式调度程序运行时,由于程序没有被真正装入内存,就会发生缺页异常。此时虚拟内存机制将发挥作用,将所需要的那个页面装入内存。然后程序就可以接着正常运行了。
这个过程对于静态链接和动态链接的程序都是一样的。但静态链接的程序加载后不需要进行动态符号解析,执行的速度要比较动态链接快一些。
回复 支持 反对

使用道具 举报

发表于 2006-2-17 10:16:32 | 显示全部楼层
CPU本身存在EBIU(总线接口单元来进行指令和数据的存取)。支持MMU的操作系统,多进程环境下,一个进程的物理地址空间可能不连续。因为支持VM,一个进程在运行时可以不是全部的代码和数据都需要loader到内存中,可以在运行根据需要加载剩余部分,这就造成这个进程可能在物理内存空间上的不连续。但是进程本身内部的地址(程序员看到的地址)采用虚拟地址,保证连续。每一个进程都存在一个PCB,其提供给核心来对它进行管理,核心维护有CPU地址管理的TLB。进程在访问内存时,核心利用这三个东西,并根据MMU的TLB来取得地址。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2006-2-17 14:54:26 | 显示全部楼层
还以为copy on write只是适用fork或clone出来的进程呢!原来一个程序刚开始执行时就这样!又学到一点。thanks a lot!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表