From: John Ousterhout Date: Thu, 17 Dec 2015 19:29:13 +0000 (-0800) Subject: Fixes exec-bound-3 failures X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?p=pintos-anon;a=commitdiff_plain;h=bd5dde3034714da175496292c92dc5a37509a311 Fixes exec-bound-3 failures The boundary position wasn't being properly chosen (must ensure that the dst array in boundary.c is always in the last page of the .bss segment). --- diff --git a/src/lib/user/user.lds b/src/lib/user/user.lds index cc6d6c0..1bf30b1 100644 --- a/src/lib/user/user.lds +++ b/src/lib/user/user.lds @@ -16,7 +16,7 @@ SECTIONS . = DATA_SEGMENT_ALIGN (0x1000, 0x1000); .data : { *(.data) } - .bss : { *(.bss) } + .bss : { *(.bss) *(.testEndmem) } /* Stabs debugging sections. */ .stab 0 : { *(.stab) } diff --git a/src/tests/userprog/boundary.c b/src/tests/userprog/boundary.c index 2e81df4..ca4fb73 100644 --- a/src/tests/userprog/boundary.c +++ b/src/tests/userprog/boundary.c @@ -7,7 +7,10 @@ #include #include "tests/userprog/boundary.h" -static char dst[8192]; +/* Together with statements in src/lib/user/user.lds, arranges + for the following array to be at the very end of the .bss + segment (needed for get_bad_boundary below). */ +static char dst[8192] __attribute__ ((section (".testEndmem,\"aw\",@nobits#"))); /* Returns the beginning of a page. There are at least 2048 modifiable bytes on either side of the pointer returned. */ @@ -32,9 +35,9 @@ copy_string_across_boundary (const char *src) } /* Returns an address that is invalid, but the preceding bytes - * are all valid. Used to position information such that the - * first byte of the information is valid, but not all the - * information is valid. */ + * are all valid (the highest address in the bss segment). Used + * to position information such that the first byte of the + * information is valid, but not all the information is valid. */ void * get_bad_boundary (void) { diff --git a/src/tests/userprog/exec-bound-3.c b/src/tests/userprog/exec-bound-3.c index 67937c8..41f1cd9 100644 --- a/src/tests/userprog/exec-bound-3.c +++ b/src/tests/userprog/exec-bound-3.c @@ -14,5 +14,15 @@ test_main (void) char *p = get_bad_boundary () - 1; *p = 'a'; exec(p); + + /* Note: if this test fails to pass even with the official solutions, + it's probably because memory layout has changed and p no longer + refers to the proper page boundary. To fix the problem, uncomment + the line below to print out the boundary address. In addition, + add a printf line in load_segment to print out the address range + of each segment. From that, you'll be able to figure out how to + modify get_bad_boundary to make things work again. */ + + // msg("boundary address: 0x%x", p); fail ("should have killed process"); }