Skip to content
所有標籤

#cs107

27 篇文章

Bitwise operators、型別轉換與 bitmask|Stanford CS107 第 4 堂

第四講先釐清 signed/unsigned 轉型不改 bits、混合比較可能改變數值意義,以及 sign extension、zero extension、truncation;再推導 AND、OR、NOT、XOR 與 bitmask 的讀取、設定、清除和集合操作。

整數、位元組與 two's complement|Stanford CS107 第 3 堂

第三講從 32/64-bit 位址空間出發,推導 unsigned 與 two's-complement signed integer 的範圍、反相加一與共用加法硬體,再分清 unsigned modulo 運算和 C signed overflow,最後用四組故障案例檢查模型。

Bit shifts、bit tricks 與 GDB|Stanford CS107 第 5 堂

第五講把 bitmask 推進到 left/right shift、power-of-two 與 popcount tricks,並用 absolute-value 範例揭示 signed intermediate 在 INT_MIN 會 overflow;後半建立 GDB 的 breakpoint、執行控制、格式化 print、memory examine 與 backtrace 工作流。

第一支 C 程式,以及 binary 與 hexadecimal|Stanford CS107 第 2 堂

第二講把 C 放回 Unix 的歷史與開發環境:拆解 header、main、printf、argc/argv,走過 ssh、emacs、make 與執行檔,再用位值系統推導 8 bits = 1 byte、byte 的 256 種 pattern,以及 binary/hexadecimal 的雙向換算。

從課程地圖走進 Unix 命令列|Stanford CS107 第 1 堂

Winter 2026 第一講先回答 CS107 為何要往抽象層底下挖:從位元組、記憶體、組合語言到 heap allocator,再交代作業 40%、lab 10%、期中 20%、期末 30% 的課程制度,最後用 Unix 命令列替後續 C 開發暖身。

看懂 x86-64 addressing modes,分清位址和值|Stanford CS107 第 15 堂

CS107 第 15 講把 x86-64 的 mov 拆成 immediate、register、absolute、indirect、displacement、indexed 與 scaled indexed operands,並以 D + R[b] + R[i]×s 統一解讀 pointer dereference 和 array access。

從 subregister 到 ALU,讀懂 x86-64 算術與位元運算|Stanford CS107 第 16 堂

CS107 第 16 講把 b/w/l/q 資料寬度、subregister、movs/movz、lea、呼叫慣例、算術邏輯與 shift 串成一套規則:先確定操作寬度,再追蹤來源、目的與是否真的讀取記憶體。

從 condition codes 到 loops,讀懂 x86-64 條件控制|Stanford CS107 第 18 堂

CS107 第 18 講以 ZF/SF/CF/OF 串起 cmp、test、signed/unsigned conditional jumps,再拆解 if、loops、dynamic instruction count、setcc 與 cmovcc。

從乘除法到 %rip,讀懂 x86-64 control flow|Stanford CS107 第 17 堂

CS107 第 17 講先完成 x86-64 的 full-width multiplication 與 division,再沿著 instruction bytes 追蹤 %rip,最後以 direct/indirect jmp 說明程式如何離開預設的順序執行。

從 call/ret 到 calling convention,讀懂 x86-64 函式呼叫|Stanford CS107 第 19 堂

CS107 第 19 講追蹤 %rsp、push/pop、call/ret、parameters、return values、stack locals 與 caller/callee register discipline,建立可跨函式維持資料與控制流的 ABI 契約。

從 C 到 x86-64,第一次讀懂反組譯輸出|Stanford CS107 第 14 堂

CS107 第 14 講用 sum_array 的 10 條 x86-64 指令拆開反組譯輸出:左側是位址與機器碼,右側是 AT&T assembly;讀者的任務是由 opcode、operand、register 與控制流程還原 C,而不是手寫組合語言。

從字串搜尋到 Buffer Overflow,輸入驗證不是容量檢查|Stanford CS107 第 7 堂

CS107 第 7 講先用 strchr、strstr、strspn 建立指標式字串掃描,再指出只驗證內容仍擋不住 buffer overflow:安全邊界必須同時涵蓋輸入規則、目的地容量、終止字元與記憶體檢測。

Caching、Memory Hierarchy 與 Locality|Stanford CS107 第 25 堂

CS107 第 25 講用精簡投影片建立 cache 的核心模型:記憶體存取成本不均,較小且較快的層級保存可能再次使用的資料,而 temporal 與 spatial locality 決定程式能否受益。

C 字串不是型別,而是一份記憶體契約|Stanford CS107 第 6 堂

CS107 第 6 講把 C 字串拆回 char 陣列、終止空字元與位址:strlen、strcmp、strcpy、strncpy、strcat 的每一個便利,都以呼叫者維持容量與終止條件為代價。

先用 Callgrind 找熱點,再讀懂 GCC 做了哪些最佳化|Stanford CS107 第 24 堂

CS107 第 24 講用矩陣乘法與 Callgrind 建立量測流程,再拆解 GCC 的 constant folding、共同子運算式消除、dead-code elimination、strength reduction、code motion 與遞迴轉迴圈;最佳化從瓶頸證據開始。

把 realloc 留在原地,必須守住哪些 allocator 不變量|Stanford CS107 第 23 堂

CS107 第 23 講把 explicit free list 推進到原地 realloc:縮小時切出可用區塊,放大時吞併右側 free blocks,做不到才配置、複製、釋放;每一步都要同時維持實體 heap 與邏輯 free list。

Function Pointer 讓 Generic C 注入比較規則|Stanford CS107 第 12 堂

CS107 第 12 講先用 char * 完成 byte-wise generic swap 與 rotate,再以 function pointer 把 bubble sort 的走訪機制和比較規則拆開;void * 解決資料型別,callback 解決行為差異。

從 Comparator 到完整 Generic Bubble Sort|Stanford CS107 第 13 堂

CS107 第 13 講把 bool callback 升級成三向 comparator,再把 void *、element width 與 const void * callback 合併成完整 generic bubble sort,最後對照 qsort、bsearch、lfind 與 lsearch。

void * 如何讓 C 擁有泛型,又不假裝型別還在|Stanford CS107 第 11 堂

CS107 第 11 講先收完 calloc、strdup、free、realloc 的 heap 契約,再把 swap 從多份型別專用程式改造成 void * 加 byte count:C 的泛型不是保留未知型別,而是明確交接位址、寬度與解讀責任。

Heap Allocator 的第一個設計,速度與空間為何互相拉扯|Stanford CS107 第 21 堂

CS107 第 21 講從 allocator 的 alignment、throughput 與 utilization 目標出發,以 bump allocator 和 implicit free list 拆解 metadata、splitting、placement、內部與外部碎片,以及 free 後為何必須 coalesce。

Explicit Free List 為何同時活在兩種順序裡|Stanford CS107 第 22 堂

CS107 第 22 講把 implicit free list 改成 explicit free list:搜尋只拜訪可重用 blocks,但每塊 free memory 同時具有實體相鄰順序與邏輯鏈結順序,unlink、coalesce、reinsert 必須共同維持不變量。

指標不是魔法,而是可被複製的位址|Stanford CS107 第 8 堂

CS107 第 8 講從 & 取址與 * 解參照出發,說清楚 C 的 pointer parameter 為何仍是 pass-by-value,以及 int *、char *、char ** 如何分別修改 caller 擁有的 int、char 與 pointer。

Array 不是 Pointer,但它們在運算式裡合作|Stanford CS107 第 9 堂

CS107 第 9 講用 C strings 七條規則拆開 array object、pointer variable 與 string literal:array 常在運算式中退化成首元素指標,但儲存空間、可重新賦值性、可修改性與 sizeof 行為仍完全不同。

Reverse Engineering 之後,先問 Privacy 與 Trust,再進 Heap Allocator|Stanford CS107 第 20 堂

CS107 第 20 講把 reverse engineering 能力放回倫理脈絡:privacy 有個人與社會模型,trust 等於 reliance 加上 betrayal risk;接著複習 process memory,從 malloc client 轉成 heap allocator implementer。

Stack 與 Heap 的差別不是速度,而是 Lifetime 與 Ownership|Stanford CS107 第 10 堂

CS107 第 10 講從 sizeof 與 pointer arithmetic 走進 stack frame lifetime:回傳 local array 會留下 dangling pointer;malloc 讓資料跨越函式返回,但也把 NULL、容量計算、ownership、free 與 memory leak 交給程式設計者。

Wrap-up,六個系統問題與下一站|Stanford CS107 第 26 堂

CS107 第 26 講用六個大問題收束十週內容:representation、text、memory、generics、execution 與 allocation;它以 explicit allocator 檢查學習成果,並把後續路線指向 CS111 與其他 systems 課。

計算機組織與系統:從 C 與指標到 x86-64 與自己寫 malloc|Stanford CS107 課程總覽

CS107 是 Stanford 的計算機系統課:從位元、C 字串與指標,走到 x86-64 組合語言與執行期堆疊,最後自己寫 heap allocator,共七份作業。講義、作業說明與 lab 的逐題解答都公開;作業起始碼放在 Stanford 的 AFS 上,沒有校內帳號拿不到。