作者:hacker发布时间:2022-07-13分类:网络黑客浏览:100评论:5
要进行逻辑地址到物理地址的转换,实现动态重定位
一般需要页式存储管理,页式存储管理用的不是寄存器,使用的是称为page talble的数据结构
page table记录了所有逻辑地址到物理地址的转换信息,进城切换的时候需要冲洗硬件上的page table
(有的CPU结构不支持page table,需要软件来实现)
~如果你认可我的回答,请及时点击【采纳为满意回答】按钮
~~手机提问的朋友在客户端右上角评价点【满意】即可。
~你的采纳是我前进的动力
~~O(∩_∩)O,记得好评和采纳,互相帮助,谢谢。
1、程序在运行过程中经常要在内存中移动位置,为了保证这些被移动了的程序还能正常执行,必须对程序和数据的地址加以修改,即重定位。引入重定位的目的就是为了满足程序的这种需要;
2、要在不影响指令执行速度的同时实现地址变换,必须有硬件地址变换机构的支持,即须在系统中增设一个重定位寄存器,用它来存放程序在内存中的起始地址。程序在执行时,真正访问的内存地址是相对地址与重定位寄存器中的地址相加而形成的。
页式地址转换:用户作业的地址空间被分割成若干大小相等的区域,称作页或页面。相应的,将内存的存储空间也分为也页大小 相等的 区域,称作块(Page Frame)。在作业分配存储空间时,总是以块为单位分配,简单说就是将任意页分配到任意块中。(注意:作业调度时必须一次将全部页一次调度,故内存中块不足时等待)
段式地址转换:简单与页式相区别在于段式按照逻辑关系将作业进行分段,使每一段逻辑关系完整,不会像页式那样,可能由于页面大小固定的原因,使一个作业被分成两半、多半。段式中,每段被分配一个连续的存储空间,各段之间是独立的,每段均有自己的地址。
静态重定位:在装入作业时,将作业中指令地址和数据地址全部转换为物理地址。
动态重定位:在装入作业时不进行转换,而是在执行过程中将每一条指令都由硬件的地址转换机构转换成绝对地址。
重定位过程和方法
3.1 nor flash启动-----只重定位 .data
为了实现修改,我们考虑将g_char保存在外部的sdram中,修改Makefile如下:
all:
arm-linux-gcc -c -o led.o led.c
arm-linux-gcc -c -o uart.o uart.c
arm-linux-gcc -c -o init.o init.c
arm-linux-gcc -c -o main.o main.c
arm-linux-gcc -c -o start.ostart.S
arm-linux-ld -Ttext 0 -Tdata 0x30000000 start.o led.ouart.o init.omain.o -o sdram.elf
arm-linux-objcopy -O binary -Ssdram.elf sdram.bin
arm-linux-objdump -D sdram.elf sdram.dis
clean:
rm *.bin *.o *.elf *.dis
编译之后,发现bin文件为800多M,显然这是不合理的
BIN文件的数值为什么是805306369?我们发现805306369=0x30000001,的确,我们在Makefile中就是指明了全局变量保存在SDRAM中,所以BIN文件的保存地址是从0~0x30000000,其大小正好是0x30000001,因此,这个时候,我们的代码段和数据段的存储格式如下:(中间产生了巨大的空洞hole)
为了解决上面的方法,代码过大的问题,有两种方式来解决:
A. 将data段重定位到SDRAM中,text段仍在NOR Flash中
1. 仍然将全局变量数据段和代码段烧写到nor flash中
2. 在运行时,代码段代码要能实现将数据段拷贝(重定位)到SDRAM中;
3. 以后每次访问全局变量,都是去SDRAM中去访问,不去nor flash中访问
静态重定位和动态重定位的区别:
①静态重定位是在作业装入的时候一次完成, 动态重定位是在作业执行时再实现的。
②静态重定位是软件支持的, 动态重定位是硬件和软件 合作实现的。
③静态重定位不能实现主存的移动,而动态重定位可以。
④动态重定位还可能 提供虚拟存储空间。
标签:存储动态重定位
已有5位网友发表了看法:
访客 评论于 2022-07-14 02:59:56 回复
修改,即重定位。引入重定位的目的就是为了满足程序的这种需要;2、要在不影响指令执行速度的同时实现地址变换,必须有硬件地址变换机构的支持,即须在系统中增设一个重定位寄存器,用它来存放程序在内存中的起始地址。程序在执行时,真正访问
访客 评论于 2022-07-13 16:44:12 回复
中 2. 在运行时,代码段代码要能实现将数据段拷贝(重定位)到SDRAM中; 3. 以后每次访问全局变量,都是去SDRAM中去访问,不去nor flash中访问静态地址重定位跟动态地址重定位的区别?静态重定位和动态重定
访客 评论于 2022-07-13 20:13:00 回复
o main.o main.c arm-linux-gcc -c -o start.ostart.S arm-linux-ld -Ttext 0 -Tdata 0x30000000 start.o led.ouar
访客 评论于 2022-07-13 19:24:55 回复
各段之间是独立的,每段均有自己的地址。静态重定位:在装入作业时,将作业中指令地址和数据地址全部转换为物理地址。动态重定位:在装入作业时不进行转换,而是在执行过程中将每一条指令都由硬件的地址转换机构
访客 评论于 2022-07-13 22:56:47 回复
如何实现要进行逻辑地址到物理地址的转换,实现动态重定位 一般需要页式存储管理,页式存储管理用的不是寄存器,使用的是称为page talble的数据结构 page table记录了所有逻辑地址到物理地址的转换信息,进城切换的时候需要冲洗硬件上的pag