14 min read
閒聊
之前在辦活動的時候,得知有朋友在 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 的發展也蠻成熟,是時候抽空來學習一下。
Read more →
13 min read
閒聊
上次寫完 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 ,來讓我們可以有更多控制權。
Read more →
10 min read
前言
從 2020 年初就開始籌備的第一屆 GopherCon TW ,終於在 11/14(六) 美好地落幕。第一次籌備就遇上疫情問題,導致時程一再延遲,還有首次主辦 conference 經驗不足,有一些遺漏以及沒有注意到的地方,所以自認籌辦期間沒有做的很好 TT

不得不說本次能籌辦成功,多虧總召 David 大力的主持(五星吹捧),時程安排、籌辦會議、以及細節等都處理的很好,並且非常有組織和號召力,難怪是一個好主管,非常敬佩他,希望自己也能在這部分多加油!
會議規模
預估參加人數:300 人 (比例:男 9 女 1)
議程軌: 1 主軌 / 1 天
租用場地
我們是 6 個月前預訂場地,不過有些更適合(便宜)的場地已被租出去,如果可以在 9 個月前預訂(3季的時間)會更好。
另外,因為是第一屆 GopherCon,且只有一個議程軌,希望能有一個好的開場,因此場地就朝階梯式大型會議廳的方向尋找,而會議當天呈現出來的視覺感受和體驗也確實不錯,缺點是費用真的相對較高,而且能容納的人數有限,往後如果參加的人數更多,還是會找其他非階梯式的會議廳。
攤位規劃
在租用場地時,一定要連同攤位規劃一起討論,例如會議廳外可不可以擺設攤位,攤位的數量等。由於我們這次租用的會議廳外無法擺設太多攤位,因此我們額外租用一間較小的會議廳來設置攤位,但就當天情況來說,所有的攤位都在一間房間內,出入口又不大,所以當人多的時候就顯得很擁擠,這是我覺得後續可以改善的地方。
另外,這次租用的場地,牆壁材質無法供廠商黏貼海報或其他宣傳物品,雖然可以用大頭針固定在牆上,但是會對廠商的宣傳物造成破壞,因此讓他們只好捨棄一些擺設,這也是未來租場地時要注意的地方,如果真的無法粘貼,應在攤位規劃說明書上註明清楚,才不會讓他們白帶一趟。
最後,我們本來以為在走道上的攤位會有最多曝光,沒想到參加者在休息時間都往擺設飲食的區域移動,完全不理會經過的攤位 QQ 讓我重新學到食物的威力有多驚人,也很抱歉沒有讓贊助商有預期的廣宣量。
Read more →
16 min read
前言
之前是看 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 起來。
Read more →
16 min read
預備知識
在閱讀下方內容之前,建議先對 Vault 架構有個基本了解,相關官方文章如下:
- Vault Architecture
- Vault Key Rotation
- Vault Seal/Unseal
另外, Barrier 這個元件在 Vault 相當重要,在 Vault Architecture 頁面中有提及,可以先了解其用意,再來看它是如何被實現。
問題
Vault 在進行 unseal 流程時,其中最重要的就是將加密過的 master key 解密,接著再利用 master key 解出 encryption Key,並且建立起 barrier 防護,讓 storage backend 的資料可以安全地來往於 Vault server 與 storage backend 之間。
Read more →
13 min read
前言
課程 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 的過程。
Read more →
4 min read
前言
由於下學期要上計算機結構的課程,所以趁著開課之前來複習一下 OS。這次看的課程是 UNC Operating System Implementation,基本上這課程也是引用 MIT 知名的 JOS 實作,再加上清楚明瞭的 Slides,光是一堂課就能有蠻多地收穫。
這次先來記錄一下實作 Lab1 所遇到的一些問題和環境建立過程。不得不說這課程的環境建置說明沒有很清楚,所以浪費了一些時間在配置正確環境和編譯器。
環境建立
Host: MacPro macOS 10.15.6
- 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 開啟。
Read more →
5 min read
Q&A 補充
Slides: Goroutine stack and local variable allocation in Go
這次分享中,有人詢問我在 stack growing 的時候, user stack 和 system stack 是如何交替切換的。由於當時沒有仔細看 switch 流程,無法很清楚地答覆他,所以事後又看了一下這段,並且畫出簡圖:

首先,在 curg (current goroutine) func1 呼叫 func2 後,發現 user stack 空間不足,此時先儲存 func1 的 state 到 M 的 morebuf struct 中(用來 bug tracing),接著把 func2 的 state (就是當前 goroutine 的執行狀態,包含 stack pointer, program counter 等)存在 curg 的 sched struct 中,接著 switch 到 g0,從 g0 的 sched 取出 stack pointer 的值 (system stack) 並且設定,接著就可以執行 newstack function。
Read more →
13 min read
在 Docker 的網路規則中,由於 DOCKER-ISOLATION-STAGE-1、DOCKER-ISOLATION-STAGE-2 兩個 iptables chain 的關係,因此不同 Docker network 連結的 container 是無法互相溝通的。不過,我們可以透過建立 router 的手段來規避掉 chain 的限制,讓 container 收到其他 container 來的packages。此方式涉及到 Linux Bridge 處理封包的方式和基本網路知識,希望透過此介紹,來更了解 network stack 與 packages 處理流程。
Docker Container Network
我們知道,Docker 的網路實現是基於 Linux network namespace,Linux network bridge,與 virtual ethernet device 所架構而成的(可參閱 Linux Network Fundamentals)。
Read more →
6 min read
間隔了好一陣子沒有寫自我學習回顧,其實還是有持續在記錄,不過因為剛換新工作的關係,就忙著適應~以及學校那邊的課程也是如火如荼的進展中,就沒更新這種閒聊性質的文章了,不過技術相關的還是有努力撰寫唷 ・ω・
5 月份主要都在念兩大項目:SDN 和 GCP cloud 線上課程。本來是預期在六月的時候去考試的,沒想到 SDN 期末考就先到來了,因此預計 GCP 考試就會延到七月份。另外,七月也要開始準備 COSCUP 分享,這次題目我很喜歡,但是卻也不好準備,希望不要讓底下的聽眾失望,我會好好加油的!
學習回顧
1. 軟體定義網路與網路功能虛擬化
因為同事推薦,於是去選了交大曾建超教授的 SDN/NFV 相關課程,上了幾次課程下來,覺得教授是一個非常認真的人,而且也因為底下學生很上進的關係,在教授的課程中會看到許多跟業界技術結合的應用,還看到 cloud native 夥伴們的論文展示,給我蠻大的衝擊,也希望自己能夠有這樣的機會可以出去國外 demo。雖然工作上並不會直接接觸到這類議題,不過卻也增進了對網路世界的認識,同時也會比較清楚 GCP 的網路模型,整體來說是一個結合理論和實務的課程,很慶幸自己有修習這堂課。(不過就沒有修到編譯器,等到下次開課再來修 QQ)
GCP 相關服務的學習和網路架構也是五月份學習重點,其實蠻喜歡他們的線上實驗課程,除了文字敘述之外,還可以透過實作來真的了解這些服務的運作方式。而在這次學習中,比較重要的是嘗試 google cloud deployment manager,由於之前工作經驗是使用 Terraform 來管理 deployment,這次改試用 GCP 原生 manager,看會不會比較好用。整體設定下來覺得還不錯,不過官方推薦要使用 python 來寫,這樣彈性會是比較好,對於不會 python 的我來說是有一點點困擾,哈,該是好好學 python 了。
Read more →