Ex 1
仿照pages寫env即可
但是發(fā)現(xiàn)一直說paddr(0)
應該是kern pgdir里面分配了自己的位置
需要在boot alloc里面添加一行
Ex2
env_init:從后向前初始化,為了env_free_list正好指向下一個env
env_setup_vm:注釋里面說除了增加pp ref,可以用kern pgdir用模版初始化
region_alloc:給每個env分配、映射物理內(nèi)存;先把兩個對齊,之后用page alloc分配頁
load_icode() parse an ELF binary image, much like the boot loader already does, and load its contents into the user address space of a new environment. 希望將可執(zhí)行二進制文件取出來執(zhí)行:將boot/main.c里面的代碼復制過來,然后
env_create()用env alloc分配一個環(huán)境,調(diào)用load icode去加載ELF
env_run() 根據(jù)注釋寫就好了
Ex3
看第九章
Ex4

按照這個表格在.S文件里面,也類似于“注冊”(?我也不知道怎么表達)注意根據(jù)是否有EC用不同的函數(shù),再把每個函數(shù)到trap init里面初始化中斷向量表格;SETGATE的最后一個參數(shù)表示的是權(quán)限,查了網(wǎng)上資料發(fā)現(xiàn):系統(tǒng)調(diào)用和斷點是用戶態(tài)下可以的,而其他的則是因為錯誤而陷入到了內(nèi)核中

先壓ds和es,pushal
然后將GD_KD mov進這兩個寄存器
最后pushl, call
Ex5
對tf檢查tf_trap number,然后使用page_fault_handler(tf);
加一行tf_cs檢查是不是kernel態(tài)的
Ex6
斷點:加一個switch分支判斷,用monitor函數(shù)(這個就提到了一句system monitor,根本不知道從哪去找。。。)
Ex7
添加一個分支,然后按照順序放六個寄存器
在lib中指出第一個ax是系統(tǒng)調(diào)用號

Ex8
model specific registers (MSRs).
Ex9
Hint: look in inc/env.h and use sys_getenvid.
ENVX這個宏是描述全局變量envs這個數(shù)組索引的
Ex10
For the implementation, you just need to allocate multiple pages and insert them into the correct positions in page table, growing the heap higher. The load_icode() may act as a hint. You also might need to modify struct Env to record the current program's break and update them accordingly in sbrk().
你需要分配多個頁,把他們插入頁表正確位置,使堆增長。load icode函數(shù)可以作為一個提示,還需要修改Env記錄當前程序的斷點并在sbrk中更新。
首先在env.h里面增加一個成員 env_break 記錄棧的底
在load icode region alloc完了的時候記錄這個棧底,并且對齊
然后在sbrk的時候,要往下inc的長度,就調(diào)用region alloc往下inc
返回新棧底也要對齊??!
Ex11
先往page fault handler里面加上對cs低位的判斷
遍歷這塊區(qū)域(包括頭尾),用walk函數(shù)檢查頁的權(quán)限;實際在寫的時候發(fā)現(xiàn)直接rounddown只能拿5分,查閱網(wǎng)上資料知第一次應該從va開始然后再rounddown可獲10分
給syscall里面的第一個put調(diào)用assert函數(shù)
Finally, change debuginfo_eip in kern/kdebug.c to call user_mem_check on usd, stabs, and stabstr. 注意一下第三個參數(shù)大小
Ex12

Ex13
上來先說調(diào)用fun ptr用一個包裝函數(shù),上面已經(jīng)給了就是call fun ptr
大概看懂了sgdt是幫我們存儲現(xiàn)在gdt的命令,然后可以通過用戶態(tài)訪問,試圖去hack這個漏洞?
在現(xiàn)有提示的基礎(chǔ)上把包裝函數(shù)里面改了,重新設(shè)置一個新的入口