Presentation is loading. Please wait.

Presentation is loading. Please wait.

CS 5600 Computer Systems Project 2: User Programs in Pintos.

Similar presentations

Presentation on theme: "CS 5600 Computer Systems Project 2: User Programs in Pintos."— Presentation transcript:

1 CS 5600 Computer Systems Project 2: User Programs in Pintos

2 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

3 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

4 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 $ pintos-mkdisk filesys.dsk --filesys-size=2 $ pintos -p../../examples/echo -a echo -- -f -q run 'echo x' 4 Total size of the file system, in MB Copy the ‘echo’ program to the Pintos file system Format the file system

5 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

6 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; } 6 At a minimum, you will need to place argc and *argv on the initial stack, since they are parameters to main()

7 Program Loading Flowchart 7 process_execute()thread_create()start_process() load() file_read() load_segment() validate_segment() install_page() setup_stack() install_page() Start the new process (1) (2) Parse cmd line args, pass to load() Pass the cmd line args to the new process on the stack

8 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

9 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); } void exit (int status) { syscall1 (SYS_EXIT, status); } 9 pid_t exec (const char *file) { return (pid_t) syscall1 (SYS_EXEC, file); } These are syscalls. They are implemented in the kernel, not in userland.

10 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

11 On the Kernel Side… userprog/syscall.c 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 Called during main(), sets syscall_handler() to be run whenever int 0x30 is received

12 Example Syscall Flowchart (exit) 12 User Program exit() syscall1() /lib/user/syscall.c /threads/intr-stubs.S intr30_stub() intr_entry() intr_handler() /threads/interrupt.c syscall_handler() /userprog/syscall.c exit() User Space Kernel Space intr_exit() Your changes will almost all be in here

13 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

14 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

15 Modified Files threads/thread.c13 threads/thread.h26 userprog/exception.c8 userprog/process.c247 userprog/syscall.c468 userprog/syscall.h1 6 files changed, 725 insertions(+), 38 deletions(-) 15 Setting up argv and argc Implementing syscalls

16 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

17 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

18 QUESTIONS? DUE: March 3 11:59:59PM EST 18

Download ppt "CS 5600 Computer Systems Project 2: User Programs in Pintos."

Similar presentations

Ads by Google