文章导读:
- 1、在程序的装入方式中,何为可重定位装入方式
- 2、如何重定位Internet Explorer
- 3、如何用代码实现动态重定位?
- 4、操作系统
- 5、操作系统中的动态重定位和静态重定位?
- 6、怎么样重定向到/dev/null的?
在程序的装入方式中,何为可重定位装入方式
态重定位即程序运行程要访问数据再进行逻辑址与物理址变换(即逐条指令执行完址映射般提高效率工作由硬件址映射机制完硬件支持软硬件结合完) 硬件需要寄存器支持程序放连续实际物理空间要进行逻辑址物理址转换实现态重定位般需要页式存储管理页式存储管理用寄存器使用称page table(页表)数据结构page table记录所逻辑址物理址转换信息进程切换候需要冲洗硬件page table 句态重定位址映射机制完硬件支持与目标程序关使用页表进行逻辑址物理址转换
如何重定位Internet Explorer
第一步:在任务栏右击,选择“任务管理器”。
第二步:选择“进程”,之后找到“explorer.exe”,选择“结束进程”。
第三步:选择“文件”,新建,之后输入“explorer.exe”点击“确定”即可完成重启操作。
如何用代码实现动态重定位?
重定位过程和方法
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中访问
操作系统
1 运行 就绪 // 程序执行过程中为运行态,执行完毕后没有其它进程引起的竞争,会进入就绪态
2 PCB //进程控制块
3 C
4 C //重定位指的是IO目标已经改变,所以需要由操作系统来负责管理移动
5 D //io接口位于总线和I/O设备之间,主机主存要通过系统总线,主机与I/O设备要通过系统总线I/O接口,然后才与I/O设备相连接,而并不是I/O设备直接与系统总线相连接
6 D //字符是编程语言逻辑,显示器是IO设备,因此需要由操作系统内核API(系统调用)来支持
7 D
8 B //分页是指操作系统进行有效内存管理的技术,类似的还会有相关的页面置换算法
操作系统中的动态重定位和静态重定位?
静态重定位:即在程序装入内存的过程中完成,是指在程序开始运行前,程序中的各个地址有关的项均已完成重定位,地址变换通常是在装入时一次完成的,以后不再改变,故称为静态重定位。
动态重定位:它不是在程序装入内存时完成的,而是CPU每次访问内存时 由动态地址变换机构(硬件)自动进行把相对地址转换为绝对地址。动态重定位需要软件和硬件相互配合完成。
扩展资料
在装入程序前,系统会计算未使用的内存,然后将程序装入,并记下开始地址。在执行有相对地址的指令时,会将所有的地址加个刚才记下的开始地址,就叫重定位。
程序放在不连续的实际物理空间中,要进行逻辑地址到物理地址的转换,实现动态重定位一般需要段页式存储管理,页式存储管理用的不是寄存器,使用的是称为page table(页表)的数据结构page table记录了所有逻辑地址到物理地址的转换信息,进程切换的时候需要冲洗硬件上的page table 。
参考资料来源:百度百科-动态重定位
参考资料来源:百度百科-重定位
怎么样重定向到/dev/null的?
而logwrapper可以让一个进程启动时STDIO重定向到log结点,然后通过logcat查看。这里记录一下它的实现机制。
init.c中的service_start方法中有这么一句:
needs_console = (svc-flags SVC_CONSOLE) ? 1 : 0;
如果needs_console的值是1,就会调用open_console();为当前启动的这个服务打开控制台作为其STDIO。如果是0的话,就调用zap_stdio();打开/dev/null作为其STDIO。
参照init_parser.c中的parse_line_service和lookup_keyword两个方法可以知道,svc-flags由init.rc中service的命令选项console控制。
le(页表)的数据结构page table记录了所有逻辑地址到物理地址的转换信息,进程切换的时候需要冲洗硬件上的page table 。参考资料来源:百度百科-动态重定位参考
定位:即在程序装入内存的过程中完成,是指在程序开始运行前,程序中的各个地址有关的项均已完成重定位,地址变换通常是在装入时一次完成的,以后不再改变,故称为静态重定位。动态重定位:它不是在程序装入内存时完成的,而是CPU每次访问内存时 由动态地