xen新增和呼叫hypercall (zz)
在linux系統中新增新的系統呼叫,一般需要三個步驟:
1. 註冊新的系統呼叫號
2. 更新系統呼叫表
3. 新增新函式
在xen中新增乙個 hypercall,類似於在linux中新增乙個系統調. 基本上也是上面幾個步驟。現在舉個具體的例子:
比如我們要在xen中新增乙個列印訊息的hypercall,引數有乙個,型別為char*, 代表我們要列印的訊息. 函式原型為:
do_print_string(char* message)
1. 首先註冊乙個hypercall呼叫號。
xen/include/public/xen.h
#define __hypervisor_kexec_op 37//原有超級呼叫
#define __hypervisor_print_string 38//新增超級呼叫號為38
2.更新系統呼叫表
/xen/arch/x86/x86_32/entry.s
entry(hypercall_table)
.long do_kexec_op
.long do_print_string
entry(hypercall_args_table)
.byte 2 /* do_kexec_op */
.byte 1 /* do_print_string */要寫在對應的位置
3. 定義函式標頭檔案
/xen/include/asm-x86/hypercall.h
extern int do_kexec(unsigned long op, unsigned arg1, xen_guest_handle(void) uarg);
extern int do_print_string(char * message);//處理函式宣告
4.定義函式(函式定義在合適的檔案中,這個例子採用mm.c)
/xen/arch/x86/mm.c
int do_print_string(char * message)
if(message)
printk("the message is :n%sn", message);
else printk("no message!n");
return 1;
重新編譯安裝
make dist
make install
重新製作img
mkinitrd -v -f initrd-.8-xen.img 2.6.18.8-xen
重啟呼叫新hypercall
#include
#include
#include
#include
#include
#include
#include
#include
#include
int main(int argc, char *argv)
int fd, ret;
char * message;
if (argc != 2)
fd = open("/proc/xen/privcmd", o_rdwr);
if (fd < 0) else
printf("fd = %dn", fd);
ret = ioctl(fd, ioctl_privcmd_hypercall, &hcall);
printf("ret = %dn", ret);
也可以採用載入模組的形式,在核心空間之間呼叫hypercall來測試。編譯該檔案,並測試如下:
gcc -o a hypercall_test.c
./a hello!
檢視日誌檔案,檢測是否新的hypercall安裝成功:(linux下的log 一般在/var/log/mesages,而xen下的日誌採用xm dm命令檢視)
Xen建立 Domain過程(函式呼叫關係)
從xm命令列開始到xen核心的函式呼叫過程 xm create vm config file xen3.4 或4.1 原始碼包 1 tools python xend xm main.py 2 tools python xend xm create.py 3 tools python xend xe...
Xen基本機制和策略
一.啟動頁和共享頁 啟動頁 由xen對映到guestos記憶體空間的乙個頁面,包括核心啟動所需的所有資訊。頁框位址,首個載入模組的位址,記憶體頁面數等資訊。vcpu狀態 是否有未處理的事件 guest os狀態,xen的事件通道。二.hypercall 1.利用int0x82陷阱。hypercall...
簡述KVM架構和Xen架構
暑假最後一篇更新,因為,明天我就回學校了。以下均為個人理解,如果有不對的地方還望各位dalao不吝賜教。虛擬化 虛擬化是通過hypervisor程式實現的,hypervisor的作用是將硬體虛擬化提供給多個作業系統使用,是虛擬化技術的核心。虛擬化分為兩種 1型虛擬化和2型虛擬化。kvm架構 先來看一...