打印出重定位表(C语言实现)

基础知识

在这里插入图片描述

在这里插入图片描述

主程序

//主程序 outoutpeh.cpp


#include <stdio.h>
#include <stdlib.h>
#include "func.h"


typedef int(*lpPlus)(int, int);



int main(int argc ,char* argv[])
{
   
	//PrintNTHeaders();//打印PE头信息

	//TestAddCodeIncodeSec();
	//TestAddSecIncode();
	
	//PrintdDirectory();//打印PE文件导入表

	TestPrintRelocation();


//	getchar();
	return 1;

}

实现


VOID TestPrintRelocation() 
{
   

	LPVOID pFileBuffer = NULL;
	PIMAGE_DOS_HEADER pDosHeader = NULL;
	PIMAGE_NT_HEADERS pNTHeader = NULL;
	PIMAGE_FILE_HEADER pPEHeader = NULL;
	PIMAGE_OPTIONAL_HEADER32 pOptionHeader = NULL;
	PIMAGE_DATA_DIRECTORY pDataDirectory = NULL;
	PIMAGE_BASE_RELOCATION pBaseRelocation = NULL;
	DWORD SizeOfBlock;
	WORD* pRelocationAddress = NULL;
	DWORD  RelocationAddress ;//重定位的地址
	DWORD  AddressAttribute;  //重定位地址的属性
	if (!ReadPEFile(FILEP
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
页式地址重定位算法是一种常见的内存管理方式,它将逻辑地址分为页号和页内偏移量两部分,通过将页号映射为实际物理内存中的页框号,从而实现地址重定位。下面是一个简单的C语言实现: ```c #include <stdio.h> #include <stdlib.h> #define PAGE_SIZE 4 // 页大小为4个字节 #define PAGE_NUM 16 // 页项数目为16 #define MEM_SIZE 64 // 物理内存大小为64个字节 #define PAGE_FRAME_NUM 16 // 物理内存中页框数目为16 // 页项结构体 typedef struct PageTableItem { int valid; // 有效位(示该页是否被装入内存) int page_frame; // 页框号(示该页在内存中的位置) } page_table_item; // 物理内存中的页框结构体 typedef struct PageFrame { int page_no; // 页号(示该页所属的页项) int data[PAGE_SIZE]; // 页框中的数据 } page_frame; // 页 page_table_item page_table[PAGE_NUM]; // 物理内存 page_frame memory[PAGE_FRAME_NUM]; // 逻辑地址到物理地址的映射函数 int translate_address(int logical_addr) { int page_no = logical_addr / PAGE_SIZE; // 页号 int offset = logical_addr % PAGE_SIZE; // 页内偏移量 // 如果该页未被装入内存,则将其装入内存中 if (page_table[page_no].valid == 0) { // 随机选择一个页框,将该页装入该页框 int page_frame_no = rand() % PAGE_FRAME_NUM; memory[page_frame_no].page_no = page_no; page_table[page_no].valid = 1; page_table[page_no].page_frame = page_frame_no; } // 返回物理地址 int page_frame_no = page_table[page_no].page_frame; int physical_addr = page_frame_no * PAGE_SIZE + offset; return physical_addr; } int main() { srand(0); // 设置随机数种子 // 初始化页 for (int i = 0; i < PAGE_NUM; i++) { page_table[i].valid = 0; } // 写入数据 for (int i = 0; i < PAGE_NUM * PAGE_SIZE; i++) { int logical_addr = i; int physical_addr = translate_address(logical_addr); memory[physical_addr / PAGE_SIZE].data[physical_addr % PAGE_SIZE] = i; } // 读取数据 for (int i = 0; i < PAGE_NUM * PAGE_SIZE; i++) { int logical_addr = i; int physical_addr = translate_address(logical_addr); printf("logical addr: %d, physical addr: %d, data: %d\n", logical_addr, physical_addr, memory[physical_addr / PAGE_SIZE].data[physical_addr % PAGE_SIZE]); } return 0; } ``` 在上面的代码中,我们定义了页项结构体 `page_table_item`,物理内存中的页框结构体 `page_frame`,以及页 `page_table` 和物理内存 `memory`。`translate_address` 函数负责将逻辑地址转换为物理地址,并在需要的时候将页装入内存中。在 `main` 函数中,我们先将数据写入内存,然后再读取数据并打印来。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值