- 論壇徽章:
- 0
|
libvmi是谷歌的一個(gè)開源項(xiàng)目,用于查看虛擬機(jī)內(nèi)部情況,如在Xen虛擬化環(huán)境下,可以在Dom0中,通過libvmi查看其它虛擬機(jī)的內(nèi)存情況,如獲取模塊鏈表、進(jìn)程鏈表等,我在這個(gè)庫的一個(gè)初始化地方有點(diǎn)疑問,希望可以和大家一起探討下。
- status_t linux_init (vmi_instance_t vmi)
- {
- status_t ret = VMI_FAILURE;
- if (vmi->cr3){
- vmi->kpgd = vmi->cr3;
- }
- //如果vmi->cr3=0時(shí),將執(zhí)行這個(gè)分支
- else if (VMI_SUCCESS == linux_system_map_symbol_to_address(vmi, "swapper_pg_dir", &vmi->kpgd)){//此時(shí),從System.map文件中獲取到了swapper_pg_dir的虛擬地址,并賦值給了vmi->kpgd
- dbprint("--got vaddr for swapper_pg_dir (0x%.16llx).\n", vmi->kpgd);
- if (driver_is_pv(vmi)){
- vmi->kpgd = vmi_translate_kv2p(vmi, vmi->kpgd); //這里通過 vmi_translate_kv2p函數(shù)將虛擬地址轉(zhuǎn)化為物理地址,轉(zhuǎn)到vmi_translate_kv2p函數(shù)
- if (vmi_read_addr_pa(vmi, vmi->kpgd, &(vmi->kpgd)) == VMI_FAILURE){
- errprint("Failed to get physical addr for kpgd.\n");
- goto _exit;
- }
- }
- else{
- vmi->kpgd = vmi_translate_kv2p(vmi, vmi->kpgd);
- }
- }
- else{
- errprint("swapper_pg_dir not found and CR3 not set, exiting\n");
- goto _exit;
- }
- vmi->kpgd = vmi->cr3;
- dbprint("**set vmi->kpgd (0x%.16llx).\n", vmi->kpgd);
- addr_t address = vmi_translate_ksym2v(vmi, "init_task");
- address += vmi->os.linux_instance.tasks_offset;
- if (VMI_FAILURE == vmi_read_addr_va(vmi, address, 0, &(vmi->init_task))){
- errprint("Failed to get task list head 'init_task'.\n");
- goto _exit;
- }
- ret = VMI_SUCCESS;
- _exit:
- return ret;
- }
復(fù)制代碼- addr_t vmi_translate_kv2p(vmi_instance_t vmi, addr_t virt_address)
- {
- reg_t cr3 = 0;
- if (vmi->kpgd){//由于在“l(fā)inux_init”函數(shù)中,vmi->kpgd已經(jīng)被賦值為"swapper_pg_dir"的虛擬地址,所以將執(zhí)行此分支
- cr3 = vmi->kpgd; //cr3被賦值為vmi->kpgd
- }
- else{
- driver_get_vcpureg(vmi, &cr3, CR3, 0);
- }
- if (!cr3){
- dbprint("--early bail on v2p lookup because cr3 is zero\n");
- return 0;
- }
- else{
- return vmi_pagetable_lookup(vmi, cr3, virt_address); //在這里面進(jìn)行頁表查找操作,此時(shí)的cr3為swapper_pg_dir的虛擬地址
- }
- }
復(fù)制代碼
想問下大家,覺得最后那一步vmi_pagetable_lookup,它以此時(shí)cr3的值為頁全局目錄地址,能夠查找到對應(yīng)虛擬地址的物理地址嗎? |
|