proc_mapstacks
This commit is contained in:
parent
320180764f
commit
c39b98dd02
@ -16,23 +16,6 @@ extern void forkret(void);
|
|||||||
// must be acquired before any p->lock.
|
// must be acquired before any p->lock.
|
||||||
struct spinlock wait_lock;
|
struct spinlock wait_lock;
|
||||||
|
|
||||||
// Allocate a page for each process's kernel stack.
|
|
||||||
// Map it high in memory, followed by an invalid
|
|
||||||
// guard page.
|
|
||||||
void
|
|
||||||
proc_mapstacks(pagetable_t kpgtbl)
|
|
||||||
{
|
|
||||||
struct proc *p;
|
|
||||||
|
|
||||||
for(p = proc; p < &proc[NPROC]; p++) {
|
|
||||||
char *pa = kalloc();
|
|
||||||
if(pa == 0)
|
|
||||||
panic("kalloc");
|
|
||||||
uint64 va = KSTACK((int) (p - proc));
|
|
||||||
kvmmap(kpgtbl, va, (uint64)pa, PGSIZE, PTE_R | PTE_W);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
struct proc *allocproc(void);
|
struct proc *allocproc(void);
|
||||||
|
|
||||||
// a user program that calls exec("/init")
|
// a user program that calls exec("/init")
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
use super::{
|
use super::{
|
||||||
asm,
|
asm,
|
||||||
mem::{make_satp, pte2pa},
|
mem::{make_satp, pte2pa, kstack},
|
||||||
plic::PLIC,
|
plic::PLIC,
|
||||||
power::QEMU_POWER,
|
power::QEMU_POWER,
|
||||||
};
|
};
|
||||||
@ -17,7 +17,6 @@ use crate::{
|
|||||||
kalloc::{kalloc, kfree},
|
kalloc::{kalloc, kfree},
|
||||||
memmove, memset,
|
memmove, memset,
|
||||||
},
|
},
|
||||||
proc::process::proc_mapstacks,
|
|
||||||
};
|
};
|
||||||
use core::ptr::{addr_of, addr_of_mut, null_mut};
|
use core::ptr::{addr_of, addr_of_mut, null_mut};
|
||||||
|
|
||||||
@ -34,6 +33,9 @@ pub static mut KERNEL_PAGETABLE: Pagetable = null_mut();
|
|||||||
/// Make a direct-map page table for the kernel.
|
/// Make a direct-map page table for the kernel.
|
||||||
pub unsafe fn kvmmake() -> Pagetable {
|
pub unsafe fn kvmmake() -> Pagetable {
|
||||||
let pagetable = kalloc() as Pagetable;
|
let pagetable = kalloc() as Pagetable;
|
||||||
|
if pagetable.is_null() {
|
||||||
|
panic!("kalloc");
|
||||||
|
}
|
||||||
memset(pagetable.cast(), 0, PAGE_SIZE as u32);
|
memset(pagetable.cast(), 0, PAGE_SIZE as u32);
|
||||||
|
|
||||||
// QEMU test interface used for power management.
|
// QEMU test interface used for power management.
|
||||||
@ -105,7 +107,14 @@ pub unsafe fn kvmmake() -> Pagetable {
|
|||||||
);
|
);
|
||||||
|
|
||||||
// Allocate and map a kernel stack for each process.
|
// Allocate and map a kernel stack for each process.
|
||||||
proc_mapstacks(pagetable);
|
for i in 0..crate::NPROC {
|
||||||
|
let page = kalloc();
|
||||||
|
if page.is_null() {
|
||||||
|
panic!("kalloc");
|
||||||
|
}
|
||||||
|
let virtual_addr = kstack(i) as u64;
|
||||||
|
kvmmap(pagetable, virtual_addr, page as u64, PAGE_SIZE as u64, PTE_R | PTE_W);
|
||||||
|
}
|
||||||
|
|
||||||
pagetable
|
pagetable
|
||||||
}
|
}
|
||||||
|
@ -46,7 +46,6 @@ extern "C" {
|
|||||||
pub fn userinit();
|
pub fn userinit();
|
||||||
pub fn forkret();
|
pub fn forkret();
|
||||||
pub fn wait(addr: u64) -> i32;
|
pub fn wait(addr: u64) -> i32;
|
||||||
pub fn proc_mapstacks(kpgtbl: Pagetable);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
pub static NEXT_PID: AtomicI32 = AtomicI32::new(1);
|
pub static NEXT_PID: AtomicI32 = AtomicI32::new(1);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user