基本概念:
邏輯地址:在具有地址變換功能的計算機中,訪問指令給出的操作數。
物理地址:用於內存芯片級單元尋址,與CPU連接的地址總線相對應。
線性地址:邏輯地址和物理地址轉換的中間層,即硬件平臺頁式轉換前的地址。
虛擬存儲空間分佈
實模式和保護模式
以8086爲例,運算器(ALU)的最大尋址數爲16,地址總線爲20,內存容量爲1M。尋址方式爲 物理地址 = 基地址 +偏移量,
頁式管理系統地址轉換
用c語言實現邏輯地址轉換成物理地址
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <stdlib.h>
#include <assert.h>
#include <fcntl.h>
#include <stdint.h>
int add(int a,int b)
{
return 0;
}
int g = 10;
/*
* 邏輯地址 映射得到 物理地址
* 參數爲 邏輯地址
*/
uint64_t vir_to_phy(unsigned long int vaddr)
{
int pagesize = getpagesize();
int index = vaddr/pagesize;//邏輯頁號 p
int offset = vaddr%pagesize;//頁內偏移量 d
int fileoffset = index*8;//pagemap文件中讀出 物理頁號
int fd = open("/proc/self/pagemap",O_RDONLY);
if(fd == -1)
{
return 0;
}
lseek(fd,fileoffset,SEEK_SET);
uint64_t val = 0;
read(fd,&val,sizeof(val));
uint64_t phy = 0;
if(val & (uint64_t)1<<63)
{
val &= (((uint64_t)1<<55)-1);
phy = val*pagesize+offset;//拼接物理地址
return phy;
}
return 0;
}
int main()
{
int a = 0;
printf("局部變量 a = %x\n",&a);
printf("全局變量 g = %x\n",&g);
printf("全局函數 add = %x\n",add);
printf("主程序入口 main = %x\n",main);
int *p = (int*)malloc(1024*1024*1024);//申請1G的資源
pid_t pid = fork();
if(pid == 0)
{
//memset(p,0,1024*1024*1024);
}
//父子進程中的映射關係
int b = vir_to_phy(&p);
printf("virtul a = %x\n",&p);
printf("physical a = %x\n",b);
free(p);
exit(0);
}