1 of 96

Linux核心設計/實作」

課程說明 (2024年)

Jim Huang (黃敬群) <jserv.tw@gmail.com>

台灣國立成功大學資訊工程系

2 of 96

警告:kernel有毒

  • 看到kernel一詞,你會想到作業系統的kernel、機器學習的kernel method,還是影像處理的kernel (convolution matrix)呢?不同領域對kernel一詞的解讀不同。

在傳統新年期間重播的《後宮甄嬛傳》中,劇中角色安陵容所食用的杏仁果,實際上是來自於扁桃樹的種仁,其英文名稱為almond,這種杏仁是安全的,不會致命。然而,造成危險的是苦杏仁,英文名稱為apricot kernel,學名為Prunus armeniaca Linne var. ansu Maximowicz,它含有高量的氰化物,這是其毒性的來源。

Source: https://www.facebook.com/groups/system.software2024/posts/1545860499525176/

3 of 96

其實我是單口相聲演員

  • Kernel夜夜秀」即將登場
  • 作為「美式」(為自己的不好笑找藉口) 風格的「code」,將會充斥各式「歧視」 —— 歧視低效率的程式碼、歧視缺乏品味 (good taste, Linus Torvalds原話) 的程式碼、歧視無法發揮硬體最大效益的設計和實作

4 of 96

先看FAQ

  • 可否加簽/旁聽?只要你願意,我一律同意
  • 這門課很操嗎?取決你現在的高度和預期成長的幅度
  • 我程度差,會不會被當掉?50%分數來自期末自評
  • Linux核心設計/實作的差異?授課內容一樣,讓學生可拿更多學分
  • 課綱說「誠實面對自己」是什麼?你可以直接跳到第16頁
  • 只能用Linux開發課堂的程式嗎?世界前幾大的軟體公司都在用,你認命吧
  • 為何第一週的作業相當難?避免期末忙於多門考試和專題,第一週就開始做專題

5 of 96

注意事項

  • 你來這裡最主要的目的是為了翻身,當然該有對應的付出
  • 學員所有的作業和報告都公諸於世,接受社會各界的指教,見證學員的成長
  • 本課程上滿18週,當週若遇到國定假期不停課(斟酌調整授課時段),額外加課2次到72日才停課(繳交成績的前一日)
  • Linux核心實作」實際授課時間為每週四19:30-22:30,前半段是線上測驗,後半段則是檢討和講解。第一週例外,安排在22320:00
  • 參與「Linux核心設計」的學員也該參加自229日起每週四晚間的線上測驗,直到627日晚間
  • 研究生需要在二、三、四,五、六月底發送當月學習回顧信件,給實驗室指導教授(而非本課程授課教師),談及自身學習狀況及對研究主題的可能助益。當月若對Linux核心提交貢獻,則免發信給指導教授(但仍該通知授課教師)
    • 原因:本課程將佔用研究生大量時間,授課教師有責任揭露學習狀況給實驗室

6 of 96

Linux系統軟體開發經驗談

  • 學習系統軟體就像打疫苗,一開始你會覺得不舒服,但之後就會鞏固自己面對各式新技術衝擊的免疫力。

中央流行疫情指揮中心公告,第二劑和第三劑COVID-19疫苗間需間隔12週。Linux核心大約每10到12週就會發布新的主要版本,換言之,Linux改版比你打疫苗還快。

7 of 96

我是誰?

  • 我會逛批踢踢實業坊(Ptt BBS),也看「靠北」系列粉絲專頁
  • 或許我們初次見面,但你的手機裡頭執行我開發的軟體,背後涉及的精密機械和控制系統也有我經手的痕跡

8 of 96

「爸爸,我要休學」

  • 書中有句話說:

「真正的教育是能給學生足夠的支撐力量,足夠的表現機會,足夠的信心和歡樂」

  • 2002年自國立成功大學休學
  • 2012年回國立成功大學教書
  • 2022年在國立成功大學寫書
  • 曾任聯發科技、工研院、台達電、資策會、鴻海科技集團,以及國家太空中心等單位的技術顧問
  • 關注系統軟體和開放原始碼生態

9 of 96

我不知如何教書,跟著學生一同開發軟硬體

10 of 96

第一位學生曾讓我很挫折,但他現在是我的精神支柱

11 of 96

納稅人為什麼要把辛苦錢交給大學?不就是對年輕人有期許,栽培他們,使他們有能力、有勇氣去面對產業乃至於整個大環境的變革嗎?

12 of 96

課程著重議題

  • 閱讀文件 各式開發手冊、書籍,和論文
  • 親自建構Linux核心和修改程式碼
  • 參與討論、向開發者提問,並嘗試貢獻
  • 第一手材料:Linux核心原始程式碼
  • 大量練習

  • 策略:與其探討Linux個別子系統,本課程更在意能否引導學員強化必要的基礎認知,如C語言程式設計、閱讀規格書(耐心習慣)、並行程式設計、Linux核心主體設計概念、檔案系統和介面,並且藉由工具來理解複雜的系統(而非臆測)。考慮到台灣的就業環境,也會探討裝置驅動程式,像是無線網路(cfg80211)、多媒體(V4L2),及虛擬化(主要是KVM)

13 of 96

我們關注什麼?

透過Linux重新認識這世界

782487 commits, 19009 authors, 61725 files, 25584633 lines

著重於21世紀對於大規模應用、大量資料分析,以及各式高效能系統的設計,並從小處著手

本學期嘗試回顧電腦科學軟體、硬體,及數學等基礎知識,帶領學生以專業解決真實世界的各項難題。

我一直相信:教育的使命之一,是讓畢業生真正被這社會需要,從而創造新的需求

14 of 96

透過Linux重新認識這世界

Dominic Walliman製作的〈Map of Computer Science〉短片(具備繁體中文字幕),簡潔且深刻地探討電腦科學的多個面向,諸如電腦網路、圖形處理、抽象機器及理論(如Turing machine)、NP-Complete問題、計算機架構、排序演算法、資料壓縮、現代密碼學、形式化方法、作業系統排程、異質多核運算、編譯器,和程式語言等等。

上述議題幾乎涵蓋在今日的Linux核心中,換言之,Linux核心已不只是個「核心」,應看待為資訊科技的「基礎建設」,因此,電腦科學的子學科幾乎都可反映在Linux核心中。

15 of 96

16 of 96

誠實面對自己

  • 唯有用「知識武裝自己」,才有機會發大財 (?)

17 of 96

軟體缺失肇因於對電腦系統認知的不足

  • 民航客機內部的軟體系統
    • 1970年代推出的首款廣體民航客機波音747軟體約40萬行程式碼
    • 2011年引進的波音787的軟體規模約650萬行程式碼(上述的16倍)
  • 你我的性命緊繫於一系列極為複雜的軟體系統之中,能不花點時間了解嗎?

延伸閱讀: 軟體缺失導致的危害

https://hackmd.io/@sysprog/software-failure

18 of 96

光是Linked List就充斥著大量你未曾思考過的議題

過去concurrency(並行)parallelism(平行)議題貌似遙遠,但已是常態

在軟硬體技術高速發展的今日,哪裡有異質多核的環境呢?有,就在你我每天使用的智慧型手機中

我們將思考concurrent資料結構操作,這是許多雲端運算背後的原理

Scalability: 當服務規模(設備數量、自動化操作次數)的負載增長時,系統能被擴展來滿足需求(彈性擴展服務能力),且不降低服務品質

19 of 96

你沒注意到的浮點數

考慮以下程式碼:

#include <stdio.h>

int main() {

float sum = 0.0f;

for (int i = 0; i < 10000; i++) sum += i + 1;

printf("Sum: %f\n", sum);

return 0;

}

你覺得會輸出什麼?

1 + 2 + 3 + … + 10000 = 10000 * (10000 + 1) / 2 = 50005000

20 of 96

William Kahan教授和IEEE 754

改善精確:

#include <stdio.h>

int main() {

float sum = 0.0f, corr = 0.0f; /* corrective value for rounding error */

for (int i = 0; i < 10000; i++) {

float y = (i + 1) - corr; /* add the correction to specific item */

float t = sum + y; /* bits might be lost */

corr = (t - sum) - y; /* recover lost bits */

sum = t;

}

printf("Sum: %f\n", sum);

return 0;

}

NaN (Not a Number)

21 of 96

IEEE 754可能比你想得更難

考慮以下程式碼:

#include <assert.h>

int main() {

assert(0. == -0.);

assert(1./0. == 1./-0.);

}

你認為執行結果為何?

相當於

  • 比較0.和-0.是否相等
  • 比較1./0.和1.0/-0.是否相等

22 of 96

IEEE 754

以下程式碼:

#include <assert.h>

int main() {

assert(0. == -0.);

assert(1./0. == 1./-0.);

}

執行結果:

  • 0.和-0.相等
  • 1./0.和1.0/-0.不相等

數學和規格書是讓我們從愚昧中獲得救贖的良方

第二個比較並非undefined behavior,在C 語言規格書Annex F有相關解說。

線上實驗: https://godbolt.org/z/4Pavfn

23 of 96

不用急著搜尋關鍵字,你可能沒學會C語言

考慮以下程式碼:

#include <stdio.h>

int main() { return (*******puts)("Hello"); }

能否編譯並執行呢?若可,為什麼呢?

為了解釋前述程式,我們需要重新學習C99規格!

第一手資料學習:大文豪寫作都不免要查字典,庸俗的軟體開發者如我們,難道不需要翻閱語言規格書嗎?難道不需要搞懂術語定義規範嗎?

24 of 96

誠實面對自己,從現代C語言開始學

  • ISO/IEC 9899 (簡稱"C99")
  • 在規格書搜尋"object",共出現735
  • 搜尋"pointer",共出現637

但許多人往往不談object,而急著談論pointer,殊不知,這兩者其實是一體兩面。

依據C99 [6.2.5] Types

“Array, function, and pointer types are collectively called derived declarator types. “

什麼?!array, function, pointer這三者竟有關連?

25 of 96

安全高效率且可延展

  • 取自FFmpeg的程式碼,你看出哪裡有問題嗎?

if ((codec->capabilities & CODEC_CAP_LOSSLESS) &&

av_get_sample_fmt_name(st->codec->sample_fmt) >

av_get_sample_fmt_name(codec->sample_fmts[0]))

av_log(NULL, AV_LOG_ERROR, "Convertion will not be lossless'\n");

  • 其中av_get_sample_fmt_name回傳型態為char *
  • 依據1999年的C語言標準(ISO/IEC 9899:2011, 簡稱C99)6.5節:

"When two pointers are subtracted, both shall point to elements of the same array object, or one past the last element of the array object.”

  • C語言的指標運算操作允許減法,但只在指標都指向同一個元素物件(在C語言中,只要有明確生命週期和記憶體空間的佔用,就稱為「物件」)才有效,倘若對兩個指向不同物件的指標進行減法,那會是未指定(unspecified)的行為,即程式行為取決於編譯器和執行環境的實作。本例可見>這個比較操作,本質上是減法,因此上述程式碼的風險在於未指定的行為。

26 of 96

C語言可不是只有語法

  • 思考下方程式碼的作用,以及如何應用

#include <stdint.h>� uint32_t func(uint32_t x) {� uint32_t n = x;� n = ((n & 0xffff0000) >> 16) | ((n & 0x0000ffff) << 16);� n = ((n & 0xff00ff00) >> 8) | ((n & 0x00ff00ff) << 8);� n = ((n & 0xf0f0f0f0) >> 4) | ((n & 0x0f0f0f0f) << 4);� n = ((n & 0xcccccccc) >> 2) | ((n & 0x33333333) << 2);� n = ((n & 0xaaaaaaaa) >> 1) | ((n & 0x55555555) << 1);� return n;� }

  • Linux核心就用得到

/*� * Helpers for hash table generation of ethernet nics:� *� * Ethernet sends the least significant bit of a byte first, thus crc32_le� * is used. The output of crc32_le is bit reversed [most significant bit� * is in bit nr 0], thus it must be reversed before use. Except for� * nics that bit swap the result internally...� */� #define ether_crc(length, data) bitrev32(crc32_le(~0, data, length))� #define ether_crc_le(length, data) crc32_le(~0, data, length)

27 of 96

逐字翻譯為C語言不等於Programming!

  • 不用分支可計算出整數絕對值

#include <stdint.h>

int32_t abs(int32_t x) {

int32_t mask = (x >> 31);

return (x + mask) ^ mask;

}

  • 為什麼呢? abs(-2147483648)會得到什麼?

延伸閱讀: 解讀計算機編碼

https://hackmd.io/@sysprog/binary-representation

延伸閱讀: 軟體缺失導致的危害

https://hackmd.io/@sysprog/software-failure

28 of 96

C/C++語言安全和技巧

  • Microsoft Research的mimalloc專案

29 of 96

千萬不要說學校只教理論(1)

  • 如何讓電腦自男女聲音中抽離特定聲紋?
  • 你知道傅立葉轉換可用在哪裡?
  • 這些所謂的「應用」,你何時能「施力」呢?

延伸閱讀: 圖解傅立葉分析

https://hackmd.io/@sysprog/fourier-transform

30 of 96

千萬不要說學校只教理論(2)

  • 未妥善撰寫的Regular expression如何讓雲端伺服器無法運作?

(?:(?:\"|'|\]|\}|\\|\d|(?:nan|infinity|true|false|null|undefined|symbol|math)|\`|\-|\+)+[)]*;?((?:\s|-|~|!|{}|\|\||\+)*.*(?:.*=.*)))

31 of 96

誠實面對自己!

理論和實作本來就是一體兩面

不要再說「學校只教理論」這種鬼話,你可能連是否理解理論都說不清楚

在充滿各式偏見的台灣,打好基本功是為自己殺出血路的唯一途徑

https://twitter.com/StoryInPicture/status/680983964094300160

32 of 96

背景知識對於理解Linux核心的必要

  • 資料結構: circular linked list, red-black tree, abstract data type
  • 計算機組織與結構: bitwise operation, binary representation, floating-point, cache, memory, ISA, SMP, atomics, bus, DMA, pipeline, out-of-order execution
  • 演算法: recursive programming, sorting, time/space complexity analysis, worst-case execution time (WCET), concurrent algorithms
  • C語言: C99/C11規格書, 指標, 物件導向程式設計, 效能分析, 除錯與追蹤, design patterns, unit test
  • 機率統計: 足以模擬微小尺度程式運作的各種原理
  • 額外: 資訊安全、密碼學、電腦網路、繪圖處理、異質多核運算,程式品質

33 of 96

21世紀的軟體開發均已規模化,絕非「有就好」,而是持續演化和重構,code review是免不了的訓練。Charles-Axel Dein認為好的程式碼應該要:

  • [ Correct ] : 做到預期的行為了嗎?能夠處理各式邊際狀況嗎?即便其他人修改程式碼後,主體的行為仍符合預期嗎?
  • [ Secure ] : 面對各式輸入條件或攻擊,程式仍可正確運作嗎?
  • [ Readable ] : 程式碼易於理解和維護嗎?
  • [ Elegant ] : 程式碼夠「美」嗎?可以簡潔又清晰地解決問題嗎?
  • [ Altruist ] : 除了滿足現有的狀況,軟體在日後能夠重用嗎?

「需求」層次: 正確 → 安全 → 可讀 → 優雅 → 利他

34 of 96

動腦時間: 空間效率

35 of 96

LeetCode風格題目

Given two numbers say a and b, mark the multiples of 2 and 5 between a and b using less than O(|b – a|) space and output each of the multiples. We have to mark the multiples i.e save (key, value) pairs in memory such that each key either have value as 1 or 0 representing as multiple of 2 or 5 or not respectively.

Examples :

Input : 2 10

Output : 2 4 5 6 8 10

Input: 60 95

Output: 60 62 64 65 66 68 70 72 74 75 76 78

80 82 84 85 86 88 90 92 94 95

36 of 96

解題策略

Approach 1 (simple):

Hash the indices in an array from a to b and mark each of the indices as 1 or 0.

Space complexity : O(max(a, b))

Approach 2 (better than simple):

Save memory, by translating a to 0th index and b to (b-a)th index.

Space complexity : O(|b-a|).

37 of 96

解題策略

Save memory, by translating a to 0th index and b to (b-a)th index.

#include <stdio.h>

#include <stdlib.h>

int main() {

int a = 2, b = 10;

int size = abs(b - a) + 1;

int array[size];

/* Iterate through a to b, If it’s a multiple of 2 or 5, mark index in array as 1 */

for (int i = a; i <= b; i++)

if (i % 2 == 0 || i % 5 == 0)

array[i - a] = 1;

for (int i = a; i <= b; i++)

if (array[i - a] == 1)

printf("%d ", i);

printf("\n");

return 0;

}

38 of 96

持續改進

Size of int in LP64 is 4 bytes. ⇒ an integer in memory is represented by 32 bit positions.

these 32 bit positions can be used instead of just one index to hash binary values.

  • Find the actual index in int[] that needs to be bit manipulated it will be bitwise index / 32.
  • Find the index of bit in those 32 bits that needs to be turned on it will be bitwise index % 32. Let’s Call it X.
  • Turn on the bit by doing | (bitwise OR) with (1 << X) (here we turn on the Xth bit by bit manipulation)
  • To get the value of a bit at a bitwise index we calculate the same indices and do a bitwise & so that if Xth bit is on it will return an integer not equal to 0 which is true in C and C++.
  • Now instead of using arithmetic operators we can use bitwise operations for efficiency.

39 of 96

運用bitwise降低空間開銷的策略

#include <bits/stdc++.h>

using namespace std;

// index >> 5 corresponds to dividing index by 32

// index & 31 corresponds to modulo operation of index by 32

// Function to check value of bit position whether it’s 0 or 1.

bool checkbit(int array[], int index) {

return array[index >> 5] & (1 << (index & 31));

}

// Sets value of bit for corresponding index

void setbit(int array[], int index) {

array[index >> 5] |= (1 << (index & 31));

}

int main() {

int a = 2, b = 10, size = abs(b - a) + 1;

// Size that will be used is actual_size/32

// ceil is used to initialize the array with

// positive number

size = ceil((double) size/32);

// Array is dynamically initialized as

// we are calculating size at run time

int *array = new int[size];

// Iterate through every index from a to b and

// call setbit() if it is a multiple of 2 or 5

for (int i = a; i <= b; i++)

if (i % 2 == 0 || i % 5 == 0)

setbit(array, i - a);

for (int i = a; i <= b; i++)

if (checkbit(array, i - a))

cout << i << " ";

return 0;

}

40 of 96

編譯器最佳化和其陷阱

41 of 96

編譯器最佳化的陷阱:

學習程式語言,若停留在語法,卻沒有深入編譯器和相對應的執行環境,往往事倍功半

42 of 96

編譯器最佳化起於IR

  • LLVM IR(Intermediate Representation)
  • let (x, y) = (10, 20)可略過,直接呼叫let z = add(10, 20),因此編譯器產生%z = call i32 @add(i32 10, i32 20)
  • 對照產生的x86-64機械碼,1020保存於EDIESI暫存器,addprint函式則在0x52000x51a0地址

43 of 96

常見編譯器最佳化策略(1)

  • Constant Folding

  • Constant Propagation

  • Multiplication and Division Optimization

無論x的值如何變化,f(x)的值必為222x + 282

44 of 96

常見編譯器最佳化策略(2)

  • Function Inlining

因add函式指令很少,因此編譯器會直接將其展開為加法運算,於是sub函式的內容就變成x+(-y),簡化後就是x—y

  • Strength reduction

降低迴圈中的運算強度,例如乘法改為加法、除法改為乘法,從而累積效益

45 of 96

常見編譯器最佳化策略(3)

  • Canonicalize Induction Variables

若不滿足x*x<10000就跳離迴圈,而x*x<10000等同x<100

  • Loop Unrolling

降低CPU在branch prediction出錯的次數

46 of 96

常見編譯器最佳化策略(4)

  • Sum-Product Optimization

為減少這類有規律的大量運算,編譯器自動進行公式推導,像sum_to_x經編譯後會轉變為return x*(x-1)/2 + x,簡化後就會變成梯形面積公式x*(x+1)/2

  • 儘管編譯器推導出的sum_to_x(x)=x*(x-1/2+x尚有進步空間,但相比原本的迴圈,x(x+1)/2 + x 只需要2個加法、1個右移跟1個乘法,且不用顧慮x的值
  • square_sum_to_x做1²+2²+3²+…+x²,只用到加法、乘法跟右移,且跟sum_to_x一樣,不隨x增長而提高運算量

47 of 96

  • C語言如a = b;這樣敘述,依據語言標準,編譯器可認定涉及的變數在loadstore的同一時刻,沒有其他執行緒在存取它們,因此允許多種最佳化,而目前越來越強大的現代編譯器所做的程式碼最佳化已超出許多人預料。
  • 經過某些最佳化手法後,開發者不能再期望。雖針對Linux核心,但其實很多場景也適用於其他的並行(concurrent)程式設計議題,也包括使用中斷和signal相關程式碼
  • 隨著編譯器越來越強大,就讓我們不禁開始擔心:「這些來自編譯器的最佳化有多危險?」
  • 理解編譯器最佳化有時是為了逃出困

48 of 96

這世界不會等你

iPhone X在單核效能評比已超越內建Intel Core-i5的MacBook Pro (2017)

iPhone 7單核效能和內建Intel Core-i7的MacBook Pro只差8%

可是你連處理器都不懂呀!究竟要拿什麼東西來戰文組呢?

承認吧,你只是當年數學考試分數較高,對電腦的認知仍非常有限

https://thenextweb.com/apple/2017/09/12/apples-new-iphone-x-already-destroying-android-devices-g/

49 of 96

這世界不會等你

採用7奈米製程的A12 Bionic處理器,Apple(和它的代工廠台積電)塞進了將近70億個電晶體,讓A12成為整個手機晶片最強大的處理器

A12 Bionic處理器驅動著最新一代 iPhone XS 和 XR,是Apple秋季新品發佈會的主角之一

CPU(6核)、GPU(4核)和一個神經網絡協處理器Neural Engine(8核),效能比前代A11高了一半左右

Neural engine是款 FPGA (Field-Programmable Gate Array),針對機器學習去訂製

… (當你讀報導時,有沒有發現自己有如「文組」,即便到資訊工程系所進修呢?) ...

50 of 96

這世界不會等你

採用第二代7奈米製程的A13 Bionic處理器,Apple塞進85億個電晶體(比A11多出約23%),讓A13成為手機晶片界最強的處理器。A13延續2組高效能核(core) + 4組省電核的64位元Fusion架構設計。2組高效能核可比以往更快地處理複雜任務,預計功耗降低30%;4顆省電核負責處理日常任務,功耗降低40%。

2019年8月,Apple及Qualcomm大和解的同期,Apple以10億美元收購Intel的modem業務的「大多數」

51 of 96

凡事我不能創造的東西,我就不理解

美國理論物理學家費曼(Richard Feynman)在辦公室黑板書寫以下話語:

  • What I cannot create, I do not understand. (我所不能創造的東西,我就不瞭解)
  • Know how to solve every problem that has been solved. (知道如何解出每個已被解過的問題)

費曼的確認真地實踐上述理念,《費曼物理學講義》這三大卷書便是最清楚的證據。

物理學雖可分為粒子物理、凝態物理、流體力學、原子物理、天文物理等領域,但這些在費曼心中,其實是融合為一,這些學科合起來才可完整呈現大自然,任何只偏愛其中一門的人,就無法欣賞大自然美妙的全貌,換言之,費曼是「知道如何解出每個已被解過的問題」。在書中可見費曼對於每個問題都有獨到的說法,唯有如此,他才會覺得是他所「創造的東西」,也才會認定自己瞭解那些概念。

52 of 96

30年始終默默支持你我生活的Arm

Arm公司授權給全球各式廠商的ARM處理器出貨量達到860億。

以年份對應的出貨量來說,1997年約為900萬,而2014年則是120億,隔年則持續成長到150億。

https://yourstory.com/2016/07/arm-holdings-story/

53 of 96

還有無所不在的Linux,屆滿32歲

1991年8月25日,時年21歲的赫爾辛基大學學生Linus Torvalds在新聞組貼出訊息,表示自己正在開發一款免費的作業系統,同年9月17日發布Linux核心的0.01版Linux。

Linux源自80386個人電腦,扣除桌面系統以外的領域,幾乎都獲得巨大成功,舉凡手機、伺服器、超級電腦、防火牆、路由器、火星探測器、娛樂影音設備,甚至ARRC也採用Linux作為火箭控制系統的基礎。

Linux核心程式碼超過3千7百萬行,每日新增5000行,每小時收錄8個程式修補,10到12周即推出新版Linux核心。全球有來自1300多家公司、超過13500名開發人員貢獻Linux核心的開發。

https://www.facebook.com/itsfoss/photos/a.182637675210341.43761.115098615297581/

758109827663120/

54 of 96

我們該做什麼?

蔡志浩博士:

  • 不要花太多時間追逐看起來很實用的專業。世界變化太快,這類專業多半存活幾年就會被取代。你還是要能從本質上了解現象與知識的關聯,才不會被每天冒出來的新詞迷惑。良好的基礎科學訓練仍然是把實務專業做好的基礎。
  • 啞鈴讓你變得更強,但它們本身不能幫你解決任何問題。教育就像健身,目的從來不是學什麼,而是訓練出能夠面對未來挑戰的強大自主學習能力。學用落差是假議題。

55 of 96

回顧資訊科技產業

  • 曾經全球接近一半的IC設計公司設立於台灣,供應從類比到數位整合的多樣解決方案,再者,台灣人設計的資訊系統也在工業控制等高品質要求的領域使用
    • 沒必要成為國外廠商的抬轎
  • 35年前,個人電腦上很大比例的軟體由台灣人開發,舉凡中文系統、文書編輯器、排版系統、繪圖程式、資料庫管理系統等等
  • 25年前,採用GAIS技術的搜尋引擎就是世界上幾個影響重大的先驅;台灣人對於Linux與BSD的貢獻遙遙領先亞洲諸國
  • 可惜這十餘年間,台灣的狀況完全改觀
    • 在系統軟體發展的短視、與開放原始碼世界脫節
    • 但利基市場仍充滿機會,例如ARRC開創的高度系統整合立方衛星
    • 太空經濟是台灣人在工業方面尚未開啟的想像空間。一旦打開 必然是海闊天空的全新境界,而整合我們所知的所有工程領域, 絕對是「打群架」的好題目

Source:

https://twitter.com/iingwen/status/900711672733507585

56 of 96

策略:擁抱開放原始碼技術和積極展現實力

  • OpenStack Foundation董事程輝:「每天泡在開源發展,每天都跟大牛合作,不牛逼也難」
  • 貿然投入Linux核心一類大型專案開發很難,於是改用漸進式開發模式
    • 全程使用開源技術作為教學工具,培養學生相關素養
    • 課程設計的作業和Linux核心原始程式碼高度相關,學員日後可提交程式碼貢獻
    • 透過在Linux Foundation的眾多研討會發表的方式,獲取認同和知名度

實際產出

  • 參與過本課程的畢業生到Google, Amazon, Meta和Microsoft等外商擔任工程師
  • 從2015年開始,超過15位學生到國際Linux研討會發表研究成果
  • 2021-2023年間11位學員貢獻的程式碼獲得Linux核心採納
  • SSE2NEON專案獲得Apple, Amazon, Apache Software Foundation, Intel, NVIDIA採用

57 of 96

超級電腦在許多領域改變世界

用於需要大量運算的工作,例如天氣預報、地球模擬、運算化學、分子模型、天體物理、密碼分析、機械模擬、基因定序、高頻交易等等。

58 of 96

富岳(Fugaku)超級電腦

  • 富士通與日本理化學研究所共同開發,作為「京」(2011TOP500榜首)的後繼,於2014年開始研發,「富岳」是富士山的別稱
  • 全球首度奪冠的Arm架構超級電腦,採用富士通48+4A64FX整合處理器晶片,不同於過往超級電腦採用的x86架構。富岳共有7,630,848個節點,尖峰效能可達442 Pflop/s (Peta=1015; Tera=1012)
    • SONY PlayStation 5可達10.3 Tflop/s; 台灣衫二號超級電腦達9 Pflop/sTOP500排名第28名(202011月)
  • 2020623日,富岳以415 Pflops計算能力成為TOP500榜首,同年1117日和2021628日蟬聯榜首,浮點數運算能力是第二名的3延伸閱讀
  • 由於A64FX以Arm指令集(v8.2A)為基礎,執行在富岳的軟體就需要針對Arm和Linux進行最佳化,但顯然不是每套軟體都做好準備

59 of 96

超級電腦裡頭出現我寫的程式,嚇死寶寶!

  • Spack是針對超級電腦需求而開發的套件管理系統
  • SSE2NEONSpack收錄並活躍更新
  • 但我起初不懂誰要用

60 of 96

直到我看到軟體清單

  • bwa: Burrow-Wheeler Aligner for pairwise alignment between DNA sequences
  • ngmlr: a long-read mapper designed to align PacBio or Oxford Nanopore to a reference genome with a focus on reads that span structural variations.
  • wtdbg2: a fuzzy Bruijn graph approach to long noisy reads assembly
  • smartdenovo: a de novo assembler for PacBio and Oxford Nanopore (ONT) data.
  • fermikit: De novo assembly based variant calling pipeline for Illumina short reads
  • sortmerna: a program tool for filtering, mapping and OTU-picking NGS reads in metatranscriptomic and metagenomic data"
  • fermi: a WGS de novo assembler based on the FMD-index for large genomes.
  • enzo: adaptive mesh-refinement simulation code
  • racon: Ultrafast consensus module for raw de novo genome assembly of long uncorrected reads
  • openmx: software package for nano-scale material simulations based on density functional theories (DFT), norm-conserving pseudopotentials, and pseudo-atomic localized basis functions.

雖然連簡介都看不懂,但裡頭的詞彙太嚇人:

  • Oxford nanopore: 第三代基因定序/奈米孔定序技術
  • Pacific Biosciences(簡稱PacBio): 單一分子即時定序
  • Long noisy reads assembly: 拼接基因組的手段

詞彙提示

  • 基因組de novo測序,通過reads拼接獲得Contigs後,往往還需要構建454 Paired-end庫或Illumina Mate-pair庫,以獲得一定大小片段(如 3Kb, 8Kb, 10Kb, 20Kb)兩端的序列
  • 二代測序技術: next generation sequencing (NGS),又稱為高通量測序技術

61 of 96

這些軟體原已針對x86最佳化,為何還要支援Arm架構呢?

  • Arm的網站刊載Genomics: Optimizing the BWA aligner for Arm Servers一文,針對AWS自行研發的第二代Arm架構的Graviton 2處理器進行生物資訊運算,得到的結論:
    • time saving of 14%-27% over the fastest x86_64 instance timings.
    • Saved 50% of the cost
  • 基因定序和相關的生物資訊運算成本居高不下,於是成本效益高的Arm架構就是關鍵考量

62 of 96

Source: https://community.arm.com/developer/tools-software/hpc/b/hpc-blog/posts/optimizing-genomics-and-the-bwa-aligner-for-arm-servers

63 of 96

無心插柳:SSE2NEON已用於超級電腦

  • 生物資訊運算高度依賴處理器,許多演算法開發時即考慮到高平行度,Arm伺服器的優勢在於功耗相當的狀況下,能夠用更多處理器核(core)數進行運算
  • 不只富岳,TOP500也有其他超級電腦採用Arm架構
  • 2000年代初期x86x86-64取得優勢之前,TOP500超級電腦大多由各種RISC處理器系列構成,包括SPARC, MIPS, PA-RISC, Alpha等架構,Arm的加入引來新的衝擊

64 of 96

胡適:「發表是最好的記憶」(1)

(下方為參與過系列課程學生部分列表,其中多數在大學畢業前就躍上國際舞臺)

  • 2015年
    • 廖建富: 在Linux Foundation舉辦的Embedded Linux Conference發表uClinux最佳化成果
    • 林展翔: 在Real-Time Linux Workshops發表Xenomai 3在Arm處理器的效能分析
  • 2016年
    • 張家榮: 在Linux Foundation舉辦的OpenIoT Summit發表uVisor開發成果
    • 高魁良: 在Linux Foundation舉辦的LinuxCon Japan發表Linux container成果
  • 2017年
    • 呂紹榕: 在世界最大的開放原始碼研討會FOSDEM發表嶄新的IoT作業系統
    • 楊宗凡: 在Linux Foundation舉辦的Embedded Linux Conference發表即時Linux效能工具與改善方案
    • 許耕福: 在Linux Foundation舉辦的Open Source Summit發表高度可擴展動態記憶體管理機制
    • 黃宇強: 在Linux Foundation舉辦的Open Source Summit發表以ARMv8為基礎的雲端基礎建設
  • 2018年
    • 王紹華: 在Linux Foundation舉辦的Open Source Summit發表自動駕駛車技術

65 of 96

胡適:「發表是最好的記憶」(2)

(下方為參與過系列課程學生部分列表,其中多數在大學畢業前就躍上國際舞臺)

  • 2021年
    • 鄭育丞: Open Source Summit - 講題: Reduce System Call Overhead for Event-Driven Servers
  • 2022年
    • 鄭育丞: FOSSASIA - 講題: The Evolution of Linux I/O Models: A Path towards IO_uring
    • 向景亘: FOSSASIA - 講題: Empower Embedded Computing with VexRiscv and FreeRTOS
    • 馮會鈞: FOSSASIA - 講題: Brief History of Linux CPU Scheduler
    • 向景亘: Open Source Summit - 講題: Towards PREEMPT_RT for the Full Task Isolation
    • 林志恩: Open Source Summit - 講題: Lower Response Time of Fork by Extending Copy-on-write to the Page Table
    • 洪邵澤: Open Source Summit - 講題: Revisit Multi-Reader Synchronizations for Scalable Applications
    • 吳恩緯: Google Summer of Code for FreeBSD Foundation - 主題: Wi-Fi Simulator: wtap
  • 2023年
  • 吳恩緯: Open Source Summit - 講題: Lightweight and Fast WiFi Access in Virtual Machines
  • 陳彥甫: Open Source Summit - 講題: RISC-V Based Sandboxing for Secure and Efficient Software Execution
  • 2024年
  • 鄭聖文: Open Source Summit - 講題: Crafting a Vision-Aided Software Stack for UAV
  • 邱冠維: Open Source Summit - 講題: Refining Data Structure Implementations in the Linux Kernel for Improved Performance

66 of 96

雖然課名是Linux,但可解讀為電腦科學「總複習」

回顧(或說「重新學習」)電腦科學背景知識

  • C語言:你未曾學會過的種種
  • 資料結構和演算法
  • 機率統計
  • 編譯器原理
  • 作業系統概念
  • 處理器設計

只有耐心圓滿完成簡單工作的人,才得以習得輕易完成困難工作的技巧。

Only those who have the patience to do simple things perfectly ever acquire the skill to do difficult things easily.

18世紀德語劇作家兼詩人 Friedrich Schiller

Source: https://twitter.com/WarrenWhitlock/status/876025077178957824

67 of 96

課程終極目標

  • 引導學員打好基礎,從而理解Linux核心關鍵元件如何運作
    • 很多人會自稱「看不懂Linux核心原始程式碼」,但其中卻鮮少有人承認「自己根本不懂C語言」
    • 計算作業系統核心的context switch和spinlock成本需要機率統計的背景知識
  • 程式碼是給你改進和擴充,不是給你背誦或鑑賞的
    • 不再「舉燭」
    • 春秋戰國時代,有位楚都的郢人想寄封信給燕國宰相,因為天色已晚,光線昏暗,便令身旁書僮說:「舉高燭光。」可是,他卻無意里將這句「舉燭」給寫到信中,而不自知,信就如此寄到燕國去。接到信的燕國宰相,見到文中「舉燭」二字,百思不得其解。後來靈光一閃,若有所悟地說:「太妙了,這正是治理國家的奧妙啊!」「所謂『舉燭』,就是尊崇光明;尊崇光明,便是禮敬賢者,這大概就是郢人暗指的意義吧!」隔天,宰相晉見燕王一並陳述郢人的暗喻。燕王也欣然贊同這種見解,便積極去招致天下賢才智者,以輔佐朝政,燕國也就漸漸步上正軌。(比喻為穿鑿附會的言論)

68 of 96

我連Linux上的應用程式都沒寫過,可學習嗎?

嚴格來說,Linux只是作業系統的核心,其上可運作多種程式,搭配不同的程式開發框架更讓應用程式變得目不暇給。反過來說,作為依循POSIX這項IEEE規範的作業系統核心,Linux提供(絕大多數)有明確規範的系統呼叫,儘管變革快速,但始終堅持這項原則。Linus Torvalds在2001年10月說過:

From a technical standpoint,I believe the kernel will be"more of the same" and that all the _really_interesting stuff will be going out in user space.”

「Linux核心設計」課程的定位是帶著學員探索Linux核心的奧秘,其中不免會接觸到經典的系統呼叫,例如fork和mmap。為免去「舉燭」,我們安排大量的實作和分析訓練,引導學員從使用者層級(user mode)到核心層級均有一定掌握度。抱持「做中學」的態度進行即可。

69 of 96

現代微處理器和Linux核心的機制

A task must run 30% of its time on a big CPU when boosted 15%

70 of 96

Linux核心原始程式碼充斥各式數學(1)

  • 針對Qualcomm Atheros的無線網路晶片的裝置驅動程式,可見快速傅立葉轉換
    • 傅立葉轉換可上溯到十九世紀,其原理是任何訊號(如聲音錄製) 可用一組頻率和振幅不同的正弦波(sine wave)及餘弦波(cosine wave)之和來表示,應用廣泛,例如壓縮一段錄音或抑制噪音。
    • 1960 年代中期,針對電腦運算而提出快速傅立葉轉換(fast Fourier transform; FFT)。
  • 由於時域陡峭的變化,在頻域反映的就是極大的頻寬。這在無線通訊的情況不被允許,通道頻寬往往受到法規限制。因此在數據層級看到非1即0、非高即低的電壓波形,通常只能在「有線」的條件下允許傳送(即頻譜被限制在封閉的介質中,不會影響到其他訊號),而在無線的傳輸環境裡,這些非0即1的電壓波形,反而需要刻意先被低通濾波處理掉:先將高頻成分去除、把頻寬限制住,才能進一步傳送。將類比訊號視作時間函數,頻寬就是在頻域內訊號的傅立葉轉換功率在一個特定門限之上、與最大值差在某個的範圍之內的頻率範圍

71 of 96

Linux核心原始程式碼充斥各式數學(2)

  • 將類比訊號視作時間函數,頻寬就是在頻域內訊號的傅立葉轉換功率在一個特定門限之上、與最大值差在某個的範圍之內的頻率範圍
  • 要求無線網路裝置驅動程式掃描頻譜:

echo chanscan > /sys/kernel/debug/ieee80211/phy0/ath9k/spectral_scan_ctl

72 of 96

Linux核心原始程式碼充斥各式數學(3)

  • Linux spinlock的具體效能表現和帶來的衝擊,必然要建立一個模型,本模型結合排隊理論,描述和預測Linux spinlock行為

73 of 96

特別聲明(1)

我的教學技能只有兩個,請不要期待太高:

  • 講古 ☞從歷史觀點,解釋技術背後的發展脈絡和原理
  • 罵學生 ☞加速學生「誠實面對自己」的過程

基礎知識你本該知道,我當然不會教你,但我會指出不足認知錯誤之處:

  • 微積分、普通物理、線性代數、離散數學可用在哪?
  • 以往學習到的資料結構及演算法如何影響你我每日生活?
  • 數學、物理、程式語言與電子電路等基礎科目,究竟為何而學?

74 of 96

特別聲明(2)

  • 部份教材提供錄影,授課時段主要作「師生互動」
    • 隨堂測驗、code review、問答,還有「認識自己」
  • 本課程不歡迎「玻璃心」
  • 真強者不會在意世俗的批評,而著重「自己對所處產業的影響與貢獻」
  • 你在國立大學就讀,要想想納稅人「被迫」投入多少資金在你身上,如果�發現自己不適合這個科系或環境,不用4年就知道,不要死撐,否則沒臉面對廣大的納稅人
    • 我就是「為納稅人而教」,才拋開賺大錢的機會,來這跟你們相處,不是為了什麼理想
    • 國立大學的畢業生產值低落,是相當罪惡的事

75 of 96

寫作業才是主體!

  • 課堂主是重點提示和互動
  • 當然你要研讀指定教材和寫作業
  • 才有辦法參與討論
  • 大略比重
    • 授課教師花3小時講解教材和作業規範
    • 學員花30小時學習並在作業過程中檢討

76 of 96

不建議選修的學生族群

  • 覺得自己無論怎麼努力,仍比隨便一位台大資工系畢業生還差的人
  • 覺得光靠著拿著成功大學的畢業證書,就能在資訊科技產業有尊嚴地享有優渥生活
  • 覺得每週看著游泳教練或鋼琴教師表演,但自己不下水或不動手,卻又期盼可學到什麼技能的人

Source: https://twitter.com/TweetMe4Moji/status/777333082839842816

77 of 96

踏實

  • 一件事新不新其實一點都不重要,關鍵是「做得好不好」
  • 人類煮飯已有十餘萬年,但至今「把飯煮得好吃」仍是一門藝術
  • 創新唯一原因是原本的不夠好;創新唯一方法是把事情做好;創新的唯一價值是它真的好到解決問題。除好之外別無他物

I'm now a 10X programmer.

Source: https://twitter.com/RichRogersIoT/status/807644258165395457

78 of 96

時間和地點

  • Linux核心設計
    • Feb 20, 2023 - Jul 2, 2024 (每週二) 15:10-18:00
    • 成功大學資訊工程系新館65203電腦教室 (新大樓2樓走到底右轉)
  • Linux核心實作
    • Feb 23, 2024及Feb 29, 2024起每週四19:30,線上為主並於期末協同Linux核心設計課程進行現場成果發表
    • 每週四安排隨堂測驗和檢討
  • 請訂閱Google Calendar
  • Office hour: 每週二19:30-24:00 (事先預約)
    • 發訊息給「Jserv與他愉快的小夥伴

79 of 96

課程密度

  • 前6週是密度最高的時期,我們會上滿18週的課程主動加課2週
    • 可能會不小心從晚間一路忙到看日出,稍微休息又繼續趕工,請拿出決心來
    • 避免期末過度熬夜,改為「開學第一週就開始熬夜」
    • 不是這門課程很操,是你過去欺騙自己
    • 遇到其他課程期中考,本課程會降低課程壓力
    • 建議投入每週16小時
  • 依據成功大學行事曆,自2月20日開學以來,會遇到表定假日:
  • 4月5日 / 4月9日
  • 課程「不理會」上述假日,會用YouTube直播講課和安排在家測驗
  • 學生:「春節連續假期我已安排跟家人出遊,怎麼辦?」 / 教師:「跟家人團聚當然要重視,你只要當日挪出一個小時參加線上測驗,只要你夠強」

「Linux核心實作」課程在週四晚間

「Linux核心設計」課程在週二下午

80 of 96

為何不拆成 (上)/(下) 二門課?

  • 學員只要遇到寒暑假,往往就會有認知銜接的問題。寧可一學期相當辛苦,也不要二個學期存在大量重複內容,只因學員宣稱「忘了」自己從未學會的東西
  • 每年都要重新修訂教材,才能夠反映出Linux核心最新發展,而某些關鍵議題的比重只要拉長時間,就很難調整

例如Rust程式語言,在 Linux v6.1已正式支援,近期甚至某些GPU裝置驅動程式就用Rust開發,科技大廠也投入可觀開發資源,於是近期重新調整授課比重,但這樣的調整需要數年

  • 由於退選率高,倘若分拆成二門不同學期的課程,較晚開設的課程可能因人數過低,甚至登記不到電腦教室
  • 不是Linux核心困難,而是學員心態調整太慢,就算學員囫圇吞棗地閱讀Linux核心原始程式碼,一定存在自己能夠看懂的部分,但許多學員連這樣嘗試的念頭都沒有。先讓學員「誠實面對自己」,有心學習的人,可在課程結束後的暑期和下個學期,參照開放資源,自己補強相關認知,並進行應有的練習
  • 每年都擔心自己沒有體力教下去,只好集中火力,顧好當年的規劃,盡人事、聽天命

81 of 96

評分方式

  • 課堂測驗: 20% (每週都有測驗,選出最高分12次)
    • 在2024年6月24日前,可反覆申請補考、重新測驗
    • 「Linux核心設計」和「Linux核心實作」每週有「不同」的隨堂測驗
  • 個人作業+分組專題+現場報告: 30%
  • 學生自我評量 : 50%
  • 注意:自我評量包含與授課教師進行一對一討論
  • 教學方式說明

Source: https://twitter.com/HistoricalPics/status/844164254093770755

82 of 96

修過本課程的校友:莊彥宣

「若當初沒有上過這堂課,一定沒有現在的機運,同學們要好好珍惜,不要退選」

雖然起步較晚(研究所才開始學習C語言程式設計),但莊彥宣用行動說明,只要把握機會並聚焦,在3年的時間中維護Linux核心無線網路驅動程式,從而成為Linux核心的裝置驅動程式維護者之一。有強度的作品,一個就夠,例如這個目錄就是他維護的,代表Realtek去面對Linux核心技術社群

  • Amazon/eero軟體工程師
  • 成大電機系/成大電通所畢業

83 of 96

修過本課程的校友:魏聖儒

「『你終究要面對現實的,何不一開始就面對現實』工程師的面試/篩選是很實打實的一個過程,jserv的課程讓我見識到了什麼是真正的工程問題;在課程內容裡我學習到如何的思考、定性定量分析、修正、驗證的過程,為工程師未來打好基礎。勉勵大家用力地從中汲取養分,去真正的瞭解未來工作的需要跟挑戰。」

  • Google工程師, Google Pixel產品開發
  • 聯發科技工程師, Android System Software Team
  • 成大資訊系畢業

84 of 96

修過本課程的校友:郭至軒

「我很推薦jserv的課程,雖然電腦科學有無數的領域可以學習,但我認為對系統程式的了解程度可以決定一個工程師的天花板在哪。畢竟不論前端後端,這些程式都是跑在系統軟體上,如果你/妳想成為解決困難問題的工程師,最終還是會碰到系統程式的。想對學弟妹說:想投 Google 的話,履歷記得寄給我」

  • Google工程師, Google Home產品開發
  • Mozilla Taiwan工程師, Firefox OS/Browser開發
  • 成大資訊系/資訊所畢業

85 of 96

修過本課程的校友:周曠宇

jserv的課程可很好地把內功練好,痛苦過後,會讓你的人生選擇更多。譬如Google和Microsoft這些公司的面試,對待資歷較淺的工程師會考察演算法等基礎知識,而非業務相關的經驗。他們號稱要招募『最聰明』的工程師,我相信能進入成大的同學都不笨,何謂『聰明』呢?至少需要有扎實的工程底子和清晰的思維邏輯,然後做好至少一個專案。非常推薦jserv的課程,勝讀十年盲目摸索」

  • Google資深工程師
  • Microsoft資深工程師
  • 阿里巴巴集團/高級工程師
  • 成大電機所畢業

86 of 96

修過本課程的校友:沈宗穎

過jserv的課程可以早點接觸到業界的技術及人脈,這些都是未來找工作時很好的武器。系統軟體也是現在台灣大公司徵才的重點,同學們修課可以盡早領先其他人累積經驗。」

  • Google: ASIC架構師
  • 聯發科技: 電視晶片軟體工程師
  • 成大電機系畢業

87 of 96

修過本課程的社會人士:Vector

「非常推薦jserv的課程,內容非常的札實,絕對對軟體工程師的職涯非常有幫助。這幾年來硬體的進步快速,Linux核心也不斷地在各方面進步,要對Linux核心入門,並不斷跟上新議題有一定的難度。jserv除了教導各議題的來龍去脈,讓有意願鑽研的學生有方向依循,也透過作業的設計,讓學生可以掌握根基,有能力與勇氣去探索沒碰過的領域。雖然個人只上過一期暑期課程,除了學到很多東西外,更重要的是知道還有很多什麼需要學與實作的。jserv不斷強調的 『誠實面對自己』,對我來說也是這課程給予我的一個重要精華。」

  • Manager, Embedded Surveillance System, VIVOTEK
  • Principal Engineer, HTC
  • Deputy Manager, Vatics

88 of 96

課程資料

89 of 96

近期新增

90 of 96

歡迎選修和旁聽,沒有特別的限制

記得寫作業!

「一律同意」背後的故事

91 of 96

選修學生的權益

  • 可存取到授課教師未公開發表的電子書 (例如《Demystifying the Linux CPU Scheduler》)、論文草稿,或前期的程式碼;
  • 授課教師優先批改選課學生提交的作業並給予回饋;
  • 針對表現良好的選課學員,授課教師撰寫推薦信和轉介給資訊科技公司的主管 (有的主管甚至可在面試當日決定offer);
  • 助教和授課教師會主動追蹤選修課程學員的狀況,安排必要的一對一討論;

92 of 96

來信時,不要說自己「非本科」

  • 沒必要強調自己「非本科」,在這個世紀只要沒強度都是非本科
  • 對我來說,電機系和資訊系的學生,只是入學分數較高,學生能否拿出有強度的作品和技術突破,才是我在意的事!為何我們的課程這麼難?就是因為我們鎖定一系列高強度的工作和成果。

93 of 96

不要牽拖「自己電腦慢」

  • 至今,我在教學和工作中,仍使用2012年出廠的MacBook Air。在這台電腦上:
    • 藉由 HyperKit(建構於Apple Hypervisor.framework之上)搭配Intel硬體虛擬化來執行Ubuntu Linux,並編譯Linux 核心
    • 打造幾乎100%開放原始碼的教材,進行教學用途,所有的作業也在這台電腦上設計和開發
    • 設計和驗證RISC-V處理器
    • 開發RISC-V指令集模擬器和JIT編譯器,允許Linux核心執行在自行開發的RISC-V系統模擬器之上
    • 設計GPGPU並模擬,搭配LLVM toolchain,都從原始程式碼建構
    • 偶爾寫電動遊戲給女兒玩
  • 硬體組態是Intel Core i5-3427U Processor (Dual-Core, 1.8GHz, 3MB Cache)加上8GB DDR3

94 of 96

避免非必要的詞彙

  • 常會遇到學生開口就是「不好意思」,詢問課程資訊、作業遲交、補考,甚至是過得不開心也都要說「不好意思」,學生又沒有冒犯我,實在不需要太早致歉,真要說,也該是跟廣大的納稅人致歉,後者「被迫」要把血汗錢砸在國立大學的學生身上。

95 of 96

有效且直接的溝通

  • 學生唯一需要跟授課教師道歉的理由是,自己「不夠強」

96 of 96

開始挑戰前,請思考這席話

「夢想到底是什麼?有的時候,我覺得夢想遭到濫用。而夢想和白日夢的差別又在哪裡?對我來說,夢想,缺乏一個步步為營、量力而為的態度,以至於夢想一直都像夢一樣,你實在說不出一個所以然,也不知道如何實現他,你也沒有實際的目標,遇到抉擇的時候,你還是選擇玩樂,以至於,夢想就真的成為了一個夢想」 -- c9s