|
|
|
|
|
|
|
|
|
|
xen-devel
Re: [Xen-devel] The address in xen
In the xen kernel, there's existing functions/macros to convert between these addresses. Your calculation may be not correct. Every address stored in the page table/directory is machine address. But your pointer should use virtual address to access them.
weiming
2008/3/17 张琳 < zhanglin_nk@xxxxxxx>:
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
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel
|
|
|
|
|