Compare commits

..

3 commits

Author SHA1 Message Date
Imbus
ced7c79bd8 Unused includes 2024-08-09 07:59:10 +02:00
Imbus
d6dd26c67e Documentation 2024-08-09 07:59:03 +02:00
Imbus
59d36a7c8e Halt draft 2024-08-09 07:58:00 +02:00
12 changed files with 73 additions and 20 deletions

View file

@ -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)

View file

@ -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 *);

View file

@ -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)
{

View file

@ -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 = .);
}

View file

@ -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;

View file

@ -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

View file

@ -23,3 +23,4 @@
#define SYS_mkdir 20
#define SYS_close 21
#define SYS_trace 22
#define SYS_halt 23

View file

@ -96,3 +96,9 @@ sys_trace(void)
/* TODO: Implement sys_trace */
return 0;
}
void
sys_halt(void)
{
/* TODO: Implement sys_halt */
}

View file

@ -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
View file

@ -0,0 +1,9 @@
#include "user.h"
/** Stops the machine */
int
main(int argc, char *argv[])
{
halt();
return 0;
}

View file

@ -74,6 +74,9 @@ int uptime(void);
/** trace */
int trace(int);
/** halt */
void halt(void);
/**
* Library functions (ulib.c)
*/

View file

@ -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");