32位PAE模式X86架構下,Xen佔用了最頂部的64MB的線性地址空間。分布如下:
IOREMAP_VIRT_END :0
IOREMAP_VIRT_START :FFC00000
DIRECTMAP_VIRT_END :FFC00000
DIRECTMAP_VIRT_START :FF000000
MAPCACHE_VIRT_END :FF000000
MAPCACHE_VIRT_START :FEC00000
PERDOMAIN_VIRT_END :FF000000
PERDOMAIN_VIRT_START :FE800000
SH_LINEAR_PT_VIRT_END :FE800000
SH_LINEAR_PT_VIRT_START :FE000000
LINEAR_PT_VIRT_END :FE000000
LINEAR_PT_VIRT_START :FD800000
RDWR_MPT_VIRT_END :FD800000
RDWR_MPT_VIRT_START :FC800000
FRAMETABLE_VIRT_END :FC800000
FRAMETABLE_VIRT_START :F6800000
RO_MPT_VIRT_END :F6800000
RO_MPT_VIRT_START :F5800000
非PAE模式,分布如下:
I/O Remapping Area:I/O重新對應
IOREMAP_VIRT_END :0
IOREMAP_VIRT_START :FFC00000
Direct-map:
直接映射地區
DIRECTMAP_VIRT_END :FFC00000
DIRECTMAP_VIRT_START :FF000000
Map Cache:映射緩衝,用於緩衝Domain地址映射
MAPCACHE_VIRT_END :FF000000
MAPCACHE_VIRT_START :FEC00000
Per-Domain Mappings:
用於每個Domain地址映射
PERDOMAIN_VIRT_END :FF000000
PERDOMAIN_VIRT_START :FE800000
Shadow Linear Pagetable: 映射影子頁目錄和頁表
SH_LINEAR_PT_VIRT_END :FE800000
SH_LINEAR_PT_VIRT_START :FE400000
Guest Linear Pagetable: 映射當前Guest OS的頁表結構,包括頁目錄和頁表
LINEAR_PT_VIRT_END :FE400000
LINEAR_PT_VIRT_START :FE000000
Machine-to-physical Translation Table(RW): 可寫M2P表,能被Xen讀寫,Guest OS不能訪問
RDWR_MPT_VIRT_END :FE000000
RDWR_MPT_VIRT_START :FDC00000
Frame-info Table: 系統物理頁資訊表,對應frame_table數組
FRAMETABLE_VIRT_END :FDC00000
FRAMETABLE_VIRT_START :FC400000
Machine-to-physical Translation Table(RO): 唯讀M2P表,能夠被Guest OS訪問。
RO_MPT_VIRT_END :FC400000
RO_MPT_VIRT_START :FC000000
附:
1、Xen堆(Xenheap)地區即直接映射地區(Direct-map),大小為12 MB。Xen堆和傳統作業系統的核心相當,在系統初始化時佔用了機器物理地址空間的前面12MB。
2、
#include <stdio.h><br />#include <stdlib.h></p><p>#define IOREMAP_MBYTES 4<br />#define DIRECTMAP_MBYTES 12<br />#define MAPCACHE_MBYTES 4<br />#define PERDOMAIN_MBYTES 8<br />#ifdef CONFIG_X86_PAE<br /># define LINEARPT_MBYTES 8<br /># define MACHPHYS_MBYTES 16 /* 1 MB needed per 1 GB memory */<br /># define FRAMETABLE_MBYTES (MACHPHYS_MBYTES * 6)<br />#else<br /># define LINEARPT_MBYTES 4<br /># define MACHPHYS_MBYTES 4<br /># define FRAMETABLE_MBYTES 24<br />#endif<br />#define IOREMAP_VIRT_END 0UL<br />#define IOREMAP_VIRT_START (IOREMAP_VIRT_END - (IOREMAP_MBYTES<<20))<br />#define DIRECTMAP_VIRT_END IOREMAP_VIRT_START<br />#define DIRECTMAP_VIRT_START (DIRECTMAP_VIRT_END - (DIRECTMAP_MBYTES<<20))<br />#define MAPCACHE_VIRT_END DIRECTMAP_VIRT_START<br />#define MAPCACHE_VIRT_START (MAPCACHE_VIRT_END - (MAPCACHE_MBYTES<<20))<br />#define PERDOMAIN_VIRT_END DIRECTMAP_VIRT_START<br />#define PERDOMAIN_VIRT_START (PERDOMAIN_VIRT_END - (PERDOMAIN_MBYTES<<20))<br />#define SH_LINEAR_PT_VIRT_END PERDOMAIN_VIRT_START<br />#define SH_LINEAR_PT_VIRT_START (SH_LINEAR_PT_VIRT_END - (LINEARPT_MBYTES<<20))<br />#define LINEAR_PT_VIRT_END SH_LINEAR_PT_VIRT_START<br />#define LINEAR_PT_VIRT_START (LINEAR_PT_VIRT_END - (LINEARPT_MBYTES<<20))<br />#define RDWR_MPT_VIRT_END LINEAR_PT_VIRT_START<br />#define RDWR_MPT_VIRT_START (RDWR_MPT_VIRT_END - (MACHPHYS_MBYTES<<20))<br />#define FRAMETABLE_VIRT_END RDWR_MPT_VIRT_START<br />#define FRAMETABLE_VIRT_START (FRAMETABLE_VIRT_END - (FRAMETABLE_MBYTES<<20))<br />#define RO_MPT_VIRT_END FRAMETABLE_VIRT_START<br />#define RO_MPT_VIRT_START (RO_MPT_VIRT_END - (MACHPHYS_MBYTES<<20))<br />#define XENHEAP_DEFAULT_MB (DIRECTMAP_MBYTES)<br />#define DIRECTMAP_PHYS_END (DIRECTMAP_MBYTES<<20)<br />int main( )<br />{<br /> FILE *fp;<br /> int a = 1;<br /> char c ='a';<br /> fp=fopen("output.txt","w");<br /> if(fp==NULL)<br /> {<br /> printf("Can not create the file!");<br /> exit(0);<br /> }<br /> fprintf(fp,"IOREMAP_VIRT_END :%X/n",IOREMAP_VIRT_END);<br /> fprintf(fp,"IOREMAP_VIRT_START :%X/n/n",IOREMAP_VIRT_START);<br /> fprintf(fp,"DIRECTMAP_VIRT_END :%X/n",DIRECTMAP_VIRT_END);<br /> fprintf(fp,"DIRECTMAP_VIRT_START :%X/n/n",DIRECTMAP_VIRT_START);<br /> fprintf(fp,"MAPCACHE_VIRT_END :%X/n",MAPCACHE_VIRT_END);<br /> fprintf(fp,"MAPCACHE_VIRT_START :%X/n/n",MAPCACHE_VIRT_START);<br /> fprintf(fp,"PERDOMAIN_VIRT_END :%X/n",PERDOMAIN_VIRT_END);<br /> fprintf(fp,"PERDOMAIN_VIRT_START :%X/n/n",PERDOMAIN_VIRT_START);<br /> fprintf(fp,"SH_LINEAR_PT_VIRT_END :%X/n",SH_LINEAR_PT_VIRT_END);<br /> fprintf(fp,"SH_LINEAR_PT_VIRT_START :%X/n/n",SH_LINEAR_PT_VIRT_START);<br /> fprintf(fp,"LINEAR_PT_VIRT_END :%X/n",LINEAR_PT_VIRT_END);<br /> fprintf(fp,"LINEAR_PT_VIRT_START :%X/n/n",LINEAR_PT_VIRT_START);<br /> fprintf(fp,"RDWR_MPT_VIRT_END :%X/n",RDWR_MPT_VIRT_END);<br /> fprintf(fp,"RDWR_MPT_VIRT_START :%X/n/n",RDWR_MPT_VIRT_START);<br /> fprintf(fp,"FRAMETABLE_VIRT_END :%X/n",FRAMETABLE_VIRT_END);<br /> fprintf(fp,"FRAMETABLE_VIRT_START :%X/n/n",FRAMETABLE_VIRT_START);<br /> fprintf(fp,"RO_MPT_VIRT_END :%X/n",RO_MPT_VIRT_END);<br /> fprintf(fp,"RO_MPT_VIRT_START :%X/n/n",RO_MPT_VIRT_START);<br /> fclose(fp);<br /> return 0;<br />}