其他部分:
本實(shí)驗(yàn)主要劃分為兩個部分,第一個部分是進(jìn)程切換判莉,如果PA3中間理解了系統(tǒng)調(diào)用的整個過程,那么這一部分是簡單的育谬,切換進(jìn)程的關(guān)鍵是中斷結(jié)束之后券盅,會從stack中間恢復(fù)上下文環(huán)境,如果A進(jìn)程調(diào)用_yield, 恢復(fù)的過程使用的是B進(jìn)程的上下文膛檀,那么之后執(zhí)行就是B進(jìn)程了锰镀。第二部分是地址映射,這一部分需要熟悉理解地址映射的工作原理是什么就可以了咖刃。其他都是細(xì)節(jié)泳炉,閱讀文檔,文檔一般會很詳細(xì)發(fā)的告訴你怎么辦嚎杨。
1 可能會遇到問題的地方
1.1 注意當(dāng)前代碼在軟件層還是硬件層
vme.c
中間的_map
函數(shù)和memory.c
中間的page_translate
分別位于軟件層次和硬件層次花鹅,兩者的操作邏輯很相似,因?yàn)榍罢呤翘顚懱搶?shí)地址的映射關(guān)系枫浙,后者使用映射關(guān)系刨肃。
前者可以隨意的使用指針類型裝換,但是后者確不可以(Makefile中間的編譯選項(xiàng)禁止任何警告), 所以page_translate中間只可以使用paddr_read函數(shù)來訪問存儲空間箩帚,并且注意paddr_read的訪問是按照byte訪問真友,但是int的數(shù)組訪問是按照四個byte訪問的,很多人發(fā)現(xiàn)兩者的操作的類似膏潮,然后兩個函數(shù)中間的代碼互相對照這寫锻狗,沒有注意到這一個小區(qū)別满力,PDX(va)<< 2
的就是由于byte訪問的結(jié)構(gòu)焕参。
paddr_t page_translate(vaddr_t va) {
if (cpu.cr0.paging) {
paddr_t page_dir = cpu.cr3.val;
paddr_t dir_entry_addr = page_dir + (PDX(va) << 2);
PDE page_tab =(PDE)paddr_read(dir_entry_addr, 4);
// ....
1.2 是時候理解一下鏈接的過程了
未完待續(xù)