[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] The address in xen
It seems that the address in xen has three layer: the virtual address , the pesurdo-physical address and the machine address. I obtained some addresses of kernel symbols by parsing the system.map file. I think this address is virtual address.Is it correct? Then I want to calculate the hash value of memory area start from those addresses. So I have to access the corresponding machine address. Then problem came. How to translate the virtual address to machine address? First, I want to translate the virtual address to pesurdo-physical address by traversing page table tree. But segmentation fault always occurs. I put my code in the following~~~ Can anyone tell me that what is wrong? unsigned long VAtoPA(unsigned long VirtualAddress) { /*This variable is used for storing the address of the Page Directory.*/ unsigned long PDAddress; /*This variable is a pointer pointing to the entry in the page directory which contains the address of the Page Table.*/ unsigned long* pPTAddress; /*This variable is used for storing the address of the Page Table.*/ unsigned long PTAddress; /*This variable is a pointer pointing to the entry in the page table which contains the address of the physical page.*/ unsigned long* pPPAddress; /*This variable is used for storing the address of the physical page.*/ unsigned long PPAddress; /*This is physical address for the corresponding virtual address.*/ unsigned long PhysicalAddress; /*Get the address of the Page Directory from CR3*/ int xc_handle = xc_interface_open(); if(xc_handle == -1) { printf("Sorry! Cannot open an interface on xen hypervisor, please check that whether the xen is running or not!\n"); exit(1); } vcpu_guest_context_t context; int result = xc_vcpu_getcontext(xc_handle, 1, 0, &context); if(result == -1) { printf("Sorry! Cannot get the context of the virtual CPU-1 in domain-1, please check that whether the domain-1 is running or not!\n"); exit(1); } PDAddress = context.ctrlreg[3] & 0xFFFFF000; int index; /*Get the index number in Page Directory.*/ index = VirtualAddress >> 22; /*Get the address of the entry which contains the address of the Page Table.*/ pPTAddress = PDAddress + (index << 2); /*Get the address of the Page Table*/ PTAddress = (*pPTAddress) & 0xFFFFF000; /*Get the index number in Page Table.*/ index = (VirtualAddress >> 12) & 0x000003FF; /*Get the address of the entry which contains the address of the physical page.*/ pPPAddress = PTAddress + (index << 2); /*Get the address of the physical page.*/ PPAddress = (*pPPAddress) & 0xFFFFF000; PhysicalAddress = PPAddress + (VirtualAddress & 0x00000FFF); result = xc_interface_close(xc_handle); if(result == -1) { printf("Sorry! Cannot close the special interface on xen hypervisor!\n"); exit(1); } return PhysicalAddress; }
_______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxxxxxxxx http://lists.xensource.com/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |