超级调用实现总结
这两天的目标是实现一个超级调用,其中遇到了很多问题以及还没有弄清楚的现象,这里将所有过程记录一下,试图发现背后的根本原因。
实践过程
环境:dom0(Ubuntu14.04) + domU(Debian)
过程记录
设置系统调用号(使用的是reversed for client 的39)
xen/include/public/xen.h #define __HYPERVISOR_print_string
更新系统调用
/xen/arch/x86/x86_64/entry.S .quard do_print_string
定义函数头文件
/xen/include/asm-x86/hypercall.h extern int do_print_string(char* message);
定义函数
/xen/arch/x86/mm.c
使用
添加该hypercall
xen/arch/x86/hvm/hvm.c HYPRTCALL(do_print_string)
编写测试程序Hypervisor_test.c
本人是在/home/documents文件夹下。编写的。
实验现象
1.dom0 + print_string
重启前:fd=3;ret=-1
重启后:fd=3;ret=1;并且输入sudo xl md之后可以看到函数中printk()的记录;表示超级调用成功。
make install和重启之间的区别在于:
make install只是将Xen重新安装,但是底层的寄存器和内存的内容还是没有修改,重启的时候会重新加载Xen。
2.dom0 + create_sim
invalid operands (*und* and *abs* sections) for *
错误原因还没有找到,这个报错信息是说符号”*”使用有问题…….
在实现过程中与原教程之家的区别有这么几点:
- Xen版本:4.0.1&&4.4.0
- Dom-U和Dom-0版本的不同:Fedora+Ubuntu&&Ubuntu+Debian
- 有一两个文件所在的路径不精准。涉及到位数的不同
3.domU + print_message
domU没有编译:编译测试C代码的时候找不到
open:no such file or directory
确实是没有/proc/xen/privcmd;但是dom0中是有的。
可能的原因是:domU里边没有安装相应驱动?
compile and install the xen tools in the guest
……继续做。。。
4.domU + create_sim
invalid operands (*und* and *abs* sections) for *
错误原因还没有找到,这个报错信息是说符号”*”使用有问题…….
待实现
Making a New Hypercall && Invoking It from userland via Privcmd
这篇也是在dom0里边发出的超级调用。不同的是,使用privcmd的方式不同,他没有直接open(“/proc/xen/privcmd”)而是把测试代码放在已有的文件中,利用该文件下的privcmd……
疑问
1.dom0的虚拟化类型
dom0属于PV还是HVM?。。。。目前的感觉是PV
技能GET
1.创建/启动/删除 dom
编写xxx.cfg
查看:sudo xl list
启动:sudo xl create xxx.cfg
删除:sudo x
查看日志信息:sudo xl dm
Xen:xl&&xm。分别是两种不同的xen中的命令。
xm:命令行工具,接收用户输入通过 xml rpc 传递到 Xend。
2.scp/tar/debian网络信息
#从服务器上下载文件
scp username@servername:/path/filename /var/www/local_dir(本地目录)
#上传本地文件到服务器
scp /path/filename username@servername:/path
tar -cf archive.tar foo bar(create tar/compress files)
tar -xf archive.tar(extracst files)
ip address
3.gcc编译
64bit-platform
gcc test.c -o test_m32 -m32 #32bit,intel 80386
gcc test.c -o test_xm32 -mx32 #32bit,x86_64
gcc test.c -o #64bit,x64