IO指令模擬流程

2021-10-08 09:58:23 字數 2291 閱讀 7268

e6 70 66 9c 66 9d是一條寫指令,以它為例來講解一下io指令模擬流程。

vmx_vmexit_handler→handle_mmio

指令由虛擬機器下發,由xen收到進行處理。

asmlinkage voidvmx_vmexit_handler(struct cpu_user_regs *regs)……}

write_io是乙個函式指標,指向hvmemul_write_io,

hvmemul_write_io→hvmemul_do_pio→hvmemul_do_io

下面介紹乙個重要狀態標誌curr->arch.hvm_vcpu.io_state,它負責記錄指令模擬所處的階段。

模擬指令第一次進入hvmemul_do_io時,其狀態正常都應該是hvmio_none,表示還未開始io指令模擬。

另外乙個重要的狀態標誌p->state,它負責記錄所處的io請求及響應的階段。

其初始狀態為state_ioreq_none,表示還沒有傳送io請求。

static int hvmemul_do_io(

int is_mmio, paddr_t addr, unsigned long *reps, int size,

paddr_t ram_gpa, int dir, int df, void *p_data)

else

隨後,該請求通過hvm_send_assist_req交給qemu來處理。

switch ( rc )

hvm_send_assist_req將p->state置為state_ioreq_ready,傳送io請求準備好啦,然後通知事件通道。

bool_t hvm_send_assist_req(struct vcpu *v)

}vcpu排程時schedule會觸發hvm_do_resume,

schedule→context_switch→schedule_tail→vmx_do_resume→hvm_do_resume

hvm_do_resume中會通過while迴圈反覆檢查p→state狀態,若為state_ioreq_ready或state_ioreq_inprocess則觸發等待wait_on_xen_event_channel,然後,再次進入while判斷,直至狀態為state_ioresp_ready時,觸發hvm_io_assist。

void hvm_do_resume(struct vcpu *v)

}hvm_io_assist中將p→state置為state_ioreq_none,將io_state置為hvmio_none,寫io到此是走完了全程。

voidhvm_io_assist(void)

於是二次進入hvmemul_do_io,將io_state置為hvmio_none。讀指令返回x86emul_okay,模擬成功。

switch ( curr->arch.hvm_vcpu.io_state )

{case hvmio_none:

break;

case hvmio_completed:

curr->arch.hvm_vcpu.io_state =hvmio_none;

if ( p_data == null )

return x86emul_unhandleable;

goto finish_access;

x86_emulate中做指令模擬的具體動作,若模擬成功返回x86emul_okay,若需要重試模擬同一條指令返回x86emul_retry,若遇到無法處理的狀況返回x86emul_unhandleable,若遇到異常返回x86emul_exception。

若返回x86emul_okay,則表示可以執行下一條指令,會走回寫流程,將改變後的eip值寫回暫存器,否則直接返回,則暫存器中eip值不變,下次進入還執行當前指令。

intx86_emulate(

struct x86_emulate_ctxt *ctxt,

const struct x86_emulate_ops  *ops)

{writeback:

/* commit shadow register state. */

_regs.eflags &= ~e***_rf;

*ctxt->regs = _regs;

done:

return rc;

2023年5月22日上傳

關於io指令的問題

p uint16 t ata ata io base 2 addr byte t aa.aa low outb p byte t 0xff byte t sn outb p addr outb p addr outb p addr outb p addr kprintf send ata comma...

IO口模擬UART串列埠

由於博主近期參與了合泰晶元的專案開發,所以此次就用合泰微控制器來測試 具體型號為ht66f70a ide為ht ide3000 合泰官方 首先需要了解兩個概念 1.幀 是序列通訊的資料單元,其中各位的意義如下 起始位 先發出乙個邏輯 0 的訊號,表示傳輸資料的開始。資料位 緊接著起始位之後,資料位的...

CPU執行指令和磁碟IO

cpu的計算時間比磁碟io要快得多的多,而且增長速度也比磁碟io的增長快得多。平均來說,一次io的時間,cpu就能執行40萬條指令.所以我們寧願用指令來處理,而不是依賴於io.所以很多情況下,我們寧願進行一次複雜的cpu計算,以此來減少磁碟的io 磁碟7200轉每秒,1轉占用1 120秒,8.3毫秒...