Compare commits
3 commits
3e639fe25d
...
ced7c79bd8
Author | SHA1 | Date | |
---|---|---|---|
![]() |
ced7c79bd8 | ||
![]() |
d6dd26c67e | ||
![]() |
59d36a7c8e |
12 changed files with 73 additions and 20 deletions
1
Makefile
1
Makefile
|
@ -135,6 +135,7 @@ UPROGS=\
|
||||||
$U/_wc\
|
$U/_wc\
|
||||||
$U/_zombie\
|
$U/_zombie\
|
||||||
$U/_clear\
|
$U/_clear\
|
||||||
|
$U/_halt\
|
||||||
|
|
||||||
fs.img: mkfs/mkfs README.md $(UPROGS)
|
fs.img: mkfs/mkfs README.md $(UPROGS)
|
||||||
mkfs/mkfs fs.img README.md $(UPROGS)
|
mkfs/mkfs fs.img README.md $(UPROGS)
|
||||||
|
|
|
@ -64,10 +64,34 @@ void ramdiskinit(void);
|
||||||
void ramdiskintr(void);
|
void ramdiskintr(void);
|
||||||
void ramdiskrw(struct buf *);
|
void ramdiskrw(struct buf *);
|
||||||
|
|
||||||
// kalloc.c
|
/**
|
||||||
|
* Kernel memory allocator
|
||||||
|
*
|
||||||
|
* Allocate one 4096-byte page of physical memory.
|
||||||
|
* Returns a pointer that the kernel can use.
|
||||||
|
* Returns 0 if the memory cannot be allocated.
|
||||||
|
* See: kalloc.c
|
||||||
|
*/
|
||||||
void *kalloc(void);
|
void *kalloc(void);
|
||||||
void kfree(void *);
|
|
||||||
void kinit(void);
|
/**
|
||||||
|
* Kernel memory allocator
|
||||||
|
*
|
||||||
|
* Free the page of physical memory pointed at by pa,
|
||||||
|
* which normally should have been returned by a
|
||||||
|
* call to kalloc(). (The exception is when
|
||||||
|
* initializing the allocator; see kinit above.)
|
||||||
|
* See: kalloc.c
|
||||||
|
*/
|
||||||
|
void kfree(void *);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Initialize kernel memory allocator
|
||||||
|
*
|
||||||
|
* Called by main() on the way to the kernel's main loop.
|
||||||
|
* See: kalloc.c
|
||||||
|
*/
|
||||||
|
void kinit(void);
|
||||||
|
|
||||||
// log.c
|
// log.c
|
||||||
void initlog(int, struct superblock *);
|
void initlog(int, struct superblock *);
|
||||||
|
|
|
@ -3,21 +3,23 @@
|
||||||
// and pipe buffers. Allocates whole 4096-byte pages.
|
// and pipe buffers. Allocates whole 4096-byte pages.
|
||||||
|
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
#include "param.h"
|
|
||||||
#include "memlayout.h"
|
#include "memlayout.h"
|
||||||
#include "spinlock.h"
|
#include "spinlock.h"
|
||||||
#include "riscv.h"
|
#include "riscv.h"
|
||||||
#include "defs.h"
|
#include "defs.h"
|
||||||
|
|
||||||
|
/** Free list of physical pages. */
|
||||||
void freerange(void *pa_start, void *pa_end);
|
void freerange(void *pa_start, void *pa_end);
|
||||||
|
|
||||||
extern char end[]; // first address after kernel.
|
/** first address after kernel. defined by kernel.ld. */
|
||||||
// defined by kernel.ld.
|
extern char end[];
|
||||||
|
|
||||||
|
/** A run is a node in the free list. */
|
||||||
struct run {
|
struct run {
|
||||||
struct run *next;
|
struct run *next;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/** Kernel memory allocator. */
|
||||||
struct {
|
struct {
|
||||||
struct spinlock lock;
|
struct spinlock lock;
|
||||||
struct run *freelist;
|
struct run *freelist;
|
||||||
|
@ -39,10 +41,6 @@ freerange(void *pa_start, void *pa_end)
|
||||||
kfree(p);
|
kfree(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Free the page of physical memory pointed at by pa,
|
|
||||||
// which normally should have been returned by a
|
|
||||||
// call to kalloc(). (The exception is when
|
|
||||||
// initializing the allocator; see kinit above.)
|
|
||||||
void
|
void
|
||||||
kfree(void *pa)
|
kfree(void *pa)
|
||||||
{
|
{
|
||||||
|
@ -62,9 +60,6 @@ kfree(void *pa)
|
||||||
release(&kmem.lock);
|
release(&kmem.lock);
|
||||||
}
|
}
|
||||||
|
|
||||||
// Allocate one 4096-byte page of physical memory.
|
|
||||||
// Returns a pointer that the kernel can use.
|
|
||||||
// Returns 0 if the memory cannot be allocated.
|
|
||||||
void *
|
void *
|
||||||
kalloc(void)
|
kalloc(void)
|
||||||
{
|
{
|
||||||
|
|
|
@ -15,12 +15,25 @@ SECTIONS
|
||||||
* that reference the functions in your object file.
|
* that reference the functions in your object file.
|
||||||
*/
|
*/
|
||||||
.text : {
|
.text : {
|
||||||
|
/* Match any section that starts with .text. */
|
||||||
*(.text .text.*)
|
*(.text .text.*)
|
||||||
|
|
||||||
|
/* Align the next section to a 4KB (page) boundary. */
|
||||||
. = ALIGN(0x1000);
|
. = ALIGN(0x1000);
|
||||||
|
|
||||||
|
/* Put the trampoline code here. */
|
||||||
_trampoline = .;
|
_trampoline = .;
|
||||||
|
|
||||||
|
/* Match any section that starts with .trampsec. */
|
||||||
*(trampsec)
|
*(trampsec)
|
||||||
|
|
||||||
|
/* Align the next section to a 4KB (page) boundary. */
|
||||||
. = ALIGN(0x1000);
|
. = ALIGN(0x1000);
|
||||||
|
|
||||||
|
/* Assert that the trampoline code is exactly 4KB (page) in size. */
|
||||||
ASSERT(. - _trampoline == 0x1000, "error: trampoline larger than one page");
|
ASSERT(. - _trampoline == 0x1000, "error: trampoline larger than one page");
|
||||||
|
|
||||||
|
/* Define symbol etext to be the current location. */
|
||||||
PROVIDE(etext = .);
|
PROVIDE(etext = .);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -29,6 +42,7 @@ SECTIONS
|
||||||
* It is not unusual to find this data interleaved with the text section.
|
* It is not unusual to find this data interleaved with the text section.
|
||||||
*/
|
*/
|
||||||
.rodata : {
|
.rodata : {
|
||||||
|
/* Align on quadword boundary. */
|
||||||
. = ALIGN(16);
|
. = ALIGN(16);
|
||||||
*(.srodata .srodata.*) /* do not need to distinguish this from .rodata */
|
*(.srodata .srodata.*) /* do not need to distinguish this from .rodata */
|
||||||
. = ALIGN(16);
|
. = ALIGN(16);
|
||||||
|
@ -59,6 +73,6 @@ SECTIONS
|
||||||
*(.bss .bss.*)
|
*(.bss .bss.*)
|
||||||
}
|
}
|
||||||
|
|
||||||
/* PROVIDE, see vm.c */
|
/* Define symbol end as current location, note that this is not aligned, see vm.c */
|
||||||
PROVIDE(end = .);
|
PROVIDE(end = .);
|
||||||
}
|
}
|
||||||
|
|
|
@ -650,9 +650,8 @@ either_copyin(void *dst, int user_src, u64 src, u64 len)
|
||||||
void
|
void
|
||||||
procdump(void)
|
procdump(void)
|
||||||
{
|
{
|
||||||
static char *states[] = {
|
static char *states[] = { [UNUSED] = "unused", [USED] = "used", [SLEEPING] = "sleep ",
|
||||||
[UNUSED] "unused", [USED] "used", [SLEEPING] "sleep ", [RUNNABLE] "runble", [RUNNING] "run ", [ZOMBIE] "zombie"
|
[RUNNABLE] = "runble", [RUNNING] = "run ", [ZOMBIE] = "zombie" };
|
||||||
};
|
|
||||||
struct proc *p;
|
struct proc *p;
|
||||||
char *state;
|
char *state;
|
||||||
|
|
||||||
|
|
|
@ -102,6 +102,7 @@ extern u64 sys_link(void);
|
||||||
extern u64 sys_mkdir(void);
|
extern u64 sys_mkdir(void);
|
||||||
extern u64 sys_close(void);
|
extern u64 sys_close(void);
|
||||||
extern u64 sys_trace(void);
|
extern u64 sys_trace(void);
|
||||||
|
extern u64 sys_halt(void);
|
||||||
|
|
||||||
// An array mapping syscall numbers from syscall.h
|
// An array mapping syscall numbers from syscall.h
|
||||||
// to the function that handles the system call.
|
// to the function that handles the system call.
|
||||||
|
@ -111,7 +112,7 @@ static u64 (*syscalls[])(void) = {
|
||||||
[SYS_chdir] = sys_chdir, [SYS_dup] = sys_dup, [SYS_getpid] = sys_getpid, [SYS_sbrk] = sys_sbrk,
|
[SYS_chdir] = sys_chdir, [SYS_dup] = sys_dup, [SYS_getpid] = sys_getpid, [SYS_sbrk] = sys_sbrk,
|
||||||
[SYS_sleep] = sys_sleep, [SYS_uptime] = sys_uptime, [SYS_open] = sys_open, [SYS_write] = sys_write,
|
[SYS_sleep] = sys_sleep, [SYS_uptime] = sys_uptime, [SYS_open] = sys_open, [SYS_write] = sys_write,
|
||||||
[SYS_mknod] = sys_mknod, [SYS_unlink] = sys_unlink, [SYS_link] = sys_link, [SYS_mkdir] = sys_mkdir,
|
[SYS_mknod] = sys_mknod, [SYS_unlink] = sys_unlink, [SYS_link] = sys_link, [SYS_mkdir] = sys_mkdir,
|
||||||
[SYS_close] = sys_close, [SYS_trace] = sys_trace,
|
[SYS_close] = sys_close, [SYS_trace] = sys_trace, [SYS_halt] = sys_halt,
|
||||||
};
|
};
|
||||||
|
|
||||||
void
|
void
|
||||||
|
|
|
@ -23,3 +23,4 @@
|
||||||
#define SYS_mkdir 20
|
#define SYS_mkdir 20
|
||||||
#define SYS_close 21
|
#define SYS_close 21
|
||||||
#define SYS_trace 22
|
#define SYS_trace 22
|
||||||
|
#define SYS_halt 23
|
||||||
|
|
|
@ -96,3 +96,9 @@ sys_trace(void)
|
||||||
/* TODO: Implement sys_trace */
|
/* TODO: Implement sys_trace */
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
sys_halt(void)
|
||||||
|
{
|
||||||
|
/* TODO: Implement sys_halt */
|
||||||
|
}
|
||||||
|
|
|
@ -1,5 +1,4 @@
|
||||||
#include "types.h"
|
#include "types.h"
|
||||||
#include "param.h"
|
|
||||||
#include "memlayout.h"
|
#include "memlayout.h"
|
||||||
#include "riscv.h"
|
#include "riscv.h"
|
||||||
#include "spinlock.h"
|
#include "spinlock.h"
|
||||||
|
|
9
user/halt.c
Normal file
9
user/halt.c
Normal file
|
@ -0,0 +1,9 @@
|
||||||
|
#include "user.h"
|
||||||
|
|
||||||
|
/** Stops the machine */
|
||||||
|
int
|
||||||
|
main(int argc, char *argv[])
|
||||||
|
{
|
||||||
|
halt();
|
||||||
|
return 0;
|
||||||
|
}
|
|
@ -74,6 +74,9 @@ int uptime(void);
|
||||||
/** trace */
|
/** trace */
|
||||||
int trace(int);
|
int trace(int);
|
||||||
|
|
||||||
|
/** halt */
|
||||||
|
void halt(void);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Library functions (ulib.c)
|
* Library functions (ulib.c)
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -37,3 +37,4 @@ entry("sbrk");
|
||||||
entry("sleep");
|
entry("sleep");
|
||||||
entry("uptime");
|
entry("uptime");
|
||||||
entry("trace");
|
entry("trace");
|
||||||
|
entry("halt");
|
||||||
|
|
Loading…
Add table
Reference in a new issue