分享到plurk 分享到twitter 分享到facebook

版本 d6f0e5658b2844ee7807fd40204340fb3b4e1f62

User/gyes00205

Changes from d6f0e5658b2844ee7807fd40204340fb3b4e1f62 to current

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 <stdint.h>
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 分。