xv6-simplified 0.1
简化版xv6
|
Go to the source code of this file.
Macros | |
#define | NELEM(x) (sizeof(x) / sizeof(x[0])) |
Functions | |
void | printf (char *fmt,...) |
打印格式化内容,与c语言printf类似,仅支持d, x, p, s, %%, c;暂剔除调用锁的代码 | |
void | panic (char *s) __attribute__((noreturn)) |
程序中止并打印s字符串的内容,暂剔除调用锁的代码 | |
void | printfinit (void) |
printf初始化,暂剔除调用锁的代码 | |
void | kinit (void) |
初始化内存分配 | |
void | kfree (void *pa) |
释放内存,通常释放kalloc申请到的内存,初始化kinit时除外 | |
void * | kalloc (void) |
申请一个4096-byte的页表的物理内存 | |
void * | memset (void *dst, int c, uint n) |
给指定n大小的内存空间批量赋值 | |
char * | safestrcpy (char *s, const char *t, int n) |
类似于strncpy但保证一遇到'\0'就终止复制字符,且将'\0'也计入字符数量n | |
int | strlen (const char *s) |
返回字符串长度 | |
void * | memmove (void *dst, const void *src, uint n) |
将src指向的字符串挪到dst指向的指针 | |
int | strncmp (const char *p, const char *q, uint n) |
比较q和p字符串大小 | |
char * | strncpy (char *s, const char *t, int n) |
从t字符串赋值n个字符到s指向字符串 | |
char * | strchr (const char *s, char c) |
在一个字符串中查找一个特定字符 | |
void | strw2u (char *dst, const uint16 *src, int n) |
将16bit的wchar字符串转化为8bit的char字符串 | |
void | procinit (void) |
初始化进程 | |
void | userinit (void) |
初始化第一个进程 | |
void | scheduler (void) __attribute__((noreturn)) |
进程调度 | |
void | proc_mapstacks (pagetable_t kpgtbl) |
给每个进程的内核栈申请一个页,将其映射到内存高地址,后面紧跟着一个无效保护页 | |
int | cpuid (void) |
得到当前cpu的id,(此时中断需要禁用以防止进程间竞争挪到其他CPU) | |
struct cpu * | mycpu (void) |
得到当前运行的cpu(结构体),(此时中断需要禁用) | |
struct proc * | myproc (void) |
返回当前运行的进程(结构体指针),若没有返回0 | |
pagetable_t | proc_pagetable (struct proc *p) |
给进程p创建一个不带用户内存的用户页表,但带有trampoline和trapframe页 | |
void | proc_freepagetable (pagetable_t pagetable, uint64 sz) |
释放进程页表并释放其引用的物理内存 | |
int | growproc (int n) |
扩充或缩减进程的用户内存 | |
void | exit (int status) |
退出当前进程,不返回,该退出的进程在其父进程调用wait()之前保持僵尸进程状态 | |
int | wait (uint64 addr) |
等待子进程退出 | |
void | sched (void) |
返回到调度器scheduler(),必须保证proc->state已经改变 | |
int | kill (int pid) |
kill给定pid的进程,但函数内不会直接让进程退出,只是设置killed状态为1,直到该进程试图返回用户空间时才会退出 | |
void | setkilled (struct proc *p) |
将给定进程状态设置为killed | |
int | killed (struct proc *p) |
给定进程是否已被killed | |
int | either_copyout (int user_dst, uint64 dst, void *src, uint64 len) |
要么向用户地址复制,要么向内核地址复制内容 | |
int | either_copyin (void *dst, int user_src, uint64 src, uint64 len) |
要么从用户地址复制,要么从内核地址复制内容 | |
void | procdump (void) |
用于debug,打印进程状态列表 | |
void | wakeup (void *) |
唤醒chan链上的所有进程 | |
void | sleep (void *chain) |
将进程p沉睡 | |
void | yield (void) |
当前进程放弃CPU,切换上下文给其他进程 | |
void | kvmmap (pagetable_t kpgtbl, uint64 va, uint64 pa, uint64 sz, int perm) |
将虚拟地址范围映射到物理地址,并将相应的PTE添加到页表中 | |
pagetable_t | uvmcreate () |
创建一个空的用户页表 | |
int | mappages (pagetable_t pagetable, uint64 va, uint64 size, uint64 pa, int perm) |
从va开始的虚拟地址创建PTE,这些PTE指向从pa开始的物理地址 | |
void | uvmfree (pagetable_t pagetable, uint64 sz) |
释放用户进程的内存页和页表页 | |
void | uvmunmap (pagetable_t pagetable, uint64 va, uint64 npages, int do_free) |
从虚拟地址va开始,移除npages页的映射,va必须是页对齐的,映射必须存在 | |
void | uvmfirst (pagetable_t pagetable, uchar *src, uint sz) |
将用户的initcode加载到进程的地址0处,用于第一个进程 | |
uint64 | uvmalloc (pagetable_t pagetable, uint64 oldsz, uint64 newsz, int xperm) |
为进程从oldsz到newsz分配PTE和物理内存 | |
uint64 | uvmdealloc (pagetable_t pagetable, uint64 oldsz, uint64 newsz) |
释放用户进程的内存页,以将进程大小从oldsz缩小到newsz | |
void | kvminit (void) |
初始化内核页表kernel_pagetable | |
void | kvminithart (void) |
将硬件页表寄存器切换到内核页表,并启用分页 | |
int | copyin (pagetable_t pagetable, char *dst, uint64 srcva, uint64 len) |
从用户空间复制数据到内核空间 | |
int | copyinstr (pagetable_t pagetable, char *dst, uint64 srcva, uint64 max) |
从用户空间复制一个以'\0'结尾的字符串到内核空间 | |
void | uvmclear (pagetable_t pagetable, uint64 va) |
将一个页表项标记为无效,使得用户无法访问该页。它通常被用于为用户栈设置保护页 | |
int | copyout (pagetable_t pagetable, uint64 dstva, char *src, uint64 len) |
从内核空间复制数据到用户空间 | |
uint64 | walkaddr (pagetable_t pagetable, uint64 va) |
查找虚拟地址对应的物理地址,如果没有映射则返回0,它只能用于查找用户页 | |
pte_t * | walk (pagetable_t pagetable, uint64 va, int alloc) |
在页表中查找虚拟地址va对应的页表项,如果页表项不存在则根据alloc参数决定是否分配新的页表 | |
int | uvmcopy (pagetable_t old, pagetable_t new, uint64 sz) |
将一个进程的虚拟地址空间复制到另一个进程的虚拟地址空间,包括页表和物理内存 | |
void | binit (void) |
初始化缓冲区缓存,创建一个缓冲区的链表 | |
struct buf * | bread (uint dev, uint sectorno) |
将指定设备上指定扇区的内容存储在buffer中 | |
void | brelse (struct buf *b) |
释放一个缓冲区,若当前的引用计数为0,则会被头插到空闲缓冲池中 | |
void | bwrite (struct buf *b) |
将一个缓冲区的内容写入到磁盘中 | |
void | bpin (struct buf *b) |
增加引用计数值 | |
void | bunpin (struct buf *b) |
减少引用计数值 | |
void | virtio_disk_init (void) |
初始化virtio,重置缓冲区描述符虚拟队列、空闲ring、used ring,初始化状态寄存器 | |
void | virtio_disk_rw (struct buf *b, int write) |
虚拟磁盘读写函数 | |
void | virtio_disk_intr (void) |
虚拟 I/O 磁盘设备的中断处理,回收已完成操作的used ring | |
void | swtch (struct context *old, struct context *new) |
切换当前的上下文,将当前的上下文存入old,从new中取出上下文作为当前上下文 | |
void | argint (int n, int *ip) |
获取int类型的系统调用参数 | |
int | argstr (int n, char *buf, int max) |
获取一个str类型的'\0'结尾的系统调用参数, | |
void | argaddr (int n, uint64 *ip) |
获取一个指针参数(不检查其合法性,后续过程中会检查) | |
int | fetchstr (uint64 addr, char *buf, int max) |
从当前进程获取位于addr的以'\0'结尾的字符串 | |
int | fetchaddr (uint64 addr, uint64 *ip) |
从当前进程获取位于addr的64位整数(即地址) | |
void | syscall (void) |
系统调用 | |
int | exec (char *path, char **argv) |
exec系统调用,执行path指向的文件,携带argv作为参数 | |
void | trapinit (void) |
初始化trap | |
void | trapinithart (void) |
设置为在内核中接收异常和陷阱 | |
void | usertrapret (void) |
返回用户空间 | |
void | uartinit (void) |
初始化uart各个寄存器 | |
void | uartintr (void) |
uart中断处理,当输入数据抵达或uart准备好更多输出时调用,被devintr函数调用。 | |
void | uartputc (int c) |
将字符写入输出缓冲区,通知UART开始发送字符。 | |
void | uartputc_sync (int c) |
uartputc()的变体,不需要使用中断。 | |
int | uartgetc (void) |
从UART读入一个输入字符 | |
void | plicinit (void) |
初始化平台级中断 | |
void | plicinithart (void) |
设置hart中相应的比特位 | |
int | plic_claim (void) |
获取目前应该服务的中断请求 | |
void | plic_complete (int) |
告知PLIC正在处理的中断请求 | |
void | consoleinit (void) |
初始化console | |
void | consoleintr (int) |
console输入中断处理程序 | |
void | consputc (int c) |
将字符输送到uart输出寄存器 | |
struct file * | filealloc (void) |
从文件描述符池中申请文件描述符 | |
void | fileclose (struct file *f) |
关闭文件描述符;若引用数不为0,则减少引用数,否则关闭 | |
struct file * | filedup (struct file *f) |
增加文件描述符f的引用计数值 | |
void | fileinit (void) |
初始化文件池中的文件 | |
int | fileread (struct file *f, uint64 addr, int n) |
读文件f | |
int | filestat (struct file *f, uint64 addr) |
获取文件的元数据(只针对stat结构体) | |
int | filewrite (struct file *f, uint64 addr, int n) |
写文件f | |
int | fat32_init (void) |
初始化 FAT32 文件系统 | |
struct dirent * | dirlookup (struct dirent *entry, char *filename, uint *poff) |
在指定目录项中查找指定文件名的目录项 | |
char * | formatname (char *name) |
对输入的文件名进行格式化 | |
struct dirent * | edup (struct dirent *entry) |
增加目录项的引用链接数 | |
void | eupdate (struct dirent *entry) |
将目录的更改更新到磁盘上 | |
void | eput (struct dirent *entry) |
把目录项entry插入到root之后,减少entry引用链接数 | |
void | estat (struct dirent *ep, struct stat *st) |
将一个目录项的信息转换为一个文件状态结构体 | |
void | elock (struct dirent *entry) |
判断地址和链接数是否合法 | |
void | eunlock (struct dirent *entry) |
判断地址和链接数是否合法 | |
int | enext (struct dirent *dp, struct dirent *ep, uint off, int *count) |
在dp描述的目录项的off个字节偏移处寻找相应的目录项并存放到ep中 | |
struct dirent * | ename (char *path) |
根据路径名查目录 | |
int | eread (struct dirent *entry, int user_dst, uint64 dst, uint off, uint n) |
从一个文件的指定偏移量开始读取一定数量的字节 | |
int | ewrite (struct dirent *entry, int user_src, uint64 src, uint off, uint n) |
从一个文件的指定偏移量开始写入一定数量的字节 | |
Variables | |
uint | ticks |
#define NELEM | ( | x | ) | (sizeof(x) / sizeof(x[0])) |
void argaddr | ( | int | n, |
uint64 * | ip | ||
) |
获取一个指针参数(不检查其合法性,后续过程中会检查)
n | 第n个参数 |
ip | 存放指针的指针 |
void argint | ( | int | n, |
int * | ip | ||
) |
获取int类型的系统调用参数
n | 第n个参数 |
ip | 存放参数的指针 |
int argstr | ( | int | n, |
char * | buf, | ||
int | max | ||
) |
获取一个str类型的'\0'结尾的系统调用参数,
n | 第n个参数 |
buf | 存放参数的指针 |
max | 字符串最大长度 |
void binit | ( | void | ) |
初始化缓冲区缓存,创建一个缓冲区的链表
最近使用的缓冲区在链表头部,最不常用的缓冲区在链表尾部,LRU
void bpin | ( | struct buf * | b | ) |
增加引用计数值
b | 缓冲区 |
将指定设备上指定扇区的内容存储在buffer中
dev | 设备号 |
sectorno | 扇区号 |
void brelse | ( | struct buf * | b | ) |
释放一个缓冲区,若当前的引用计数为0,则会被头插到空闲缓冲池中
b | 待释放的缓冲区 |
void bunpin | ( | struct buf * | b | ) |
减少引用计数值
b | 缓冲区 |
void bwrite | ( | struct buf * | b | ) |
将一个缓冲区的内容写入到磁盘中
b | 缓冲区 |
void consoleinit | ( | void | ) |
初始化console
void consoleintr | ( | int | c | ) |
console输入中断处理程序
void consputc | ( | int | c | ) |
将字符输送到uart输出寄存器
c | 输入字符 |
int copyin | ( | pagetable_t | pagetable, |
char * | dst, | ||
uint64 | srcva, | ||
uint64 | len | ||
) |
从用户空间复制数据到内核空间
pagetable | 页表 |
dst | 目标内存地址 |
srcva | 源内存地址 |
len | 要复制的数据长度 |
int copyinstr | ( | pagetable_t | pagetable, |
char * | dst, | ||
uint64 | srcva, | ||
uint64 | max | ||
) |
从用户空间复制一个以'\0'结尾的字符串到内核空间
pagetable | 页表 |
dst | 目标内存地址 |
srcva | 源内存地址 |
max | 最大复制字节数 |
int copyout | ( | pagetable_t | pagetable, |
uint64 | dstva, | ||
char * | src, | ||
uint64 | len | ||
) |
从内核空间复制数据到用户空间
pagetable | 用户进程的页表 |
dstva | 目标虚拟地址 |
src | 源数据的指针 |
len | 要复制的数据长度 |
int cpuid | ( | void | ) |
得到当前cpu的id,(此时中断需要禁用以防止进程间竞争挪到其他CPU)
在指定目录项中查找指定文件名的目录项
entry | 指定的目录项 |
filename | 目标文件名 |
poff | 若找到目标目录项不启用,否则用于记录与目标文件等长目录项的空目录项的起始偏移或目录末尾 |
增加目录项的引用链接数
entry | 待更新的目录项 |
要么从用户地址复制,要么从内核地址复制内容
user_src | 1:从用户地址复制;0:从内核地址复制 |
dst | 复制的目标地址 |
src | 源地址 |
len | 复制的长度 |
要么向用户地址复制,要么向内核地址复制内容
user_dst | 1:向用户地址复制;0:向内核地址复制 |
dst | 复制的目标地址 |
src | 源地址 |
len | 复制的长度 |
void elock | ( | struct dirent * | entry | ) |
判断地址和链接数是否合法
entry | 目录 |
struct dirent * ename | ( | char * | path | ) |
根据路径名查目录
path | 路径名 |
在dp描述的目录项的off个字节偏移处寻找相应的目录项并存放到ep中
dp | 要查找目录项所在的上级目录描述符 |
ep | 存放目标目录项的描述符 |
off | 从dp开始的偏移字节数 |
count | 存放目标目录项数量的地址 |
void eput | ( | struct dirent * | entry | ) |
把目录项entry插入到root之后,减少entry引用链接数
entry | 目录 |
从一个文件的指定偏移量开始读取一定数量的字节
entry | 目录项的指针,要读取的文件 |
user_dst | 目标地址是否在用户空间 |
dst | 数据读取的目标地址 |
off | 从文件的哪个偏移量开始读取 |
n | 读取的字节数 |
将一个目录项的信息转换为一个文件状态结构体
de | 目录项 |
st | 文件状态结构体 |
void eunlock | ( | struct dirent * | entry | ) |
判断地址和链接数是否合法
entry | 目录 |
void eupdate | ( | struct dirent * | entry | ) |
将目录的更改更新到磁盘上
entry | 目录 |
从一个文件的指定偏移量开始写入一定数量的字节
entry | 目录项的指针,要写入的文件 |
user_src | 数据来源是否在用户空间 |
src | 数据来源的地址 |
off | 写入文件的偏移量 |
n | 写入的字节数 |
int exec | ( | char * | path, |
char ** | argv | ||
) |
exec系统调用,执行path指向的文件,携带argv作为参数
path | 执行的文件路径 |
argv | 携带的参数 |
void exit | ( | int | status | ) |
退出当前进程,不返回,该退出的进程在其父进程调用wait()之前保持僵尸进程状态
status | 该进程退出时的状态 |
int fat32_init | ( | void | ) |
初始化 FAT32 文件系统
从磁盘上读取文件系统的元数据,然后将这些元数据存储在内存中的相应数据结构中
从当前进程获取位于addr的64位整数(即地址)
addr | 要获取的64位整数的地址 |
ip | 存放64位整数的指针 |
int fetchstr | ( | uint64 | addr, |
char * | buf, | ||
int | max | ||
) |
从当前进程获取位于addr的以'\0'结尾的字符串
addr | 要获取的字符串地址 |
buf | 存放字符串的指针 |
max | 获取的字符串最大长度 |
struct file * filealloc | ( | void | ) |
从文件描述符池中申请文件描述符
void fileclose | ( | struct file * | f | ) |
关闭文件描述符;若引用数不为0,则减少引用数,否则关闭
f | 待关闭的文件描述符 |
增加文件描述符f的引用计数值
f | 文件描述符 |
void fileinit | ( | void | ) |
初始化文件池中的文件
读文件f
f | 文件 |
addr | 用户虚拟地址 |
n | 读取字节数 |
获取文件的元数据(只针对stat结构体)
f | 文件描述符 |
addr | 存放元数据的用户虚拟地址 |
写文件f
f | 文件描述符 |
addr | 源数据用户虚拟地址 |
n | 写字节数 |
char * formatname | ( | char * | name | ) |
对输入的文件名进行格式化
name | 要格式化的文件名 |
int growproc | ( | int | n | ) |
扩充或缩减进程的用户内存
n | 扩充的大小(byte) |
void * kalloc | ( | void | ) |
申请一个4096-byte的页表的物理内存
void kfree | ( | void * | pa | ) |
释放内存,通常释放kalloc申请到的内存,初始化kinit时除外
pa | 指向待释放内存的指针 |
int kill | ( | int | pid | ) |
kill给定pid的进程,但函数内不会直接让进程退出,只是设置killed状态为1,直到该进程试图返回用户空间时才会退出
pid | 要kill的进程id |
int killed | ( | struct proc * | p | ) |
给定进程是否已被killed
p | 待判定的进程 |
void kinit | ( | void | ) |
初始化内存分配
void kvminit | ( | void | ) |
初始化内核页表kernel_pagetable
void kvminithart | ( | void | ) |
将硬件页表寄存器切换到内核页表,并启用分页
void kvmmap | ( | pagetable_t | kpgtbl, |
uint64 | va, | ||
uint64 | pa, | ||
uint64 | sz, | ||
int | perm | ||
) |
将虚拟地址范围映射到物理地址,并将相应的PTE添加到页表中
kpgtbl | 内核页表的起始地址 |
va | 起始虚拟地址 |
pa | 起始物理地址 |
sz | 映射的大小 |
perm | 相应的权限 |
int mappages | ( | pagetable_t | pagetable, |
uint64 | va, | ||
uint64 | size, | ||
uint64 | pa, | ||
int | perm | ||
) |
从va开始的虚拟地址创建PTE,这些PTE指向从pa开始的物理地址
pagetable | 页表的起始地址 |
va | 起始虚拟地址 |
size | 映射的大小 |
pa | 起始物理地址 |
perm | 相应的权限 |
void * memmove | ( | void * | dst, |
const void * | src, | ||
uint | n | ||
) |
将src指向的字符串挪到dst指向的指针
dst | 目标指针 |
src | 源指针 |
void * memset | ( | void * | dst, |
int | c, | ||
uint | n | ||
) |
给指定n大小的内存空间批量赋值
dst | 待赋值的内存开始指针 |
c | 将赋值的值 |
n | 赋值空间的大小 |
struct cpu * mycpu | ( | void | ) |
得到当前运行的cpu(结构体),(此时中断需要禁用)
struct proc * myproc | ( | void | ) |
返回当前运行的进程(结构体指针),若没有返回0
void panic | ( | char * | s | ) |
程序中止并打印s字符串的内容,暂剔除调用锁的代码
s | 要打印的字符串 |
int plic_claim | ( | void | ) |
获取目前应该服务的中断请求
void plic_complete | ( | int | irq | ) |
告知PLIC正在处理的中断请求
void plicinit | ( | void | ) |
初始化平台级中断
void plicinithart | ( | void | ) |
设置hart中相应的比特位
void printf | ( | char * | fmt, |
... | |||
) |
打印格式化内容,与c语言printf类似,仅支持d, x, p, s, %%, c;暂剔除调用锁的代码
fmt | 字符指针,要打印的内容 |
... | 可变长度参数,格式化替换变量值 |
void printfinit | ( | void | ) |
printf初始化,暂剔除调用锁的代码
void proc_freepagetable | ( | pagetable_t | pagetable, |
uint64 | sz | ||
) |
释放进程页表并释放其引用的物理内存
pagetable | 待释放的页表 |
sz | 释放的大小 |
void proc_mapstacks | ( | pagetable_t | kpgtbl | ) |
给每个进程的内核栈申请一个页,将其映射到内存高地址,后面紧跟着一个无效保护页
kpgtbl | 内核页表 |
pagetable_t proc_pagetable | ( | struct proc * | p | ) |
给进程p创建一个不带用户内存的用户页表,但带有trampoline和trapframe页
p | 给定的进程 |
void procdump | ( | void | ) |
用于debug,打印进程状态列表
void procinit | ( | void | ) |
初始化进程
char * safestrcpy | ( | char * | s, |
const char * | t, | ||
int | n | ||
) |
类似于strncpy但保证一遇到'\0'就终止复制字符,且将'\0'也计入字符数量n
s | 目标字符指针 |
t | 源字符指针 |
n | 复制字符数量 |
void sched | ( | void | ) |
返回到调度器scheduler(),必须保证proc->state已经改变
void scheduler | ( | void | ) |
进程调度
void setkilled | ( | struct proc * | p | ) |
将给定进程状态设置为killed
p | 待killed的进程 |
void sleep | ( | void * | chain | ) |
将进程p沉睡
chain | 等待的资源 |
char * strchr | ( | const char * | s, |
char | c | ||
) |
在一个字符串中查找一个特定字符
s | 目标字符串 |
c | 查找字符 |
int strlen | ( | const char * | s | ) |
返回字符串长度
s |
int strncmp | ( | const char * | p, |
const char * | q, | ||
uint | n | ||
) |
比较q和p字符串大小
p | 字符串(前) |
q | 字符串(后) |
n | 比较字符数目 |
char * strncpy | ( | char * | s, |
const char * | t, | ||
int | n | ||
) |
从t字符串赋值n个字符到s指向字符串
s | 目标字符串 |
t | 源字符串 |
n | 欲复制的字符数量 |
void strw2u | ( | char * | dst, |
const uint16 * | src, | ||
int | n | ||
) |
将16bit的wchar字符串转化为8bit的char字符串
dst | 目标存放地址 |
src | 源数据存放地址 |
n | 转化的src字符串长度 |
切换当前的上下文,将当前的上下文存入old,从new中取出上下文作为当前上下文
old | 存放当前上下文的地址 |
new | 作为当前上下文的地址 |
void syscall | ( | void | ) |
系统调用
void trapinit | ( | void | ) |
初始化trap
void trapinithart | ( | void | ) |
设置为在内核中接收异常和陷阱
int uartgetc | ( | void | ) |
从UART读入一个输入字符
void uartinit | ( | void | ) |
初始化uart各个寄存器
void uartintr | ( | void | ) |
uart中断处理,当输入数据抵达或uart准备好更多输出时调用,被devintr函数调用。
void uartputc | ( | int | c | ) |
将字符写入输出缓冲区,通知UART开始发送字符。
若输出缓冲区满则阻塞。只适合在write调用中使用。
c | 输入字符 |
void uartputc_sync | ( | int | c | ) |
uartputc()的变体,不需要使用中断。
内核的printf使用该函数输入字符,它会忙等uart的输出寄存器变为空。
c | 输入字符 |
void userinit | ( | void | ) |
初始化第一个进程
设置第一个用户进程
void usertrapret | ( | void | ) |
返回用户空间
uint64 uvmalloc | ( | pagetable_t | pagetable, |
uint64 | oldsz, | ||
uint64 | newsz, | ||
int | xperm | ||
) |
为进程从oldsz到newsz分配PTE和物理内存
pagetable | 进程的页表 |
oldsz | 进程的旧大小 |
newsz | 进程的新大小 |
xperm | 权限 |
void uvmclear | ( | pagetable_t | pagetable, |
uint64 | va | ||
) |
将一个页表项标记为无效,使得用户无法访问该页。它通常被用于为用户栈设置保护页
pagetable | 用户进程的页表 |
va | 虚拟地址 |
int uvmcopy | ( | pagetable_t | old, |
pagetable_t | new, | ||
uint64 | sz | ||
) |
将一个进程的虚拟地址空间复制到另一个进程的虚拟地址空间,包括页表和物理内存
old | 源进程的页表 |
new | 目标进程的页表 |
sz | 源进程的大小 |
pagetable_t uvmcreate | ( | ) |
创建一个空的用户页表
uint64 uvmdealloc | ( | pagetable_t | pagetable, |
uint64 | oldsz, | ||
uint64 | newsz | ||
) |
释放用户进程的内存页,以将进程大小从oldsz缩小到newsz
pagetable | 进程的页表 |
oldsz | 进程的旧大小 |
newsz | 进程的新大小 |
void uvmfirst | ( | pagetable_t | pagetable, |
uchar * | src, | ||
uint | sz | ||
) |
将用户的initcode加载到进程的地址0处,用于第一个进程
pagetable | 进程的页表 |
src | 指向用户initcode的指针 |
sz | 用户initcode的大小,必须小于一页 |
void uvmfree | ( | pagetable_t | pagetable, |
uint64 | sz | ||
) |
释放用户进程的内存页和页表页
pagetable | 用户进程的页表 |
sz | 用户进程的大小 |
void uvmunmap | ( | pagetable_t | pagetable, |
uint64 | va, | ||
uint64 | npages, | ||
int | do_free | ||
) |
从虚拟地址va开始,移除npages页的映射,va必须是页对齐的,映射必须存在
pagetable | 页表 |
va | 虚拟地址 |
npages | 要移除的页数 |
do_free | 是否释放物理内存 |
void virtio_disk_init | ( | void | ) |
初始化virtio,重置缓冲区描述符虚拟队列、空闲ring、used ring,初始化状态寄存器
void virtio_disk_intr | ( | void | ) |
虚拟 I/O 磁盘设备的中断处理,回收已完成操作的used ring
void virtio_disk_rw | ( | struct buf * | b, |
int | write | ||
) |
虚拟磁盘读写函数
b | 操作的缓冲区 |
write | 是否为写设备 |
int wait | ( | uint64 | addr | ) |
等待子进程退出
addr | 存放子进程退出时状态的地址 |
void wakeup | ( | void * | chan | ) |
唤醒chan链上的所有进程
chan | sleep链,即其他进程申请的资源 |
pte_t * walk | ( | pagetable_t | pagetable, |
uint64 | va, | ||
int | alloc | ||
) |
在页表中查找虚拟地址va对应的页表项,如果页表项不存在则根据alloc参数决定是否分配新的页表
pagetable | 页表的起始地址 |
va | 所需查找的虚拟地址 |
alloc | 是否需要分配新的页表项 |
uint64 walkaddr | ( | pagetable_t | pagetable, |
uint64 | va | ||
) |
查找虚拟地址对应的物理地址,如果没有映射则返回0,它只能用于查找用户页
pagetable | 页表 |
va | 虚拟地址 |
void yield | ( | void | ) |
当前进程放弃CPU,切换上下文给其他进程
|
extern |