系列文章 : [6.1810] 跟著 MIT 6.1810 學習基礎作業系統觀念
uint64
sys_exit(void)
{
int n;
argint(0, &n);
kexit(n);
return 0; // not reached
}
uint64
sys_getpid(void)
{
return myproc()->pid;
}
取得當前 process 的 process ID ( PID )。
uint64
sys_fork(void)
{
return kfork();
}
直接去呼叫 kfork。
uint64
sys_wait(void)
{
uint64 p;
argaddr(0, &p);
return kwait(p);
}
kwait 的參數
uint64
sys_pause(void)
{
int n;
uint ticks0;
argint(0, &n);
if(n < 0)
n = 0;
acquire(&tickslock);
ticks0 = ticks;
while(ticks - ticks0 < n){
if(killed(myproc())){
release(&tickslock);
return -1;
}
sleep(&ticks, &tickslock);
}
release(&tickslock);
return 0;
}
ticks 這個全域變數,就需要先拿這個鎖pause 了,直接退出並 return -1,表示這次的 pause 失敗。pause 這個 function 的 process,不論想要睡多久,都睡在同一個 channel 上,並且也會同時被喚醒。uint64
sys_kill(void)
{
int pid;
argint(0, &pid);
return kkill(pid);
}
// return how many clock tick interrupts have occurred
// since start.
uint64
sys_uptime(void)
{
uint xticks;
acquire(&tickslock);
xticks = ticks;
release(&tickslock);
return xticks;
}
tickslock
xticks。uint64
sys_sbrk(void)
{
uint64 addr;
int t;
int n;
argint(0, &n);
argint(1, &t);
addr = myproc()->sz;
if(t == SBRK_EAGER || n < 0) {
if(growproc(n) < 0) {
return -1;
}
} else {
// Lazily allocate memory for this process: increase its memory
// size but don't allocate memory. If the processes uses the
// memory, vmfault() will allocate it.
if(addr + n < addr)
return -1;
myproc()->sz += n;
}
return addr;
}
增加 或是 減少 該 process 正在使用的 virtual memory ( 也就是 struct-proc->sz ) 大小的時候,可以使用這個系統呼叫。立即分配記憶體 ( SBRK_EAGER ),或是 先不分配記憶體 ( Lazily allocate memory )。kalloc 分配記憶體,並將該記憶體的 physical address <-> virtual address 的映射設置在該 process 的 page table。更多的 virtual address更少的 virtual address不想要 Lazily allocate memory,呼叫該 function 的當下就要真正的去配置記憶體給該 process。Lazily allocate memory。等到真的使用到這個區段的 virtual address,並發生 page fault 時候,才會進行真正的記憶體配置。