             +-------------------------+
             |         OS 211          |
             |  TASK 2: USER PROGRAMS  |
             |     DESIGN DOCUMENT     |
             +-------------------------+

---- GROUP ----

>> Fill in the names and email addresses of your group members.

FirstName LastName <email@domain.example>
FirstName LastName <email@domain.example>
FirstName LastName <email@domain.example>

---- PRELIMINARIES ----

>> If you have any preliminary comments on your submission, or notes for the
>> markers, please give them here.

>> Please cite any offline or online sources you consulted while preparing your 
>> submission, other than the PintOS documentation, course text, lecture notes 
>> and course staff.

               ARGUMENT PASSING
               ================

---- DATA STRUCTURES ----

>> A1: (1 mark)
>> Copy here the declaration of each new or changed `struct' or `struct' member, 
>> global or static variable, `typedef', or enumeration. 
>> Identify the purpose of each in roughly 25 words.

---- ALGORITHMS ----

>> A2: (2 marks)
>> How does your argument parsing code avoid overflowing the user's stack page?
>> What are the efficiency considerations of your approach?

---- RATIONALE ----

>> A3: (2 marks)
>> PintOS does not implement strtok() because it is not thread safe. 
>> Explain the problem with strtok() and how strtok_r() avoids this issue.

>> A4: (3 marks)
>> In PintOS, the kernel separates commands into an executable name and arguments. 
>> In Unix-like systems, the shell does this separation. 
>> Identify three advantages of the Unix approach.

                 SYSTEM CALLS
                 ============

---- DATA STRUCTURES ----

>> B1: (6 marks) 
>> Copy here the declaration of each new or changed `struct' or `struct' member, 
>> global or static variable, `typedef', or enumeration. 
>> Identify the purpose of each in roughly 25 words.

---- ALGORITHMS ----

>> B2: (2 marks)
>> Describe how your code ensures safe memory access of user provided data from
>> within the kernel. 

>> B3: (3 marks)
>> Suppose that we choose to verify user provided pointers by validating them 
>> before use (i.e. using the first method described in the spec).
>> What is the least and the greatest possible number of inspections of the page
>> table (e.g. calls to pagedir_get_page()) that would need to be made in the 
>> following cases?
>> a) A system call that passes the kernel a pointer to 10 bytes of user data.
>> b) A system call that passes the kernel a pointer to a full page 
>>    (4,096 bytes) of user data.
>> c) A system call that passes the kernel a pointer to 4 full pages 
>>    (16,384 bytes) of user data.
>> You must briefly explain the checking tactic you would use and how it applies 
>> to each case to generate your answers.

>> B4: (2 marks)
>> When an error is detected during a system call handler, how do you ensure 
>> that all temporarily allocated resources (locks, buffers, etc.) are freed?

>> B5: (8 marks)
>> Describe your implementation of the "wait" system call and how it interacts 
>> with process termination for both the parent and child.

---- SYNCHRONIZATION ----

>> B6: (2 marks)
>> The "exec" system call returns -1 if loading the new executable fails, so it 
>> cannot return before the new executable has completed loading. 
>> How does your code ensure this? 
>> How is the load success/failure status passed back to the thread that calls 
>> "exec"?

>> B7: (5 marks)
>> Consider parent process P with child process C. 
>> How do you ensure proper synchronization and avoid race conditions when: 
>>   i) P calls wait(C) before C exits?
>>  ii) P calls wait(C) after C exits?
>> iii) P terminates, without waiting, before C exits?
>>  iv) P terminates, without waiting, after C exits?
>> Additionally, how do you ensure that all resources are freed regardless of 
>> the above case? 

---- RATIONALE ----

>> B8: (2 marks)
>> Why did you choose to implement safe access of user memory from the kernel in 
>> the way that you did?

>> B9: (2 marks)
>> What advantages and disadvantages can you see to your design for file 
>> descriptors?
