--- tags: linux2024 --- # 2024q1 Homework5 (assessment) contributed by < [howardjchen](https://github.com/howardjchen) > ## 閱讀〈[因為自動飲料機而延畢的那一年](https://blog.opasschang.com/the-story-of-auto-beverage-machine-2/)〉的啟發 看到這篇文章實在太熱血了,讓我不禁想起以前大學的時候也做了類似瘋狂的事情,以前大三的專題做一個[除草機器人](https://www.youtube.com/watch?v=bWCAR4Yul7I&ab_channel=HowardChen),我們也是三人小組,我的角色就像主角 CEO 一樣要處理一堆雜事,設計機構,跑到工廠請師傅裁切,購買器材與經費預算的控制,撰寫機械控制的軟體還有設計機器人的軟體架構,另一方面有另外兩位一起打拼的熱血同學,其中一位是我同屆電機系的同學負責寫網站的控制介面,另一位是電機系的學弟負責寫 APP,成品做出來之後真的有一種我們可以開一間公司的感動XD 就像文中作者說的,裡面每一個機構每一顆馬達的選擇我都知道他的理由與原因,我非常清楚這台機器裡面每一個優缺點與問題 當時也是花了一年的時間,從大三到大四,三個人每天耗在實驗室裡面從白天到深夜,真的是太熱血啦 回到[因為自動飲料機而延畢的那一年](https://blog.opasschang.com/the-story-of-auto-beverage-machine-2/)的啟發,研究所畢業之後在業界擔任工程師也將近五年的時間,現在回來看其實滿有啟發,工作之後最深的感觸是選擇比努力重要,但這不是代表我們不想努力,而是錯誤的選擇與決策往往會把我們帶向萬丈深淵,所有的努力都會付之一炬,在業界這個決策者往往不會是我們小工程師來決定,而是高層人員在做決策,也因此離開了學校進到真實世界,做選擇就成了非常重要的事情,他會關係一間公司的成敗與是否有辦法繼續獲利 以前我們在學校的時候往往對於問題過於理想化,而無法理解真實世界的複雜,所以實踐操作起來會遇到許多困難,但我覺得精確的說,對於問題過度的理想化,往往源自於自己對事情的無知,因為無知導致看不到更深層且複雜的問題 其中最感動我的是文章一個出現也是最後結尾出現的話: > 人不付出犧牲,就得不到任何回報。如果要得到什麼,就必須付出同等的代價,這就是鍊金術的基本原則,等價交換。當時我們深信著,這就是這世界的真理。------《鋼之鍊金術師》 ## 課程心得 出社會工作之後,每天都在跟時間賽跑,上完班下班之後要在花5個小時的時間來追趕進度,真的只能用追趕來形容,因為每週的課程教材真的有夠多,每週又都有新的測驗跟作業,每次要開始寫作業的時候都要做好心理建設,因為真的每一題都不簡單,常常覺得我過去這五年做工程師到底都在幹嘛,怎麼一個很簡單的 `select` man page 都要看這麼久,有時候也會納悶同事下班都可以出去社交去 happy,同齡人都在討論怎炒股炒房,或是育兒經,而我就要獨自在電腦面前啃這些硬生生的教材,看這艱澀難懂的 linux kernel,被客戶轟炸之後的一天我可以直接放棄讀書去耍廢,每年還是有可觀的薪水與分紅讓我享樂,但每當我這樣想的時候, jserv的話又出現在我腦海中 > 我們學習這些知識是不是讓你以後進大公司寫寫 driver 而已,而是要讓你可以參與重要的資訊系統開發,對人類社會做出貢獻,這就是為什麼我們這門課這麼難的原因 是啊,我當初想要修這門課原因就是想要對linux kernel做出貢獻,我還想要更上一層參與更重大的資訊系統開發,我不想要作一個只是在 IC design house 寫 drive r的工程師,我想創造東西,我想要讓我寫的程式讓千百萬人使用,就像 Goole 的名言: > Do something that matters > 要做,就要做大的 因此我給自己承諾,不管再怎麼累,再怎麼沒時間,再怎麼想放棄,我都要拼死拼活的上完這門課,要翻身就靠這一次機會了,而且這也有可能是最後一次機會 > 人不付出犧牲,就得不到任何回報。如果要得到什麼,就必須付出同等的代價,這就是鍊金術的基本原則,等價交換。當時我們深信著,這就是這世界的真理。------《鋼之鍊金術師》 ## 想投入的專案 - **Linux 系統虛擬機器開發和改進** 挑戰改進並提交 patch 貢獻到[Gunyah Hypervisor from QUIC](https://www.phoronix.com/news/Qualcomm-Gunyah-Linux-v12) - **自訂題目**: 改進並提交貢獻到linux kernel 的 [drivers/pci](https://docs.kernel.org/PCI/pci.html) ## 作業回顧 ### 第三週測驗5 針對`ceil_ilog2` 當輸入不為 2 的冪時,輸出的結果為錯誤的,例如輸入`0x0f456780` 預期輸出應該是 27,但得到的會是 28 參考 [vax-r](https://hackmd.io/@vax-r/linux2024-homework4#%E6%B8%AC%E9%A9%97%E4%BA%94) 解釋,一開始進行 `x--` 是為了處理 `x` 剛好為 2 的冪,如果 `x` 剛好為 2 的冪,沒有在一開始減一的話最後輸出會因為最後的 `+1` 而比正確答案多一。 > 但是也因為這樣造成當輸入不為 2 的冪時,輸出的結果會比預期的結果多加1 因此嘗試修改,想法如下 - 不特別考慮輸入是否為 2 的冪,因此就可以拿掉`x--`這個特殊情況 - 當判斷`x > 0x3`之後,`x`只剩下2個bit,即 `01'b`, `10'b` 和 `11'b` 三種情況 - `10'b` 和 `11'b`: `r | shift` + 1 - `01'b`: `r | shift` 不變 因此我們嘗試修改讓`ceil_ilog2`可以計算出正確的答案 **[Commit: Fix bug if input is not extacly power of 2](https://github.com/howardjchen/linux2024-hw3-4/commit/ebd69e7c133d46c56d4cf5b3c95c16f6dcff80df)** ```diff diff --git a/ilog2.c b/ilog2.c index fa896fa..4154f74 100644 --- a/ilog2.c +++ b/ilog2.c @@ -61,7 +61,6 @@ int ceil_ilog2(uint32_t x) { uint32_t r, shift; - x--; r = (x > 0xFFFF) << 4; x >>= r; // printf("[0xFFFF] x: 0x%x\n", x); @@ -80,7 +79,7 @@ int ceil_ilog2(uint32_t x) x >>= shift; //printf("[0x3] x: 0x%x\n", x); - return (r | shift | x > 1) + 1; + return (r | shift | x > 1); } ``` ## 期末專題 hypervisor in different stage: - CPU virtualization - Memory virtulization: [userfaultfd](https://docs.kernel.org/admin-guide/mm/userfaultfd.html) - Device virtulization: [VFIO](https://docs.kernel.org/driver-api/vfio.html) - Confidential Computing: - [Confidential Computing Consortium](https://confidentialcomputing.io/) - [Confidential Computing in Linux for x86 virtualization ](https://docs.kernel.org/security/snp-tdx-threat-model.html?highlight=coco)