Enhancing User Programs in Pintos
Pintos system for user programs needs improvements by implementing argument passing, Pintos system APIs, process management, OS shutdown, and file I/O. Additionally, formatting the file system, program loading, and setting up the stack are essential tasks for enhancing user programs in Pintos.
Download Presentation
Please find below an Image/Link to download the presentation.
The content on the website is provided AS IS for your information and personal use only. It may not be sold, licensed, or shared on other websites without obtaining consent from the author. Download presentation by click this link. If you encounter any issues during the download, it is possible that the publisher has removed the file from their server.
E N D
Presentation Transcript
CS 5600 Computer Systems Project 2: User Programs in Pintos
User Programs in Pintos Pintos already implements a basic program loader Can parse ELF executables and start them as a process with one thread Loaded programs can be executed But this system has problems: User processes crash immediately :( System calls have not been implemented 2
Your Goals 1. Implement argument passing Example: ls sort of works but ls l a doesn t work You must pass argv and argc to user programs 2. Implement the Pintos system APIs Process management: exec(), wait(), exit() OS shutdown: halt() File I/O: open(), read(), write(), close() Can be used for writing to the screen (write stdout) and reading from the keyboard (read stdin) 3
Formatting the File System In this project, you will be running user programs within Pintos Thus, you must format a file system to store these user programs on Total size of the file system, in MB $ pintos-mkdisk filesys.dsk --filesys-size=2 $ pintos -p ../../examples/echo -a echo -- -f -q run 'echo x' Copy the echo program to the Pintos file system Format the file system 4
Program Loading userprog/process.c contains the code for loading ELF files /* Executable header. This appears at the very beginning of an ELF binary. */ struct Elf32_Ehdr { } /* Program header. There are e_phnum of these, starting at file offset e_phoff. */ struct Elf32_Phdr { } /* Loads an ELF executable from FILE_NAME into the current thread. Stores the executable's entry point into *EIP and its initial stack pointer into *ESP. Returns true if successful, false otherwise. */ bool load (const char *file_name, void (**eip) (void), void **esp) { } 5
Setting Up The Stack userprog/process.c /* Create a minimal stack by mapping a zeroed page at the top of user virtual memory. */ static bool setup_stack (void **esp) { uint8_t *kpage; bool success = false; kpage = palloc_get_page (PAL_USER | PAL_ZERO); if (kpage != NULL) { success = install_page (((uint8_t *) PHYS_BASE) - PGSIZE, kpage, true); if (success) *esp = PHYS_BASE; else palloc_free_page (kpage); } return success; } At a minimum, you will need to place argc and *argv on the initial stack, since they are parameters to main() 6
Program Loading Flowchart Parse cmd line args, pass to load() (2) process_execute() thread_create() start_process() (1) Start the new process load() (2) (1) file_read() setup_stack() Pass the cmd line args to the new process on the stack load_segment() install_page() validate_segment() install_page() 7
Syscalls in Pintos Pintos uses int 0x30 for system calls Pintos has code for dispatching syscalls from user programs i.e. user processes will push parameters onto the stack and execute int 0x30 In the kernel, Pintos will handles int 0x30 by calling syscall_handler() in userprog/syscall.c static void syscall_handler (struct intr_frame *f) { printf ("system call!\n"); thread_exit (); } 8
Syscalls from the user process lib/user/syscall.h Defines all the syscalls that user programs can use lib/user/syscall.c void halt (void) { syscall0 (SYS_HALT); } pid_t exec (const char *file) { return (pid_t) syscall1 (SYS_EXEC, file); } void exit (int status) { syscall1 (SYS_EXIT, status); } These are syscalls. They are implemented in the kernel, not in userland. 9
Using int 0x30 to Enter the Kernel lib/user/syscall.c /* Invokes syscall NUMBER, passing argument ARG0, and returns the return value as an `int'. */ #define syscall1(NUMBER, ARG0) \ ({ \ int retval; \ asm volatile \ ("pushl %[arg0]; pushl %[number]; int $0x30; addl $8, %%esp" \ : "=a" (retval) \ : [number] "i" (NUMBER), \ [arg0] "g" (ARG0) \ : "memory"); \ retval; \ }) 10
On the Kernel Side userprog/syscall.c Called during main(), sets syscall_handler() to be run whenever int 0x30 is received void syscall_init (void) { intr_register_int (0x30, 3, INTR_ON, syscall_handler, "syscall"); } static void syscall_handler (struct intr_frame *f) { printf ("system call!\n"); thread_exit (); } 11
Example Syscall Flowchart (exit) Kernel Space User Space /userprog/syscall.c User Program Your changes will almost all be in here exit() syscall_handler() exit() intr_handler() syscall1() /threads/interrupt.c /lib/user/syscall.c intr_entry() intr_exit() intr30_stub() /threads/intr-stubs.S 12
Other Things Pintos Gives You Basic virtual memory management User processes live in virtual memory, cannot access the kernel directly Kernel may access all memory You will enhance this in Project 3 Trivial filesystem implementation Can store user programs You will enhance this in Project 4 13
Key Challenges Having the kernel read/write memory in user processes Necessary for reading API parameters from the user stack E.g. a string passed via a pointer Need to understand the virtual memory system Handling concurrent processes Remember, processes can call exec() Handling file descriptors and standard I/O 14
Modified Files threads/thread.c threads/thread.h userprog/exception.c userprog/process.c userprog/syscall.c userprog/syscall.h 6 files changed, 725 insertions(+), 38 deletions(-) 13 26 8 247 468 1 Setting up argv and argc Implementing syscalls 15
Grading 15 points total To receive full credit: Turn in working, well documented code that compiles successfully and completes all tests (50%) Turn in a complete, well thought our design document (50%) If your code doesn t compile or doesn t run, you get zero credit Must run on the CCIS Linux machines! All code will be scanned by plagiarism detection software
Turning In Your Project 1. Register yourself for the grading system $ /course/cs5600f14/bin/register-student [NUID] 2. Register your group All group members must run the script! $ /course/cs5600f14/bin/register project2 [team name] 3. Run the turn-in script Two parameters: project name and code directory $ /course/cs5600f14/bin/turnin project2 ~/pintos
DUE: March 3 11:59:59PM EST QUESTIONS? 18