Xen启动过程分析(还是分享过来吧,找了好长时间)
2016-03-28 23:41
267 查看
XEN启动过程
1 当加电后首先是BIOS自检、Grub引导。Xen遵循Multiboot引导规范,它需要从Grub读入内存信息,通过置位标志位第1位来实现的。
主要过程是从grub-xen(head.S, trampoline.S, x86_32.S,位于\xen\arch\x86\boot中:),
head.S:装入GDT(trampoline_gdt); 进入保护模式;初始化页表,将线性空间的0-12M和__PAGE_OFFSET-__PAGE_OFFSET+12M都映射到物理地址的0-12M;而将线性空间的12M-16M映射到物理地址的12M-16M;解析早期命令行参数;跳转到trampoline_boot_cpu_entry;
trampoline.S:进入实模式,读取内存,磁盘,显示信息;再次进入保护模式,装入新的GDT(gdt_table);加载前面初始化了的页表,启用分页机制,跳转到__high_start。然后就是x86_32.S文件。
2.x86_32.S是从Grub进入Xen的入口文件。Grub根据镜像头信息获得入口地址,然后读入整个镜像,最后把控制权交给Xen。
可以使用readelf命令来查看编译后生成的Xen的内核,它表明文件类型为可执行文件,并且程序的入口点是Oxl0000(原本这是Linux内核的位置),这表明Xen被引导程序放在了物理内存1M的位置上。
在x86_32.S的start入口点上,主要是为进行后续工作做准备,包括简单地设置GDT、IDT以及初始化分页等。然后start将保存着引导程序启动信息地址的EBX压栈,再调用真正的初始化流程函数。<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />
3.__startxen()函数中首先会从启动信息中获取物理内存分配情况,初始化E820内存图。
物理内存是只有Xen才有权限进行管理和分配的,无论是Domain0还是DomainU,它们得到的都是Xen给它们的物理内存假相。
4.之后是分页初始化、IRQ中断初始化、调度程序初始化、异常处理程序表初始化、时间设置、安全机制设置等初始化工作,并且Xen会初始化一个空闲虚拟域(Idle Domain),当没有合适的虚拟域可以运行的时候,Xen会选择空闲虚拟域来运行,这很类似于Linux中的init进程。
5.当Xen初始化工作结束后,便开始设置Domain0的数据结构。
每个虚拟域都有一个struct domain结构体,在这里主要定义了它的ID、共享信息、内存分配、虚拟CPU、事件通道和授权表等。分配好DomainO的数据结构,Xen将通过construct_dom0()函数来将主控域的运行环境设置好。
6。然后Xen将控制权交给Domain0中的Linux,而自己进入idie_loop。主控域得到控制权后,开始自己的引导过程,只是它需要的信息是从xen_start_info数据结构中获取。进入Domain0的EIP指向_start_32,它会再跳转到start_kernel,之后的启动流程就和Linux的正常启动流程基本一样了。
相关文章推荐
- Spring Bean的生命周期管理方法
- 79. Word Search
- hadoop生态系统学习之路(三)java实现上传文件(本地或ftp)至hdfs
- 快速排序算法
- POJ 1064 切绳子 二分搜索求一个可行解
- ES6学习小计
- 拉格朗日乘子法(编辑中)
- Eclipse默认字体CourierNew
- 重写equals 方法
- [Think In Java]基础拾遗4 - 并发
- NY145 聪明的小柯
- 又被拒了,心情不好
- Emmet
- 进程间通信之-信号量semaphore--linux内核剖析(十)
- LeetCode 231 Power of Two(三解)
- 无线键盘的安全性分析与探究
- StatePattern
- 【java】 java 集合类UML图
- 大整数加减乘除 c实现
- UVA679