虚拟MMU---客户机页表遍历
客户 机页表的遍历 MMU的功能: 虚拟 机地址转换为物理地址,下面函数模拟此过程。 1.数据结构 struct guest_walker { int level; gfn_t table_gfn[PT_MAX_FULL_LEVELS]; pt_element_t ptes[PT_MAX_FULL_LEVELS]; gpa_t pte_gpa[PT_MAX_FULL_LEVELS]; unsign
客户机页表的遍历
MMU的功能:虚拟机地址转换为物理地址,下面函数模拟此过程。
1.数据结构
struct guest_walker {int level;
gfn_t table_gfn[PT_MAX_FULL_LEVELS];
pt_element_t ptes[PT_MAX_FULL_LEVELS];
gpa_t pte_gpa[PT_MAX_FULL_LEVELS];
unsigned pt_access;
unsigned pte_access;
gfn_t gfn;
u32 error_code;
};
+-------+
| |
+-------+
| c |
|-------| | |
+-------+
|-------|
|-------|
+-------+ 某级页表
a:页表项基地址
b:index的地址
c:index的地址内容
遍历完成后,数据结构内容为
gfn:客户机页表转换后物理地址页框号
假设PT_MAX_FULL_LEVELS=4
table_gfn【0-3】存放 4级页表项基地址
pte_gpa【0-3】 存放4级页表项中index基地址
ptes【0-3】 存放4级页表项中index基地址内容
pt_access: gfn的访问权限
pte_access: gfn的访问权限
2:客户机页表的遍历,也是虚拟MMU
static int FNAME(walk_addr)(struct guest_walker *walker,
struct kvm_vcpu *vcpu, gva_t addr,
int write_fault, int user_fault, int fetch_fault)
walker->level = vcpu->arch.mmu.root_level;//64位客户机系统,页表级数为4.
pte = vcpu->arch.cr3; //页目录基地址
for (;;) { //从64位客户机页目录开始遍历,最后到页表
index = PT_INDEX(addr, walker->level);
table_gfn = gpte_to_gfn(pte);
pte_gpa = gfn_to_gpa(table_gfn);
pte_gpa += index * sizeof(pt_element_t);
walker->table_gfn[walker->level - 1] = table_gfn; //存放页表基地址
walker->pte_gpa[walker->level - 1] = pte_gpa; //存放页表index基地址
if (kvm_read_guest(vcpu->kvm, pte_gpa, &pte, sizeof(pte)))//获取存放页表index基地址页表项
goto not_present;
pte_access = pt_access & FNAME(gpte_access)(vcpu, pte);//获取存放页表index基地址页表项权限
walker->ptes[walker->level - 1] = pte;//存放存放页表index基地址页表项
if ((walker->level == PT_PAGE_TABLE_LEVEL)//页表的最后一级存放客户机物理页地址
{
int lvl = walker->level;
walker->gfn = gpte_to_gfn_lvl(pte, lvl);//转换客户机物理页地址为客户机物理页框号
walker->gfn += (addr & PT_LVL_OFFSET_MASK(lvl))
>> PAGE_SHIFT;
break;
}
pt_access = pte_access;
--walker->level; //遍历下一级页表
}
//页表遍历完成后,获取页表的访问权限,存放到数据结构中
walker->pt_access = pt_access;
walker->pte_access = pte_access;
pgprintk("%s: pte %llx pte_access %x pt_access %x\n",
__func__, (u64)pte, pt_access, pte_access);
return 1;
}

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

Video Face Swap
使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

您可能想知道MicrosoftWi-Fi直接虛擬適配器在您的PC上的作用。最好放心,此網路介面卡Microsoft且完全安全。但是,如果適配器弄亂了您的活動,並且您想知道它是否值得保留,本指南將為您提供您需要了解的所有資訊。 MicrosoftWi-FiDirect虛擬適配器有什麼作用?顧名思義,MicrosoftWi-Fi直接虛擬適配器有助於使您的PC成為無線熱點。這樣,其他電腦可以連接到您的PC以存取互聯網。它透過虛擬化無線網路適配器來實現此目的。這樣,您的單一實體無線適配器將轉換為兩個虛擬

熟悉《西方世界》的觀眾都了解,這部劇設定在未來世界的一個巨大高科技成人主題樂園中,機器人們具備與人類相似的行為能力,能夠記憶所見所聞,重複核心故事情節。每天,這些機器人都會被重置,回到初始狀態在斯坦福論文《GenerativeAgents:InteractiveSimulacraofHumanBehavior》發布後,這種情景不再僅限於影視劇中,AI已經成功復現了這一場景Smallville的“虛擬小鎮」概覽圖論文網址:https://arxiv.org/pdf/2304.03442v1.pdf

Java是一種流行的程式語言,具有強大的檔案處理功能。在Java中,遍歷資料夾並取得所有檔案名稱是一種常見的操作,可以幫助我們快速定位和處理特定目錄下的檔案。本文將介紹如何在Java中實作遍歷資料夾並取得所有檔案名稱的方法,並提供具體的程式碼範例。 1.使用遞歸方法遍歷資料夾我們可以使用遞歸方法遍歷資料夾,遞歸方法是一種自身呼叫自身的方式,可以有效地遍歷資料夾中

9月25日消息,華為商城開始接受AITO旗下問界M9汽車的預訂。這款車被定位為全景智慧旗艦SUV,具備引人注目的特質。消費者只需支付5000元的意向金,即可抵扣高達10,000元的尾款新車將提供兩個版本,分別是增程版和純電版。預計售價在50萬元到60萬元之間,使得它在高階SUV市場上具有競爭力。預計問界M9將在2023年第四季正式上市,目前還沒有公開其具體配置的資訊據了解,M9車型採用了家族化的設計語言。從官方發布的兩張圖片來看,車輛的側面線條流暢,並且車門把手採用了隱藏式設計,為整車增添了科技

Microsoft今天宣布了Dynamics365客戶服務中SharePoint與Copilot整合的早期預覽版。這種整合將使客戶服務代理能夠存取更廣泛的知識來源,從而提高生產力並改善客戶互動。目前,Dynamics365客戶服務中的Copilot利用內部知識庫為客戶服務代理提供指導。透過建議聊天和草稿電子郵件內容,Copilot已成為提高客戶服務團隊生產力的關鍵工具。但是,客戶回饋表明該工具需要利用來自外部資源(如SharePoint)的知識。 SharePoint協同駕駛整合為了回應這些回饋,

PHPglob()函數使用範例:遍歷指定資料夾中的所有文件在PHP開發中,經常需要遍歷指定資料夾中的所有文件,以實現檔案批次操作或讀取。 PHP的glob()函數正是用來實現這種需求的。 glob()函數可以透過指定一個通配符匹配模式,來取得指定資料夾中符合條件的所有檔案的路徑資訊。在這篇文章中,我們將會示範如何使用glob()函數來遍歷指定資料夾中的所有文件

當你和朋友隔著冷冰冰的手機螢幕聊天時,你得猜猜對方的語氣。當Ta發語音時,你的腦海中還能浮現出Ta的表情甚至動作。如果能視訊通話顯然是最好的,但在實際情況下並不能隨時撥打視訊。如果你正在與遠端朋友聊天,不是透過冰冷的螢幕文字,也不是缺乏表情的虛擬形象,而是一個逼真、動態、充滿表情的數位虛擬人。這個虛擬人不僅能夠完美地復現你朋友的微笑、眼神,甚至是細微的肢體動作。你會不會感到更的親切和溫暖呢?真是體現了那一句「我會順著網路線爬過來找你的」。這不是科幻想像,而是在實際中可以實現的技術了。臉部表

概念差異:Iterator:Iterator是一個接口,代表一個從集合中取得值的迭代器。它提供了MoveNext()、Current()和Reset()等方法,讓你遍歷集合中的元素,並對目前元素進行操作。 Iterable:Iterable也是一個接口,代表一個可迭代的物件。它提供了Iterator()方法,用於傳回一個Iterator對象,以便於遍歷集合中的元素。使用方式:Iterator:要使用Iterator,需要先取得一個Iterator對象,然後呼叫MoveNext()方法來移動到下一
