xv6-simplified 0.1
简化版xv6
|
进程相关定义 More...
#include "include/types.h"
#include "include/riscv.h"
#include "include/defs.h"
#include "include/param.h"
#include "include/fat32.h"
#include "include/file.h"
#include "include/proc.h"
#include "include/memlayout.h"
Functions | |
void | forkret (void) |
fork申请的新进程初始化后第一步进入的函数,以返回用户空间 | |
void | proc_mapstacks (pagetable_t kpgtbl) |
给每个进程的内核栈申请一个页,将其映射到内存高地址,后面紧跟着一个无效保护页 | |
void | procinit (void) |
初始化进程 | |
int | cpuid () |
得到当前cpu的id,(此时中断需要禁用以防止进程间竞争挪到其他CPU) | |
struct cpu * | mycpu (void) |
得到当前运行的cpu(结构体),(此时中断需要禁用) | |
struct proc * | myproc (void) |
返回当前运行的进程(结构体指针),若没有返回0 | |
int | allocpid () |
申请下一个进程的id | |
pagetable_t | proc_pagetable (struct proc *p) |
给进程p创建一个不带用户内存的用户页表,但带有trampoline和trapframe页 | |
void | proc_freepagetable (pagetable_t pagetable, uint64 sz) |
释放进程页表并释放其引用的物理内存 | |
void | userinit (void) |
初始化第一个进程 | |
int | growproc (int n) |
扩充或缩减进程的用户内存 | |
void | reparent (struct proc *p) |
将进程p的废弃子进程全都移交给零号进程 | |
void | scheduler (void) |
进程调度 | |
void | exit (int status) |
退出当前进程,不返回,该退出的进程在其父进程调用wait()之前保持僵尸进程状态 | |
int | wait (uint64 addr) |
等待子进程退出 | |
void | sched (void) |
返回到调度器scheduler(),必须保证proc->state已经改变 | |
void | sleep (void *chan) |
将进程p沉睡 | |
void | wakeup (void *chan) |
唤醒chan链上的所有进程 | |
void | yield (void) |
当前进程放弃CPU,切换上下文给其他进程 | |
int | kill (int pid) |
kill给定pid的进程,但函数内不会直接让进程退出,只是设置killed状态为1,直到该进程试图返回用户空间时才会退出 | |
void | setkilled (struct proc *p) |
将给定进程状态设置为killed | |
int | killed (struct proc *p) |
给定进程是否已被killed | |
int | either_copyout (int usr_dst, uint64 dst, void *src, uint64 len) |
要么向用户地址复制,要么向内核地址复制内容 | |
int | either_copyin (void *dst, int usr_src, uint64 src, uint64 len) |
要么从用户地址复制,要么从内核地址复制内容 | |
void | procdump (void) |
用于debug,打印进程状态列表 | |
Variables | |
struct cpu | cpus [NCPU] |
struct proc | proc [NPROC] |
struct proc * | initproc |
int | nextpid = 1 |
char | trampoline [] |
uchar | initcode [] |
进程相关定义
int allocpid | ( | ) |
申请下一个进程的id
int cpuid | ( | void | ) |
得到当前cpu的id,(此时中断需要禁用以防止进程间竞争挪到其他CPU)
要么从用户地址复制,要么从内核地址复制内容
user_src | 1:从用户地址复制;0:从内核地址复制 |
dst | 复制的目标地址 |
src | 源地址 |
len | 复制的长度 |
要么向用户地址复制,要么向内核地址复制内容
user_dst | 1:向用户地址复制;0:向内核地址复制 |
dst | 复制的目标地址 |
src | 源地址 |
len | 复制的长度 |
void exit | ( | int | status | ) |
退出当前进程,不返回,该退出的进程在其父进程调用wait()之前保持僵尸进程状态
status | 该进程退出时的状态 |
void forkret | ( | void | ) |
fork申请的新进程初始化后第一步进入的函数,以返回用户空间
int growproc | ( | int | n | ) |
扩充或缩减进程的用户内存
n | 扩充的大小(byte) |
int kill | ( | int | pid | ) |
kill给定pid的进程,但函数内不会直接让进程退出,只是设置killed状态为1,直到该进程试图返回用户空间时才会退出
pid | 要kill的进程id |
int killed | ( | struct proc * | p | ) |
给定进程是否已被killed
p | 待判定的进程 |
struct cpu * mycpu | ( | void | ) |
得到当前运行的cpu(结构体),(此时中断需要禁用)
struct proc * myproc | ( | void | ) |
返回当前运行的进程(结构体指针),若没有返回0
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 | ) |
初始化进程
void reparent | ( | struct proc * | p | ) |
将进程p的废弃子进程全都移交给零号进程
p | 待移交子进程的进程 |
void sched | ( | void | ) |
返回到调度器scheduler(),必须保证proc->state已经改变
void scheduler | ( | void | ) |
进程调度
void setkilled | ( | struct proc * | p | ) |
将给定进程状态设置为killed
p | 待killed的进程 |
void sleep | ( | void * | chain | ) |
将进程p沉睡
chain | 等待的资源 |
void userinit | ( | void | ) |
初始化第一个进程
设置第一个用户进程
int wait | ( | uint64 | addr | ) |
等待子进程退出
addr | 存放子进程退出时状态的地址 |
void wakeup | ( | void * | chan | ) |
唤醒chan链上的所有进程
chan | sleep链,即其他进程申请的资源 |
void yield | ( | void | ) |
当前进程放弃CPU,切换上下文给其他进程
uchar initcode[] |
struct proc* initproc |
int nextpid = 1 |
|
extern |