sys_sbrk()
用來改變一個 proc
的大小
addr
(先前的大小) 是為什麼?myproc()->sz
的旅程fork()
: init procfreeproc()
: delete procsys_sbrk()
: 真的在改變 process 大小的地方
growproc()
uvmalloc()
uvmdealloc()
growproc()
參數 n
可以是正數或是負數
uvmalloc()
把一個 page table 的大小從 oldsz
變成 newsz
uvmalloc()
的功用也就是把一個 page table 的大小從 oldsz 變成 newszkalloc()
出來的 memoryuvmalloc()
this might be trueuvmdealloc()
uvmdealloc()
也是把 page table 的 size 從 oldsz 變成 newszdo_free
uvmunmap()
uvmunmap()
是用來把 va 從 pagetable 中 ummap 的 functiondo_free
決定PTE_V
= 0 時會觸發 panic()
PTE_V
= 0 時,卻不會有 panic 是因為
uvmunmap()
在哪裡被使用到?growproc()
變成 lazy alloc 有什麼變化
uvmunmap()
會卡到 PTE_V
的原因copyin()
從 user copy 到 kernel
使用場景:
kernel/pipe.c
kernel/proc.c
kernel/syscall.c
arguments:
pagetable
: user program 的 page tabledst
: kernel virtual addresssrcva
: va in pagetable
len
在每一次的 while loop 中,把 va
我想 lazy alloc 的問題會在於 walkaddr()
因為會出現找不到 pa 的問題
可是有時候找不到 pa 並不是真的找不到 pa, 而是因為那個 va 是用 lazy alloc 的
copyout()
copyout()
是用來把,memory 的內容從 kernel 搬到 user
同樣的在 lazy lab 也會遇到問題
同樣是在 walkaddr() 時會有找不到 va0
對應的 pa 的問題
因為這個 va0
是用 lazy alloc 的
walkaddr()
丟入 va 回傳 pa
walk()
與 addrwalk()
的差別在於
walk()
return pteaddrwalk()
return pa
copyout
: 有可能copyin
: 正常情況下應該不太可能除非memmove()