25void printf(
char* fmt, ...);
70char*
safestrcpy(
char* s,
const char* t,
int n);
99char*
strncpy(
char *s,
const char *t,
int n);
106char*
strchr(
const char* s,
char c);
175void exit(
int status);
234void sleep(
void* chain);
437void argint(
int n,
int *ip);
480int exec(
char *path,
char **argv);
700#define NELEM(x) (sizeof(x) / sizeof(x[0]))
struct dirent * dirlookup(struct dirent *entry, char *filename, uint *poff)
在指定目录项中查找指定文件名的目录项
Definition fat32.c:313
void swtch(struct context *old, struct context *new)
切换当前的上下文,将当前的上下文存入old,从new中取出上下文作为当前上下文
int mappages(pagetable_t pagetable, uint64 va, uint64 size, uint64 pa, int perm)
从va开始的虚拟地址创建PTE,这些PTE指向从pa开始的物理地址
Definition vm.c:150
void proc_mapstacks(pagetable_t kpgtbl)
给每个进程的内核栈申请一个页,将其映射到内存高地址,后面紧跟着一个无效保护页
Definition proc.c:44
void * memmove(void *dst, const void *src, uint n)
将src指向的字符串挪到dst指向的指针
Definition string.c:45
pagetable_t uvmcreate()
创建一个空的用户页表
Definition vm.c:210
int enext(struct dirent *dp, struct dirent *ep, uint off, int *count)
在dp描述的目录项的off个字节偏移处寻找相应的目录项并存放到ep中
Definition fat32.c:467
void kvmmap(pagetable_t kpgtbl, uint64 va, uint64 pa, uint64 sz, int perm)
将虚拟地址范围映射到物理地址,并将相应的PTE添加到页表中
Definition vm.c:139
int cpuid(void)
得到当前cpu的id,(此时中断需要禁用以防止进程间竞争挪到其他CPU)
Definition proc.c:67
void uartputc_sync(int c)
uartputc()的变体,不需要使用中断。
Definition uart.c:127
struct dirent * ename(char *path)
根据路径名查目录
Definition fat32.c:576
uint64 uvmalloc(pagetable_t pagetable, uint64 oldsz, uint64 newsz, int xperm)
为进程从oldsz到newsz分配PTE和物理内存
Definition vm.c:249
void procinit(void)
初始化进程
Definition proc.c:56
void * kalloc(void)
申请一个4096-byte的页表的物理内存
Definition kalloc.c:38
void consoleintr(int)
console输入中断处理程序
Definition console.c:60
void wakeup(void *)
唤醒chan链上的所有进程
Definition proc.c:409
void printf(char *fmt,...)
打印格式化内容,与c语言printf类似,仅支持d, x, p, s, %%, c;暂剔除调用锁的代码
Definition printf.c:75
int filewrite(struct file *f, uint64 addr, int n)
写文件f
Definition file.c:154
char * strncpy(char *s, const char *t, int n)
从t字符串赋值n个字符到s指向字符串
Definition string.c:83
int strlen(const char *s)
返回字符串长度
Definition string.c:37
char * strchr(const char *s, char c)
在一个字符串中查找一个特定字符
Definition string.c:95
void panic(char *s) __attribute__((noreturn))
程序中止并打印s字符串的内容,暂剔除调用锁的代码
Definition printf.c:125
void printfinit(void)
printf初始化,暂剔除调用锁的代码
Definition printf.c:69
void plicinithart(void)
设置hart中相应的比特位
Definition plic.c:29
void uvmclear(pagetable_t pagetable, uint64 va)
将一个页表项标记为无效,使得用户无法访问该页。它通常被用于为用户栈设置保护页
Definition vm.c:373
int plic_claim(void)
获取目前应该服务的中断请求
Definition plic.c:48
void uvmfree(pagetable_t pagetable, uint64 sz)
释放用户进程的内存页和页表页
Definition vm.c:323
int uartgetc(void)
从UART读入一个输入字符
Definition uart.c:186
int wait(uint64 addr)
等待子进程退出
Definition proc.c:343
int eread(struct dirent *entry, int user_dst, uint64 dst, uint off, uint n)
从一个文件的指定偏移量开始读取一定数量的字节
Definition fat32.c:583
struct proc * myproc(void)
返回当前运行的进程(结构体指针),若没有返回0
Definition proc.c:82
int fileread(struct file *f, uint64 addr, int n)
读文件f
Definition file.c:125
void estat(struct dirent *ep, struct stat *st)
将一个目录项的信息转换为一个文件状态结构体
Definition fat32.c:444
void proc_freepagetable(pagetable_t pagetable, uint64 sz)
释放进程页表并释放其引用的物理内存
Definition proc.c:190
void consputc(int c)
将字符输送到uart输出寄存器
Definition console.c:31
void trapinit(void)
初始化trap
Definition trap.c:29
uint64 walkaddr(pagetable_t pagetable, uint64 va)
查找虚拟地址对应的物理地址,如果没有映射则返回0,它只能用于查找用户页
Definition vm.c:115
void binit(void)
初始化缓冲区缓存,创建一个缓冲区的链表
Definition bio.c:29
void uartputc(int c)
将字符写入输出缓冲区,通知UART开始发送字符。
Definition uart.c:97
void exit(int status)
退出当前进程,不返回,该退出的进程在其父进程调用wait()之前保持僵尸进程状态
Definition proc.c:308
pte_t * walk(pagetable_t pagetable, uint64 va, int alloc)
在页表中查找虚拟地址va对应的页表项,如果页表项不存在则根据alloc参数决定是否分配新的页表
Definition vm.c:89
int copyout(pagetable_t pagetable, uint64 dstva, char *src, uint64 len)
从内核空间复制数据到用户空间
Definition vm.c:392
struct buf * bread(uint dev, uint sectorno)
将指定设备上指定扇区的内容存储在buffer中
Definition bio.c:86
void bwrite(struct buf *b)
将一个缓冲区的内容写入到磁盘中
Definition bio.c:99
int kill(int pid)
kill给定pid的进程,但函数内不会直接让进程退出,只是设置killed状态为1,直到该进程试图返回用户空间时才会退出
Definition proc.c:430
void virtio_disk_init(void)
初始化virtio,重置缓冲区描述符虚拟队列、空闲ring、used ring,初始化状态寄存器
Definition virtio_disk.c:45
void fileinit(void)
初始化文件池中的文件
Definition file.c:34
void argaddr(int n, uint64 *ip)
获取一个指针参数(不检查其合法性,后续过程中会检查)
Definition syscall.c:73
struct dirent * edup(struct dirent *entry)
增加目录项的引用链接数
Definition fat32.c:380
void kvminithart(void)
将硬件页表寄存器切换到内核页表,并启用分页
Definition vm.c:73
void kinit(void)
初始化内存分配
Definition kalloc.c:78
void virtio_disk_rw(struct buf *b, int write)
虚拟磁盘读写函数
Definition virtio_disk.c:200
void eupdate(struct dirent *entry)
将目录的更改更新到磁盘上
Definition fat32.c:388
int ewrite(struct dirent *entry, int user_src, uint64 src, uint off, uint n)
从一个文件的指定偏移量开始写入一定数量的字节
Definition fat32.c:607
void plicinit(void)
初始化平台级中断
Definition plic.c:20
void uartinit(void)
初始化uart各个寄存器
Definition uart.c:59
void strw2u(char *dst, const uint16 *src, int n)
将16bit的wchar字符串转化为8bit的char字符串
Definition string.c:104
int fat32_init(void)
初始化 FAT32 文件系统
Definition fat32.c:46
void yield(void)
当前进程放弃CPU,切换上下文给其他进程
Definition proc.c:422
void procdump(void)
用于debug,打印进程状态列表
Definition proc.c:485
uint ticks
Definition trap.c:19
int strncmp(const char *p, const char *q, uint n)
比较q和p字符串大小
Definition string.c:70
void userinit(void)
初始化第一个进程
Definition proc.c:210
void eput(struct dirent *entry)
把目录项entry插入到root之后,减少entry引用链接数
Definition fat32.c:406
int copyin(pagetable_t pagetable, char *dst, uint64 srcva, uint64 len)
从用户空间复制数据到内核空间
Definition vm.c:422
void setkilled(struct proc *p)
将给定进程状态设置为killed
Definition proc.c:447
int argstr(int n, char *buf, int max)
获取一个str类型的'\0'结尾的系统调用参数,
Definition syscall.c:79
int fetchstr(uint64 addr, char *buf, int max)
从当前进程获取位于addr的以'\0'结尾的字符串
Definition syscall.c:29
void bunpin(struct buf *b)
减少引用计数值
Definition bio.c:136
void scheduler(void) __attribute__((noreturn))
进程调度
Definition proc.c:279
void plic_complete(int)
告知PLIC正在处理的中断请求
Definition plic.c:61
int growproc(int n)
扩充或缩减进程的用户内存
Definition proc.c:246
struct file * filedup(struct file *f)
增加文件描述符f的引用计数值
Definition file.c:64
int copyinstr(pagetable_t pagetable, char *dst, uint64 srcva, uint64 max)
从用户空间复制一个以'\0'结尾的字符串到内核空间
Definition vm.c:452
int either_copyin(void *dst, int user_src, uint64 src, uint64 len)
要么从用户地址复制,要么从内核地址复制内容
Definition proc.c:473
void uartintr(void)
uart中断处理,当输入数据抵达或uart准备好更多输出时调用,被devintr函数调用。
Definition uart.c:201
void * memset(void *dst, int c, uint n)
给指定n大小的内存空间批量赋值
Definition string.c:15
void sleep(void *chain)
将进程p沉睡
Definition proc.c:396
int killed(struct proc *p)
给定进程是否已被killed
Definition proc.c:453
int filestat(struct file *f, uint64 addr)
获取文件的元数据(只针对stat结构体)
Definition file.c:102
void usertrapret(void)
返回用户空间
Definition trap.c:110
int fetchaddr(uint64 addr, uint64 *ip)
从当前进程获取位于addr的64位整数(即地址)
Definition syscall.c:18
void consoleinit(void)
初始化console
Definition console.c:190
void brelse(struct buf *b)
释放一个缓冲区,若当前的引用计数为0,则会被头插到空闲缓冲池中
Definition bio.c:107
struct file * filealloc(void)
从文件描述符池中申请文件描述符
Definition file.c:47
void argint(int n, int *ip)
获取int类型的系统调用参数
Definition syscall.c:67
void kfree(void *pa)
释放内存,通常释放kalloc申请到的内存,初始化kinit时除外
Definition kalloc.c:51
void uvmunmap(pagetable_t pagetable, uint64 va, uint64 npages, int do_free)
从虚拟地址va开始,移除npages页的映射,va必须是页对齐的,映射必须存在
Definition vm.c:182
char * safestrcpy(char *s, const char *t, int n)
类似于strncpy但保证一遇到'\0'就终止复制字符,且将'\0'也计入字符数量n
Definition string.c:26
void syscall(void)
系统调用
Definition syscall.c:101
int exec(char *path, char **argv)
exec系统调用,执行path指向的文件,携带argv作为参数
Definition exec.c:47
void kvminit(void)
初始化内核页表kernel_pagetable
Definition vm.c:64
struct cpu * mycpu(void)
得到当前运行的cpu(结构体),(此时中断需要禁用)
Definition proc.c:74
void eunlock(struct dirent *entry)
判断地址和链接数是否合法
Definition fat32.c:459
void bpin(struct buf *b)
增加引用计数值
Definition bio.c:129
void sched(void)
返回到调度器scheduler(),必须保证proc->state已经改变
Definition proc.c:376
void virtio_disk_intr(void)
虚拟 I/O 磁盘设备的中断处理,回收已完成操作的used ring
Definition virtio_disk.c:276
void trapinithart(void)
设置为在内核中接收异常和陷阱
Definition trap.c:40
void fileclose(struct file *f)
关闭文件描述符;若引用数不为0,则减少引用数,否则关闭
Definition file.c:75
void elock(struct dirent *entry)
判断地址和链接数是否合法
Definition fat32.c:452
char * formatname(char *name)
对输入的文件名进行格式化
Definition fat32.c:359
uint64 uvmdealloc(pagetable_t pagetable, uint64 oldsz, uint64 newsz)
释放用户进程的内存页,以将进程大小从oldsz缩小到newsz
Definition vm.c:282
int either_copyout(int user_dst, uint64 dst, void *src, uint64 len)
要么向用户地址复制,要么向内核地址复制内容
Definition proc.c:461
int uvmcopy(pagetable_t old, pagetable_t new, uint64 sz)
将一个进程的虚拟地址空间复制到另一个进程的虚拟地址空间,包括页表和物理内存
Definition vm.c:338
pagetable_t proc_pagetable(struct proc *p)
给进程p创建一个不带用户内存的用户页表,但带有trampoline和trapframe页
Definition proc.c:164
void uvmfirst(pagetable_t pagetable, uchar *src, uint sz)
将用户的initcode加载到进程的地址0处,用于第一个进程
Definition vm.c:228
char name[CHAR_SHORT_NAME]
Definition fat32.h:0
union dentry __attribute__
uint64 * pagetable_t
Definition riscv.h:523
uint64 pte_t
Definition riscv.h:522
uint dev
Definition buf.h:16
uint sectorno
Definition buf.h:17
uint32 off
Definition fat32.h:45
char filename[FAT32_MAX_FILENAME+1]
Definition fat32.h:32
pagetable_t pagetable
Definition proc.h:96
uint64 sz
Definition proc.h:95
int pid
Definition proc.h:89
unsigned short uint16
Definition types.h:20
unsigned long uint64
Definition types.h:24
unsigned char uchar
Definition types.h:15
unsigned int uint
Definition types.h:11
int write(int, char, int)