]> Zhao Yanbai Git Server - kernel.git/commitdiff
fix write protection bug when fork
authorAceVest <zhaoyanbai@126.com>
Thu, 31 Jul 2014 15:20:11 +0000 (23:20 +0800)
committerAceVest <zhaoyanbai@126.com>
Thu, 31 Jul 2014 15:20:11 +0000 (23:20 +0800)
kernel/exec.c
kernel/fork.c
kernel/innerint.c
kernel/sched.c
lib/libc.S
lib/syscall.c

index d6ffd26f73d09ad7b11a88f737cfb7628ee360ab..8732ff95b22e0e71db6390cbaacb4f59262fd32b 100644 (file)
@@ -67,8 +67,6 @@ int sysc_exec(const char *path, char *const argv[])
     assert(strncmp(ELFMAG, ehdr->e_ident, sizeof(ELFMAG)-1) == 0);
     printk("Elf Entry: %08x\n", ehdr->e_entry);
 
-
-
     int i, j;
     for(i=0; i<ehdr->e_phnum; ++i)
     {
@@ -109,6 +107,7 @@ int sysc_exec(const char *path, char *const argv[])
         }
     }
 
+
     load_cr3(current);
 
     disable_irq();
@@ -127,7 +126,7 @@ int sysc_exec(const char *path, char *const argv[])
 #endif
     regs->eip   = (unsigned long)ehdr->e_entry;
     regs->edx   = regs->eip;
-    regs->ecx   = (0xC0000000 - 16);
+    regs->ecx   = KRNLADDR; //(0xC0000000 - 16);
 
     //kfree(buf);
 
index 57d67bc8cd37aafe545bf73925c13216a3df3b3a..968b75fdaf5bc7bfcee38188472af393e9c817a7 100644 (file)
@@ -94,6 +94,8 @@ int do_fork(pt_regs_t *regs, unsigned long flags)
         }
     //}
 
+    load_cr3(current);
+
     tsk->pid    = get_next_pid();
     tsk->ppid   = current->pid;
 
index 77feb174b8b437145d8b350a601941da7db5f5f9..7e064e8d885a0db9b7260852f0a8537a3f52b1d6 100644 (file)
@@ -104,7 +104,7 @@ US RW  P - Description
 
     asm("movl %%cr2,%%eax":"=a"(addr));
 
-    printk("do page fault errcode %x addr %08x [%08x]\n", errcode, addr, current);
+    //printk("do page fault errcode %x addr %08x [%08x]\n", errcode, addr, current);
 
     //assert(errcode != 2 && errcode != 6);
 
index d5626e0413d077354b3f96071b6943d297e3dc34..381c098ce50393e184e6a4f495dd0c382449f5cf 100644 (file)
@@ -183,7 +183,6 @@ unsigned long schedule()
 
     if(prev != next)
     {
-        printd("[s:%08x]\n", next);
         context_switch(prev, next);
     }
 }
index f4e14e2c0e1668945e1d8cbe8a6fc851731da6d7..ea207382061161dc22a823d0092e3ae7c934edec 100644 (file)
@@ -24,9 +24,9 @@ loop:
     jmp loop
     */
 
-    pushl   $0  # env
-    pushl   $0  # argv
-    pushl   $1  # argc
+
+    pushl   $0xAAAAAAAA
+    pushl   $0x11111111
 
     call main
 
index 7ca142038d147305ec124d9030f9ddc14d56fadc..c4a22762f693b957924f5535b9fb8628b54f23c4 100644 (file)
         "sysenter;"             \
         "1:"
 
-static int __syscall0(int nr)
+static int  __volatile__ __syscall0(int nr)
 {
     int __sysc_ret__ = 0;
     asm(SYSENTER_ASM:"=a"(__sysc_ret__):"a"(nr));
     return __sysc_ret__;
 }
 
-static int __syscall1(int nr, unsigned long a)
+static int __volatile__ __syscall1(int nr, unsigned long a)
 {
     int __sysc_ret__ = 0;
     asm(SYSENTER_ASM:"=a"(__sysc_ret__):"a"(nr), "b"(a));
     return __sysc_ret__;
 }
 
-static int __syscall2(int nr, unsigned long a, unsigned long b)
+static int __volatile__ __syscall2(int nr, unsigned long a, unsigned long b)
 {
     int __sysc_ret__ = 0;
     asm(SYSENTER_ASM:"=a"(__sysc_ret__):"a"(nr), "b"(a), "c"(b));
     return __sysc_ret__;
 }
 
-static int __syscall3(int nr, unsigned long a, unsigned long b, unsigned long c)
+static int __volatile__ __syscall3(int nr, unsigned long a, unsigned long b, unsigned long c)
 {
     int __sysc_ret__ = 0;
     asm(SYSENTER_ASM:"=a"(__sysc_ret__):"a"(nr), "b"(a), "c"(b), "d"(c));
     return __sysc_ret__;
 }
 
-static int __syscall4(int nr, unsigned long a, unsigned long b, unsigned long c, unsigned long d)
+static int __volatile__ __syscall4(int nr, unsigned long a, unsigned long b, unsigned long c, unsigned long d)
 {
     int __sysc_ret__ = 0;
     asm(SYSENTER_ASM:"=a"(__sysc_ret__):"a"(nr), "b"(a), "c"(b), "d"(c), "S"(d));