CSE 506 Lab 4 - Multiprocessor Support and Cooperative Multitasking

Lab 4 包含三個部分,其中 A 部分介紹 x86 架構的 multiprocessor 啟動與初始化流程,並且實作簡易的 round-robin process scheduling。而我認為從 bootstrap processor 啟動並初始化,到透過 bootstrap processor 把其他的 processor 啟動的整個過程相當重要,可以讓新手更具體地知道 multiprocessor 的運作方式。

JOS 實作 intel MultiProcessor Specification(MPS) 標準,在看 source code 的時候,搭配這個文件來看會更加理解每項步驟的用意。

Note: Multiprocessor 架構會依據設計而有所不同,以下所提到的內容皆以 x86 MPS 制定的規格為主。

Multiprocessor

Architecture

Multiprocessor 架構下,每個 processor 有各自的 L1 cache 和 APIC,並且透過 ICC (interrupt controller communications) bus 進行溝通。

CSE 506 Lab 3 - Interrupts

閒聊

2020 年過去了,因為年底各種考試和工作, Lab3 下半部份延遲到現在才完成。雖然拖蠻久的,但是往好的方向看就是有在持續進行下去,沒有放棄就是好結局!最近心境上有蠻多變化的,其中本來對於目前工作內容很疑惑,覺得跟純軟生活落差太大,但是在工作中慢慢地發現自己對於 security 領域的認知嚴重不足,如果能好好學習 security 相關知識,對於自己和未來發展還是挺有幫助的,結合 security 與 embedded or cloud 去發展,是一個有趣又有挑戰性的目標,因此目前就朝著這方向努力,希望今年可以在 COSCUP 分享 security 相關議題。

Lab 3 Interrupts

在開始實作 interrupt 之前,先結合上一篇 CSE 506 Lab 3 - User Environments(Processes) environment(process) 的觀念,綜觀一下 interrupt 結合 environment context switch 的 interrupt handle 過程。

CSE 506 Lab 3 - User Environments(Processes)

閒聊

之前在辦活動的時候,得知有朋友在 follow 我的 Blog ,真是讓我非常訝異,因為我一直是默默撰寫文章,而且雖然我有參與 Golang 和 GDG 社群,但是我寫的內容很常都跟 Golang 和 Google 技術沒什麼太大關係 XD 非常感謝各位的觀看,之前有近兩個月都沒更新,感覺有點罪惡,以後會盡量定期更新的。

目前除了自修 CSE 506 課程之外,還有學習 RISC-V instruction 以及 pipeline,因為過往經驗都是看 x86_64 instruction 居多,現在改看 RISC-V 還蠻不習慣的。另外就是還想學用 Rust 寫 kernel module,目前趨勢是有些 Kernel developers 嘗試將 Rust code 結合進 Linux kernel 中,再加上 Rust 的發展也蠻成熟,是時候抽空來學習一下。

CSE 506 Lab2 - Memory Management and Virtual Memory Mapping

閒聊

上次寫完 Lab 2 source code study 之後,一晃眼就過了近兩個月。中間被各種事物攔截,加上剛好有些機遇和機會,因此挪了一些時間去準備,等事情有比較明朗後再跟大家分享。此外,學校也開學了,這學期修了偏硬體架構的課程,包含 RISC-V 和架構效能分析等,單智君教授的教學內容很好,聲音也很溫柔,非常喜歡這位教授的課程。

這時間還遇上 Macbook 螢幕完全無法顯示的意外,經由朋友提醒,2016 年產的 13 吋 Macbook Pro 有螢幕背光災情,Apple 有提供免費召回維修的服務,因此花了一些時間送修。而 Apple 的服務也還不錯,整個螢幕換新,看來又可以撐好一陣子了 <3

Lab 2

實驗說明文件

Part 1: Physical Page Management

Part 1 是實作 physical memory allocator。在 CSE 506 Lab2 - E820 Memory Map & Page Translation (1) 可以看到系統在執行 kernel code 前,有先在 bootstrap 階段建立 page translation 所需的 pml4 table,以確保 kernel code 可以正確地被執行,不過在 kernel code 運行階段,我們需要建立新的 pml4 table ,來讓我們可以有更多控制權。

CSE 506 Lab2 - E820 Memory Map & Page Translation (1)

前言

之前是看 COMP790 的課程,但是實作起來發現有點問題,而且題目跟實際 source code 說明不太一樣。在花了很多時間釐清之後,發現原課程內容可能來自於 CSE 506: Lecture from Stony Brook University,仔細看了一下 CSE 506 的 Lab 課程,發現題目與 source code 相符程度較高,因此後續會改看 CSE 506 這系列課程。

這次 Lab 花了大概 20 小時來實作,主要原因是有些 source code 的註解是錯誤的,所以單看註解會產生很多疑問,必須實作和觀察才能釐清。這次實驗也讓我體會到,如果覺得哪邊有不太理解的地方,就直接做實驗來驗證,而不要單看註解來去試圖理解它上面的意思,因為如果註解不是正確的,那這些時間也就浪費了。

因為這次實驗要整理的內容蠻多的,擔心文章太長,所以會分成數篇來貼!

Lab 實驗介紹

Lab 2 是實作 physical memory allocator 和 virtual memory allocator,其中最重要的是清楚 physical memory 與 virtual memory 之間的轉換,以及如何運用 Lab 2 的 PageInfo c structure 把兩者 mapping 起來。

CSE 506 Lab1 - The Stack

前言

課程 Operating System Implementation,Lab1 x86 Assembly and Bootloader 是個簡單的實作開場(Lab 源自於 MIT 課程),不過其中卻有蠻多學習的地方。這次來記錄一下 Lab 1 中的 The Stack 實作部分,實作過程中除了需要用 gdb 之外,也需要搭配 asm code。

實作內容

在教學程式中,會呼叫 test_backtrace(5),接著跑 recursion 直到碰到終止條件為止。

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
void i386_init(void)
{
    test_backtrace(5);
}

void test_backtrace(int x)
{
    cprintf("entering test_backtrace %d\n", x);
    if (x > 0)
        test_backtrace(x-1);
    else
        mon_backtrace(0, 0, 0);
    cprintf("leaving test_backtrace %d\n", x);
}

我們的目標,就是實作 mon_backtrace,追蹤進入 test_backtrace function 以及 recursion 的過程。

CSE 506 Lab 環境建置

前言

由於下學期要上計算機結構的課程,所以趁著開課之前來複習一下 OS。這次看的課程是 UNC Operating System Implementation,基本上這課程也是引用 MIT 知名的 JOS 實作,再加上清楚明瞭的 Slides,光是一堂課就能有蠻多地收穫。

這次先來記錄一下實作 Lab1 所遇到的一些問題和環境建立過程。不得不說這課程的環境建置說明沒有很清楚,所以浪費了一些時間在配置正確環境和編譯器。

環境建立

Host: MacPro macOS 10.15.6

Tools

  • VSCode
  • Vagrant
  • VirtualBox
  • Ubuntu 16.04 64 bit
  • GNU binutils:2.19
  • GNU gcc:4.1.2
  • GNU GDB 7.7.1 (要下載 source code 並且修改檔案)
  • MIT版 Qemu https://github.com/geofft/qemu.git -b 6.828-1.7.0

Vagrant Configuration

1
2
3
4
5
config.vm.box = "ubuntu/xenial64"
  config.vm.provider "virtualbox" do |vb|
    vb.customize ["modifyvm", :id, "--nested-hw-virt", "on"]
  end
end

環境配置是在 VM 中跑 Qemu + KVM ,因此在設定 configuration 時,要將 VritualBox 的 nested-hw-virt 開啟。