no more pminit, or ELF header at 0x10000
kinit() knows about end and PHYSTOP map all of kernel read/write (rather than r/o instructions) thanks, austin
This commit is contained in:
parent
880ee18ab1
commit
8d774afb2d
5 changed files with 13 additions and 49 deletions
3
defs.h
3
defs.h
|
@ -62,7 +62,7 @@ void ioapicinit(void);
|
||||||
// kalloc.c
|
// kalloc.c
|
||||||
char* kalloc(void);
|
char* kalloc(void);
|
||||||
void kfree(char*);
|
void kfree(char*);
|
||||||
void kinit(char*,uint);
|
void kinit();
|
||||||
|
|
||||||
// kbd.c
|
// kbd.c
|
||||||
void kbdintr(void);
|
void kbdintr(void);
|
||||||
|
@ -151,7 +151,6 @@ void uartintr(void);
|
||||||
void uartputc(int);
|
void uartputc(int);
|
||||||
|
|
||||||
// vm.c
|
// vm.c
|
||||||
void pminit(void);
|
|
||||||
void ksegment(void);
|
void ksegment(void);
|
||||||
void kvmalloc(void);
|
void kvmalloc(void);
|
||||||
void vmenable(void);
|
void vmenable(void);
|
||||||
|
|
8
kalloc.c
8
kalloc.c
|
@ -19,11 +19,13 @@ struct {
|
||||||
|
|
||||||
// Initialize free list of physical pages.
|
// Initialize free list of physical pages.
|
||||||
void
|
void
|
||||||
kinit(char *p, uint len)
|
kinit(void)
|
||||||
{
|
{
|
||||||
|
extern char end[];
|
||||||
|
|
||||||
initlock(&kmem.lock, "kmem");
|
initlock(&kmem.lock, "kmem");
|
||||||
char *p1 = (char*)PGROUNDUP((uint)p);
|
char *p1 = (char*)PGROUNDUP((uint)end);
|
||||||
char *p2 = PGROUNDDOWN(p + len);
|
char *p2 = PGROUNDDOWN(PHYSTOP);
|
||||||
for( ; p1 < p2; p1 += 4096)
|
for( ; p1 < p2; p1 += 4096)
|
||||||
kfree(p1);
|
kfree(p1);
|
||||||
}
|
}
|
||||||
|
|
2
main.c
2
main.c
|
@ -21,7 +21,7 @@ main(void)
|
||||||
ioapicinit(); // another interrupt controller
|
ioapicinit(); // another interrupt controller
|
||||||
consoleinit(); // I/O devices & their interrupts
|
consoleinit(); // I/O devices & their interrupts
|
||||||
uartinit(); // serial port
|
uartinit(); // serial port
|
||||||
pminit(); // discover how much memory there is
|
kinit(); // initialize memory allocator
|
||||||
jkstack(); // call mainc() on a properly-allocated stack
|
jkstack(); // call mainc() on a properly-allocated stack
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
4
mkfs.c
4
mkfs.c
|
@ -82,7 +82,7 @@ main(int argc, char *argv[])
|
||||||
usedblocks = ninodes / IPB + 3 + bitblocks;
|
usedblocks = ninodes / IPB + 3 + bitblocks;
|
||||||
freeblock = usedblocks;
|
freeblock = usedblocks;
|
||||||
|
|
||||||
printf("used %d (bit %d ninode %u) free %u total %d\n", usedblocks,
|
printf("used %d (bit %d ninode %lu) free %u total %d\n", usedblocks,
|
||||||
bitblocks, ninodes/IPB + 1, freeblock, nblocks+usedblocks);
|
bitblocks, ninodes/IPB + 1, freeblock, nblocks+usedblocks);
|
||||||
|
|
||||||
assert(nblocks + usedblocks == size);
|
assert(nblocks + usedblocks == size);
|
||||||
|
@ -230,7 +230,7 @@ balloc(int used)
|
||||||
for(i = 0; i < used; i++) {
|
for(i = 0; i < used; i++) {
|
||||||
buf[i/8] = buf[i/8] | (0x1 << (i%8));
|
buf[i/8] = buf[i/8] | (0x1 << (i%8));
|
||||||
}
|
}
|
||||||
printf("balloc: write bitmap block at sector %u\n", ninodes/IPB + 3);
|
printf("balloc: write bitmap block at sector %lu\n", ninodes/IPB + 3);
|
||||||
wsect(ninodes / IPB + 3, buf);
|
wsect(ninodes / IPB + 3, buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
45
vm.c
45
vm.c
|
@ -17,8 +17,8 @@
|
||||||
// setupkvm() and exec() set up every page table like this:
|
// setupkvm() and exec() set up every page table like this:
|
||||||
// 0..640K : user memory (text, data, stack, heap)
|
// 0..640K : user memory (text, data, stack, heap)
|
||||||
// 640K..1M : mapped direct (for IO space)
|
// 640K..1M : mapped direct (for IO space)
|
||||||
// 1M..kernend : mapped direct (for the kernel's text and data)
|
// 1M..end : mapped direct (for the kernel's text and data)
|
||||||
// kernend..PHYSTOP : mapped direct (kernel heap and user pages)
|
// end..PHYSTOP : mapped direct (kernel heap and user pages)
|
||||||
// 0xfe000000..0 : mapped direct (devices such as ioapic)
|
// 0xfe000000..0 : mapped direct (devices such as ioapic)
|
||||||
//
|
//
|
||||||
// The kernel allocates memory for its heap and for user memory
|
// The kernel allocates memory for its heap and for user memory
|
||||||
|
@ -31,12 +31,6 @@
|
||||||
|
|
||||||
#define USERTOP 0xA0000
|
#define USERTOP 0xA0000
|
||||||
|
|
||||||
static uint kerntext; // Linker starts kernel at 1MB
|
|
||||||
static uint kerntsz;
|
|
||||||
static uint kerndata;
|
|
||||||
static uint kerndsz;
|
|
||||||
static uint kernend;
|
|
||||||
static uint freesz;
|
|
||||||
static pde_t *kpgdir; // for use in scheduler()
|
static pde_t *kpgdir; // for use in scheduler()
|
||||||
|
|
||||||
// return the address of the PTE in page table pgdir
|
// return the address of the PTE in page table pgdir
|
||||||
|
@ -161,14 +155,8 @@ setupkvm(void)
|
||||||
// Map IO space from 640K to 1Mbyte
|
// Map IO space from 640K to 1Mbyte
|
||||||
if (!mappages(pgdir, (void *)USERTOP, 0x60000, USERTOP, PTE_W))
|
if (!mappages(pgdir, (void *)USERTOP, 0x60000, USERTOP, PTE_W))
|
||||||
return 0;
|
return 0;
|
||||||
// Map kernel text read-only
|
// Map kernel and free memory pool
|
||||||
if (!mappages(pgdir, (void *) kerntext, kerntsz, kerntext, 0))
|
if (!mappages(pgdir, (void *)0x100000, PHYSTOP-0x100000, 0x100000, PTE_W))
|
||||||
return 0;
|
|
||||||
// Map kernel data read/write
|
|
||||||
if (!mappages(pgdir, (void *) kerndata, kerndsz, kerndata, PTE_W))
|
|
||||||
return 0;
|
|
||||||
// Map dynamically-allocated memory read/write (kernel stacks, user mem)
|
|
||||||
if (!mappages(pgdir, (void *) kernend, freesz, PADDR(kernend), PTE_W))
|
|
||||||
return 0;
|
return 0;
|
||||||
// Map devices such as ioapic, lapic, ...
|
// Map devices such as ioapic, lapic, ...
|
||||||
if (!mappages(pgdir, (void *)0xFE000000, 0x2000000, 0xFE000000, PTE_W))
|
if (!mappages(pgdir, (void *)0xFE000000, 0x2000000, 0xFE000000, PTE_W))
|
||||||
|
@ -333,31 +321,6 @@ copyuvm(pde_t *pgdir, uint sz)
|
||||||
return d;
|
return d;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Gather information about physical memory layout.
|
|
||||||
// Called once during boot.
|
|
||||||
// Really should find out how much physical memory
|
|
||||||
// there is rather than assuming PHYSTOP.
|
|
||||||
void
|
|
||||||
pminit(void)
|
|
||||||
{
|
|
||||||
extern char end[];
|
|
||||||
struct proghdr *ph;
|
|
||||||
struct elfhdr *elf = (struct elfhdr*)0x10000; // scratch space
|
|
||||||
|
|
||||||
if (elf->magic != ELF_MAGIC || elf->phnum != 2)
|
|
||||||
panic("pminit: need a text and data segment\n");
|
|
||||||
|
|
||||||
ph = (struct proghdr*)((uchar*)elf + elf->phoff);
|
|
||||||
kernend = ((uint)end + PGSIZE) & ~(PGSIZE-1);
|
|
||||||
kerntext = ph[0].va;
|
|
||||||
kerndata = ph[1].va;
|
|
||||||
kerntsz = ph[0].memsz;
|
|
||||||
kerndsz = ph[1].memsz;
|
|
||||||
freesz = PHYSTOP - kernend;
|
|
||||||
|
|
||||||
kinit((char *)kernend, freesz);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Allocate one page table for the machine for the kernel address
|
// Allocate one page table for the machine for the kernel address
|
||||||
// space for scheduler processes.
|
// space for scheduler processes.
|
||||||
void
|
void
|
||||||
|
|
Loading…
Reference in a new issue