# XDEv11 # 個人簡介 - 國立成功大學資訊工程學系學士班(2018~) # Linux Kernel Internals 2021 春季班 ## 問題選答 (回顧內容) - (a. 知道 x - y < 0 敘述為何不能寫為 x < y 嗎? (CS:APP 第 2 章) - x - y 有可能會發生整數溢位,前後者結果並不一定相等。 - (d. 知道 Linux 核心 < include/linux/list.h> 裡頭 #define list_for_each_prev(pos, head) for (pos = (head)->prev; pos != (head); pos = pos->prev) 這樣的巨集到底在做什麼?以及 `head` 使用時需要加小括號,為何? - Linux list 是一個雙向鏈結串列,給定一個位置當起始點 (`head`),會從起始點的前一個位置一直繞一圈。 - `head` 有可能不只是一個變數,因為 `list_for_each_prev` 為巨集,為了確保 `head` 先被計算,所以加上小括號。 - (h. 知道如何寫出時間複雜度和空間複雜度皆為 O(1) 的 abs64 嗎?(沒有分支) 這樣的 abs64 又可用於真實世界哪邊? - ``` long long abs64(long long x) { long long m = x >> 63; return (x ^ m) - m; } ``` - x 為負數時,進行算術位移往右 63 位元,得到二進位階為 1 的數字 (-1),透過 bitwise XOR (^),可將 x 反轉,(~x + 1) 即為正數。 - x 為正數時,沒有任何影響。 - 沒有分支的實作,可以避免旁路攻擊 (side-channel attack)。 ## 課程專題 - [sehttpd](https://hackmd.io/@sysprog/linux2020-sehttpd) - [共筆](https://hackmd.io/@XDEv11/sehttpd-project) - 研究內容 - Socket - IO - epoll - io_uring - Timer - priority queue (binary heap) - timing wheels ## 自我評量分數 - **43 / 50** 學期初大多是一些基本能力加強,這方面以前都有不少基礎,所以還勉強能夠負荷, 學期中後段,因為課程專題同時也是我們的資訊專題,主要的精力都花在這上面, 老師給了非常豐富的補充資料與作業,但是因為大三實在有太多事情, 在系統軟體方面的進步的確不多,這也是為什麼我只能給自己一個中規中矩的分數, 當然不是說我不努力,亦或是沒有在課程學到東西,相反地, 在這堂課學到很多其他課不會教的東西(如何遵守規範、撰寫文件,如何分析程式好壞等等), 基礎能力也變更好了,還有機會接觸最新的技術 (io_uring),謝謝老師的教學, 也很感謝願意讓我們把課程專題做成資訊專題發表,希望未來有機會能夠再修老師的課。