gyes00205(許嘉倫) ------------------ **簡介:** - 成功大學 資訊工程學系110級 Github: [gyes00205](https://github.com/gyes00205) 2021 linux 核心設計 春季班 自我評量 ================================ (春季班)課堂作業 -------------------------------- - HW1 [lab0](https://hackmd.io/@gyes00205/2021q1_lab0) [quiz1](https://hackmd.io/@gyes00205/2021q1_quiz1) - HW2 [quiz2](https://hackmd.io/@gyes00205/2021_quiz2) - HW3 [fibdrv](https://hackmd.io/@gyes00205/2021q1_fibdrv) [quiz3](https://hackmd.io/@gyes00205/2021q1_quiz3) - HW4 [refinement](https://hackmd.io/@gyes00205/refinement) - HW5 [quiz5](https://hackmd.io/@gyes00205/2021q1_quiz5) (春季班)期末專題 -------------------------------- - [quiz2_slab](https://hackmd.io/@gyes00205/2021q1_slab) (春季班)學期回顧 -------------------------------- a) 知道 x - y < 0 敘述為何不能寫為 x < y 嗎? (CS:APP 第 2 章) 如果 x 為有號數, y 為無號數,在 x < y 的情況下, x 會轉換為無號數。 * x = -1, y = 0 * x - y < 0 為 True * x < y 為 False ,因為此時的 x 會視為無號數相當於 $2^{32} - 1$ h) 知道如何寫出時間複雜度和空間複雜度皆為 O(1) 的 abs64 嗎?(沒有分支) 這樣的 abs64 又可用於真實世界哪邊? ```cpp #include int64_t abs(int64_t x) { int64_t mask = (x >> 63); return (x + mask) ^ mask; } ``` 這邊的位移方式採用 Arithmetic shift (算數位移) * 如果 `x` 為正數 `>> 63` 會得到 0x0000000000000000 => 0 * `(x + mask) ^ mask` 會等於 `x` * 如果 `x` 為負數 `>> 63` 會得到 0xFFFFFFFFFFFFFFFF => -1 * `(x + mask) ^ mask` 相當於 `~(x - 1)` * 可以應用資訊安全領域(時序攻擊),如果有分支的話會導致執行時間的不一致 * 像是在輸入密碼時,如果錯誤密碼與正確密碼存在時間差,那麼駭客就可以從這時間差推測是第幾個字輸入錯誤。 v) 本學期課程內容中,讓你印象最深刻、顛覆過往認知的部分是什麼?請舉例說明 最讓我印象深刻的部分是第一個禮拜所教的內容 **pointer to pointer** ,雖然在大一的時候就有學過,但那時聽不太懂,剛好作業的部分也沒有使用到,因此自己就草草帶過,沒想到在大四的時候又遇到這個問題。在 quiz1 有一個 `list_free` function ,因為當時還不太了解 **pointer to pointer** 的使用時機,所以一開始寫的版本如下。 ```cpp static void list_free(node_t **list) { while (*list) { node_t *tmp = *list; list = &((*list)->next); free(tmp); } } ``` 之後與老師一對一討論時提出這個問題,才得知原來只有在更改 linked list 的指標時, **pointer to pointer** 的技巧才有存在的必要,如果要釋放記憶體內容用一個 pointer 就好,解決方法如下 ```cpp static void list_free(node_t *list) { while (list) { node_t *tmp = list; list = list->next; free(tmp); } } ``` (春季班)所見所聞心得 ---------------------------- 這學期初老師上課有提到,每個禮拜至少花20小時的時間在這門課上,因為前幾個禮拜其他科目都還沒出作業,所以我確實有達到這項要求,但隨著時間的推移,其他科目陸續指派功課花在這門課的時間也越來越少,但最後還是選擇留下來,因為我認為 **Linux 核心設計** 這門課可以讓我了解到自己的不足,雖然已經讀到大四快畢業,但這時候才了解到 **pointer to pointer** 的使用方式與技巧。此外大三學過的作業系統概念到了這門課還是會反覆提起,有一次上課時老師走到我旁邊問我**生產者消費者問題**,但那時的我早已忘光光,因此回答不上來。 如果有人問我說在這門課有學到甚麼?那麼應該是 **bitwise operation** 的操作吧,像是沒有分支版本的abs以及判斷正數負數的方法,都是在這門課學到的,原本的想法可能就是用if-else來判斷正負數,沒想過可以用**bitwise operation**來達到沒有分支的版本。 (春季班)自我評量 -------------------------------- 這堂課我給自己 7 分。