Porting Palacios to the Linux Kernel EECS441 – Resource Virtualization
210 likes | 376 Vues
Porting Palacios to the Linux Kernel EECS441 – Resource Virtualization. Steven Chen, Jason Lee, Pill Park. Overview. Goals and Thoughts Visualization Approach Status Implementation Functions Difficulties Looking to the Future Acknowledgements, Thanks Questions. Goals and Thoughts.
Porting Palacios to the Linux Kernel EECS441 – Resource Virtualization
E N D
Presentation Transcript
Porting Palacios to the Linux KernelEECS441 – Resource Virtualization Steven Chen, Jason Lee, Pill Park
Overview • Goals and Thoughts • Visualization • Approach • Status • Implementation • Functions • Difficulties • Looking to the Future • Acknowledgements, Thanks • Questions Chen, Lee, Park - Team Linux, EECS441
Goals and Thoughts • Have the Palacios VMM embedded into Linux • Have Palacios compiled into Linux • Have a guest successfully run in Palacios on Linux • Linux kernel host for Palacios • Would facilitate more widespread usage of Palacios • Additional platform for Palacios • Current host OSes with Palacios embedded • Kitten LWK (Sandia National Labs) • GeekOS (University of Maryland) Chen, Lee, Park - Team Linux, EECS441
Visualization Palacios on Kitten Palacios on Linux Applications Applications Guest OS Linux Applications Guest OS Palacios VMM Palacios VMM Kitten LWK Linux Kernel x86-64, Cray XT IA-32, x86-64 Chen, Lee, Park - Team Linux, EECS441
Approach • Initial Approach • Pattern matching between Kitten LWK, Linux kernel • Tedious process • May eventually be necessary anyways • Revised Approach • Statically link Palacios to Linux build process • Troubleshoot boot process • Troubleshoot Palacios load process • Load guest blob • Deal with panics • Deal with unimplemented functions (pattern matching?) • Get to a terminal and working guest eventually Chen, Lee, Park - Team Linux, EECS441
Status • Statically link Palacios to Linux build process • Done • Troubleshoot boot process • Troubleshoot Palacios load process • Load guest blob • Done • Deal with panics • In Progress • Deal with unimplemented functions (pattern matching?) • In Progress • Get to a terminal and working guest eventually • In Progress Chen, Lee, Park - Team Linux, EECS441
Status – Serial Output Chen, Lee, Park - Team Linux, EECS441
Implementation • Statically Linking • Added lines to Makefile • Links libv3vee.a into the Linux kernel 666: # Link the LWK with the Palacios virtual machine monitor 667: libs-$(CONFIG_PALACIOS)+=--whole-archive $(shell echo $(CONFIG_PALACIOS_PATH)/libv3vee.a)--no-whole-archive • Starting Palacios • Added lines to init/main.c 847:int palacios_init(void); 896:#ifdef CONFIG_PALACIOS 897: palacios_init(); 898: #endif Chen, Lee, Park - Team Linux, EECS441
Functions – Adding print functionalityarch/x86/kernel/palacios/palacios.c 20staticvoid 21 palacios_print( 22constchar* fmt, 23 ... 24) 25{ 26 va_list ap; 27 va_start(ap, fmt); 28 vprintk(fmt, ap); 29 va_end(ap); 30 31return; 32} Chen, Lee, Park - Team Linux, EECS441
Functions – Panic for diagnosticsarch/x86/kernel/palacios/palacios.c 210staticvoid 211 palacios_interrupt_cpu( 212struct guest_info * vm, 213int cpu_id 214) 215{ 216 panic("palacios_interrupt_cpu"); 217return; 218} Chen, Lee, Park - Team Linux, EECS441
Functions – Migrating Palacios’ Codearch/x86/kernel/palacios/palacios.c alloc/free for Kitten alloc/free for Linux staticvoid* palacios_alloc(unsignedint size) { return kmem_alloc(size); } staticvoid palacios_free(void* addr) { return kmem_free(addr); } staticvoid* palacios_alloc(unsignedint size) { return kmalloc(size, GFP_KERNEL); } staticvoid palacios_free(void* addr) { kfree(addr); return; } Chen, Lee, Park - Team Linux, EECS441
Functions – Allocating Pagesarch/x86/kernel/palacios/palacios.c staticvoid*palacios_allocate_pages(int num_pages){int order =0; bool extra =false;printk("will get %d pages\n", num_pages);int i =0;for(; i <20; i++){int temp = num_pages;if(num_pages >1) { num_pages = num_pages /2; order++;} if(num_pages ==1) {if(extra){order++;}break;}if((temp %2)==1){ extra =true;}} if(order >=14){ printk("Asked for order==%d, getting order==%d pages\n",order,14); order =14;}void*p = __get_free_pages(GFP_KERNEL, order);if(p){ head = insert(head,(longlong) p, order); p = __pa(p);return p;} Chen, Lee, Park - Team Linux, EECS441
Functions – Freeing Pagesarch/x86/kernel/palacios/palacios.h Will use a binary search tree to recall pages to be freed struct node {struct node* left;struct node* right;longlong address;int valid;int order;};externstruct node* lookup(struct node* node,longlong start_addr);externstruct node* NewNode(longlong ptr,int order);externstruct node* insert(struct node* node,longlong ptr,int order); Chen, Lee, Park - Team Linux, EECS441
Functions – Freeing Pagesarch/x86/kernel/palacios/palacios.c staticvoidpalacios_free_page(void* page_paddr){struct node* node = lookup(head, page_paddr); free_pages(page_paddr, node->order); node->valid =0;} Chen, Lee, Park - Team Linux, EECS441
Functions – Freeing Pagesarch/x86/kernel/palacios/palacios.c struct node* lookup(struct node* node,longlong start_addr){if(!node){return0;}else{if(start_addr == node->address){return node;}else{if(start_addr < node->address){return lookup(node->left, start_addr);}else{return lookup(node->right, start_addr);}}}}//end of the function Chen, Lee, Park - Team Linux, EECS441
Functions – Making it by Faking itarch/x86/kernel/palacios/palacios.c Getting to larger issues by hacking around smaller issues… staticunsignedintpalacios_get_cpu_khz(void){ printk("palacios_get_cpu_khz() lying to Palacios and saying 1 GHz\n");return1000000;} Chen, Lee, Park - Team Linux, EECS441
DifficultiesOS Hooks to Interrupts /** Structure used by the Palacios hypervisor to interface with the host kernel. */struct v3_os_hooks palacios_os_hooks ={ .print= palacios_print, .allocate_pages= palacios_allocate_pages, .free_page= palacios_free_page, .malloc= palacios_alloc, .free= palacios_free, .vaddr_to_paddr= palacios_vaddr_to_paddr, .paddr_to_vaddr= palacios_paddr_to_vaddr, .hook_interrupt= palacios_hook_interrupt, .ack_irq= palacios_ack_interrupt, .get_cpu_khz= palacios_get_cpu_khz, .start_kernel_thread= palacios_start_kernel_thread, .yield_cpu= palacios_yield_cpu, .mutex_alloc= palacios_mutex_alloc, .mutex_free= palacios_mutex_free, .mutex_lock= palacios_mutex_lock, .mutex_unlock= palacios_mutex_unlock, .get_cpu= palacios_get_cpu, .interrupt_cpu= palacios_interrupt_cpu, .call_on_cpu= palacios_xcall, .start_thread_on_cpu= palacios_start_thread_on_cpu,}; Chen, Lee, Park - Team Linux, EECS441
Difficulties – Keyboard IRQsarch/x86/kernel/palacios/palacios.c // hook keyboard host events for deliver to palaciosint i =1;for(; i <200; i++){ error = request_irq( i,&palacios_keyboard_interrupt,0,"keyboard", NULL);if(!error){break;}}//forif(error){ printk("request irq for keyboard failed\n"); panic("request keyboard irq failed");} Chen, Lee, Park - Team Linux, EECS441
Looking to the Future • Currently, 64MB limit on page_alloc • 214 [16K] * 4KB pages = 64MB • Short term - make a small guest • Long term – resolve memory limits • Properly Implement Interrupts • Improve the Palacios-Linux interface • Look to the Palacios-Kitten interface for reference • Have our code utilize Palacios data structures • Support multi-core execution Chen, Lee, Park - Team Linux, EECS441
Acknowledgements, Thanks • Professor Peter Dinda • UA Andy Gocke • Lei Xia • V3VEE development group Chen, Lee, Park - Team Linux, EECS441
Questions? Chen, Lee, Park - Team Linux, EECS441