diff options
author | Robert Morris <[email protected]> | 2010-09-20 06:00:22 -0400 |
---|---|---|
committer | Robert Morris <[email protected]> | 2010-09-20 06:00:22 -0400 |
commit | a9183883b88bfccd1c6a62e27621b2c892d50b67 (patch) | |
tree | 5cae8d40cf5e91ea52d7aeb281e3baf5828c45e0 | |
parent | 26d11ee8dc60fed78c8b34d15670eb6640d92129 (diff) | |
download | xv6-labs-a9183883b88bfccd1c6a62e27621b2c892d50b67.tar.gz xv6-labs-a9183883b88bfccd1c6a62e27621b2c892d50b67.tar.bz2 xv6-labs-a9183883b88bfccd1c6a62e27621b2c892d50b67.zip |
map kernel instructions r/o
-rw-r--r-- | usertests.c | 28 | ||||
-rw-r--r-- | vm.c | 9 |
2 files changed, 35 insertions, 2 deletions
diff --git a/usertests.c b/usertests.c index e62703d..177ffba 100644 --- a/usertests.c +++ b/usertests.c @@ -1419,6 +1419,7 @@ validatetest(void) printf(stdout, "validate ok\n"); } +// does unintialized data start out zero? char uninit[10000]; void bsstest(void) @@ -1434,6 +1435,32 @@ bsstest(void) printf(stdout, "bss test ok\n"); } +// does exec do something sensible if the arguments +// are larger than a page? +void +bigargtest(void) +{ + int pid, ppid; + + ppid = getpid(); + pid = fork(); + if(pid == 0){ + char *args[100]; + int i; + for(i = 0; i < 99; i++) + args[i] = "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; + args[99] = 0; + printf(stdout, "bigarg test\n"); + exec("echo", args); + printf(stdout, "bigarg test ok\n"); + exit(); + } else if(pid < 0){ + printf(stdout, "bigargtest: fork failed\n"); + exit(); + } + wait(); +} + int main(int argc, char *argv[]) { @@ -1445,6 +1472,7 @@ main(int argc, char *argv[]) } close(open("usertests.ran", O_CREATE)); + // bigargtest(); bsstest(); sbrktest(); validatetest(); @@ -125,6 +125,9 @@ pde_t* setupkvm(void) { pde_t *pgdir; + extern char etext[]; + char *rwstart = PGROUNDDOWN(etext) - PGSIZE; + uint rwlen = (uint)rwstart - 0x100000; // Allocate page directory if(!(pgdir = (pde_t *) kalloc())) @@ -132,8 +135,10 @@ setupkvm(void) memset(pgdir, 0, PGSIZE); if(// Map IO space from 640K to 1Mbyte !mappages(pgdir, (void *)USERTOP, 0x60000, USERTOP, PTE_W) || - // Map kernel and free memory pool - !mappages(pgdir, (void *)0x100000, PHYSTOP-0x100000, 0x100000, PTE_W) || + // Map kernel instructions + !mappages(pgdir, (void *)0x100000, rwlen, 0x100000, 0) || + // Map kernel data and free memory pool + !mappages(pgdir, rwstart, PHYSTOP-(uint)rwstart, (uint)rwstart, PTE_W) || // Map devices such as ioapic, lapic, ... !mappages(pgdir, (void *)0xFE000000, 0x2000000, 0xFE000000, PTE_W)) return 0; |