X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=doc%2Fvm.texi;h=fdbc5c68c492b2900745d29ad6d40cc9ab211080;hb=3edcfedb8e62970f3293fa676b6691f8658c3c11;hp=3210bbcc83dd021a16f48ad78f7a9284ead20f21;hpb=111f774134415bb8da9b3882175603f2693026d9;p=pintos-anon diff --git a/doc/vm.texi b/doc/vm.texi index 3210bbc..fdbc5c6 100644 --- a/doc/vm.texi +++ b/doc/vm.texi @@ -260,7 +260,7 @@ page fault might only indicate that the page must be brought in from a file or swap. You will have to implement a more sophisticated page fault handler to handle these cases. Your page fault handler, which you should implement by modifying @func{page_fault} in -@file{threads/exception.c}, needs to do roughly the following: +@file{userprog/exception.c}, needs to do roughly the following: @enumerate 1 @item @@ -576,7 +576,7 @@ bytes below the stack pointer. You will need to be able to obtain the current value of the user program's stack pointer. Within a system call or a page fault generated -by a user program, you can retrieve it from @code{esp} member of the +by a user program, you can retrieve it from the @code{esp} member of the @struct{intr_frame} passed to @func{syscall_handler} or @func{page_fault}, respectively. If you verify user pointers before accessing them (@pxref{Accessing User Memory}), these are the only cases @@ -590,16 +590,14 @@ user stack pointer. You will need to arrange another way, such as saving @code{esp} into @struct{thread} on the initial transition from user to kernel mode. -You may impose some absolute limit on stack size, as do most OSes. +You should impose some absolute limit on stack size, as do most OSes. Some OSes make the limit user-adjustable, e.g.@: with the @command{ulimit} command on many Unix systems. On many GNU/Linux systems, the default limit is 8 MB. -The first stack page need not be allocated lazily. You can initialize -it with the command line arguments at load time, with no need to wait -for it to be faulted in. (Even if you did wait, the very first -instruction in the user program is likely to be one that faults in the -page.) +The first stack page need not be allocated lazily. You can allocate +and initialize it with the command line arguments at load time, with +no need to wait for it to be faulted in. All stack pages should be candidates for eviction. An evicted stack page should be written to swap. @@ -615,7 +613,7 @@ space. The entire file is mapped into consecutive virtual pages starting at @var{addr}. Your VM system must lazily load pages in @code{mmap} regions and use the -@code{mmap}'d file itself as backing store for the mapping. That is, +@code{mmap}ed file itself as backing store for the mapping. That is, evicting a page mapped by @code{mmap} writes it back to the file it was mapped from. @@ -716,6 +714,12 @@ process. If you carefully designed your data structures, sharing of read-only pages should not make this part significantly harder. +@item How do we resume a process after we have handled a page fault? + +Returning from @func{page_fault} resumes the current user process +(@pxref{Internal Interrupt Handling}). +It will then retry the instruction to which the instruction pointer points. + @item Does the virtual memory system need to support data segment growth? No. The size of the data segment is determined by the linker. We still