(6)從零開始的操作系統開發日記

(聽說這是個叫做日yue記geng的系列)


前言:因爲各種各樣怠惰的原因,博客一直沒更,不是我懶啦,是因爲後面的課程發現一節課下來記錄的東西並不多,想要存起來一口氣寫,結果拖到了現在,嗯,肯定不是我偷懶喔(笑)

  1. lab2往後的eclipse配置要重新寫,而且要參照lab1,給makefile添加all命令,真坑,居然前後不一。關於makefile這個大坑,後面詳細說。

  2. lab3:
    find_vma(): if (!(vma != NULL && vma->vm_start <= addr && vma->vm_end > addr)) //(!(vma非空&&addr在vma的範圍內)) 即vma不合法時

  3. lab4:課上提起過寫時複製,但是實現起來正如課上所說的怎麼處理被換出的頁的代碼指向的部分已經被修改過這個問題,我暫時還沒有查閱相關資料。
    idleproc內核線程是在ucore操作系統沒有其他內核線程可執行的情況下才會被調用
    tf:中斷幀的指針,總是指向內核棧的某個位置:當進程從用戶空間跳到內核空間時,中斷幀記錄了進程在被中斷前的狀態。當內核需要跳回用戶空間時,需要調整中斷幀以恢復讓進程繼續執行的各寄存器值。除此之外,uCore內核允許嵌套中斷。因此爲了保證嵌套中斷髮生時tf 總是能夠指向當前的trapframe,uCore 在內核棧上維護了 tf 的鏈,可以參考trap.c::trap函數做進一步的瞭解。
    uCore在創建進程時分配了 2 個連續的物理頁(參見memlayout.h中KSTACKSIZE的定義)作爲內核棧的空間。這個棧很小,所以內核中的代碼應該儘可能的緊湊,並且避免在棧上分配大的數據結構,以免棧溢出,導致系統崩潰。

  4. lab5:內核被映射到高端地址,程序在低端,0xC000000以下
    fork實現兩種返回值:父進程返回子進程ID,子進程在創建的時候,把保存返回值的eax設置爲0,從而實現不同的返回值
    cow:對共享空間設置成只讀,在試圖寫的時候產生中斷,複製一頁內存,並同時將兩個頁修改成R/W,如果要考慮到換頁,會超級複雜

  5. lab7:monitor.next_count:發出條件變量signal操作的線程的個數

  6. 關於調試:
    簡直就是個大坑啊!!!!至今沒搞懂爲啥斷點會在kern_init停不下來,在其他地方倒可以,個人猜測可能是缺少了調試信息,但是我對比過輸出的編譯配置,跟其他的.c沒有什麼區別。其次就是很迷的不知道爲何非得要手動加載調試信息kernel,不能寫在eclipse的debug command或者寫在文本里,還要手動加斷點,好謎啊!
    至於makefile,需要自己手動添加用於eclipse調試的一些語句,比如啓動qemu然後等待鏈接gdb的語句(可以直接copy qemu命令的前半部分),上面也提過要自己加上all,方便eclipse去構建,在課程提供的Q&A資料裏,有提到過說一些很特別的情況會導致qemu不能下斷點,我不知道是不是隻有自己是這樣,或者我可以試試用bochs

課程的lab和視頻就暫時到這裏,課程到了後面的部分不算特別的難(加上我在此之前已經上過操作系統課),如果只是爲了完成lab的話幾乎就是翻譯代碼,而且還是人家寫好流程給你告訴你用那些函數去做的那種。但是很多地方還沒有完全徹底地搞懂,現在也猶豫着有沒有這個時間和精力去修改ucore來達到課程設計的要求。如果要這麼做的話,至少要實現一個內存管理算法,圖形用戶界面,FAT32磁盤管理,任務調度算法。尤其是圖形用戶界面和FAT32,涉及到硬件方面,而且不像其他兩樣ucore本身提供了很方便的框架(也可能是因爲目前我對lab8裏的設備IO和磁盤IO還沒有足夠認識),總之先繼續下去再說吧orz

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章