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/_zombie\
|
||||
$U/_clear\
|
||||
$U/_halt\
|
||||
|
||||
fs.img: mkfs/mkfs README.md $(UPROGS)
|
||||
mkfs/mkfs fs.img README.md $(UPROGS)
|
||||
|
|
|
@ -64,10 +64,34 @@ void ramdiskinit(void);
|
|||
void ramdiskintr(void);
|
||||
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 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
|
||||
void initlog(int, struct superblock *);
|
||||
|
|
|
@ -3,21 +3,23 @@
|
|||
// and pipe buffers. Allocates whole 4096-byte pages.
|
||||
|
||||
#include "types.h"
|
||||
#include "param.h"
|
||||
#include "memlayout.h"
|
||||
#include "spinlock.h"
|
||||
#include "riscv.h"
|
||||
#include "defs.h"
|
||||
|
||||
/** Free list of physical pages. */
|
||||
void freerange(void *pa_start, void *pa_end);
|
||||
|
||||
extern char end[]; // first address after kernel.
|
||||
// defined by kernel.ld.
|
||||
/** first address after kernel. defined by kernel.ld. */
|
||||
extern char end[];
|
||||
|
||||
/** A run is a node in the free list. */
|
||||
struct run {
|
||||
struct run *next;
|
||||
};
|
||||
|
||||
/** Kernel memory allocator. */
|
||||
struct {
|
||||
struct spinlock lock;
|
||||
struct run *freelist;
|
||||
|
@ -39,10 +41,6 @@ freerange(void *pa_start, void *pa_end)
|
|||
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
|
||||
kfree(void *pa)
|
||||
{
|
||||
|
@ -62,9 +60,6 @@ kfree(void *pa)
|
|||
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 *
|
||||
kalloc(void)
|
||||
{
|
||||
|
|
|
@ -15,12 +15,25 @@ SECTIONS
|
|||
* that reference the functions in your object file.
|
||||
*/
|
||||
.text : {
|
||||
/* Match any section that starts with .text. */
|
||||
*(.text .text.*)
|
||||
|
||||
/* Align the next section to a 4KB (page) boundary. */
|
||||
. = ALIGN(0x1000);
|
||||
|
||||
/* Put the trampoline code here. */
|
||||
_trampoline = .;
|
||||
|
||||
/* Match any section that starts with .trampsec. */
|
||||
*(trampsec)
|
||||
|
||||
/* Align the next section to a 4KB (page) boundary. */
|
||||
. = ALIGN(0x1000);
|
||||
|
||||
/* Assert that the trampoline code is exactly 4KB (page) in size. */
|
||||
ASSERT(. - _trampoline == 0x1000, "error: trampoline larger than one page");
|
||||
|
||||
/* Define symbol etext to be the current location. */
|
||||
PROVIDE(etext = .);
|
||||
}
|
||||
|
||||
|
@ -29,6 +42,7 @@ SECTIONS
|
|||
* It is not unusual to find this data interleaved with the text section.
|
||||
*/
|
||||
.rodata : {
|
||||
/* Align on quadword boundary. */
|
||||
. = ALIGN(16);
|
||||
*(.srodata .srodata.*) /* do not need to distinguish this from .rodata */
|
||||
. = ALIGN(16);
|
||||
|
@ -59,6 +73,6 @@ SECTIONS
|
|||
*(.bss .bss.*)
|
||||
}
|
||||
|
||||
/* PROVIDE, see vm.c */
|
||||
/* Define symbol end as current location, note that this is not aligned, see vm.c */
|
||||
PROVIDE(end = .);
|
||||
}
|
||||
|
|
|
@ -650,9 +650,8 @@ either_copyin(void *dst, int user_src, u64 src, u64 len)
|
|||
void
|
||||
procdump(void)
|
||||
{
|
||||
static char *states[] = {
|
||||
[UNUSED] "unused", [USED] "used", [SLEEPING] "sleep ", [RUNNABLE] "runble", [RUNNING] "run ", [ZOMBIE] "zombie"
|
||||
};
|
||||
static char *states[] = { [UNUSED] = "unused", [USED] = "used", [SLEEPING] = "sleep ",
|
||||
[RUNNABLE] = "runble", [RUNNING] = "run ", [ZOMBIE] = "zombie" };
|
||||
struct proc *p;
|
||||
char *state;
|
||||
|
||||
|
|
|
@ -102,6 +102,7 @@ extern u64 sys_link(void);
|
|||
extern u64 sys_mkdir(void);
|
||||
extern u64 sys_close(void);
|
||||
extern u64 sys_trace(void);
|
||||
extern u64 sys_halt(void);
|
||||
|
||||
// An array mapping syscall numbers from syscall.h
|
||||
// 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_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_close] = sys_close, [SYS_trace] = sys_trace,
|
||||
[SYS_close] = sys_close, [SYS_trace] = sys_trace, [SYS_halt] = sys_halt,
|
||||
};
|
||||
|
||||
void
|
||||
|
|
|
@ -23,3 +23,4 @@
|
|||
#define SYS_mkdir 20
|
||||
#define SYS_close 21
|
||||
#define SYS_trace 22
|
||||
#define SYS_halt 23
|
||||
|
|
|
@ -96,3 +96,9 @@ sys_trace(void)
|
|||
/* TODO: Implement sys_trace */
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
sys_halt(void)
|
||||
{
|
||||
/* TODO: Implement sys_halt */
|
||||
}
|
||||
|
|
|
@ -1,5 +1,4 @@
|
|||
#include "types.h"
|
||||
#include "param.h"
|
||||
#include "memlayout.h"
|
||||
#include "riscv.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 */
|
||||
int trace(int);
|
||||
|
||||
/** halt */
|
||||
void halt(void);
|
||||
|
||||
/**
|
||||
* Library functions (ulib.c)
|
||||
*/
|
||||
|
|
|
@ -14,7 +14,7 @@ sub entry {
|
|||
print " ecall\n";
|
||||
print " ret\n";
|
||||
}
|
||||
|
||||
|
||||
entry("fork");
|
||||
entry("exit");
|
||||
entry("wait");
|
||||
|
@ -37,3 +37,4 @@ entry("sbrk");
|
|||
entry("sleep");
|
||||
entry("uptime");
|
||||
entry("trace");
|
||||
entry("halt");
|
||||
|
|
Loading…
Add table
Reference in a new issue