210 likes | 367 Views
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.
E N D
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