duckcone

@duckcone

Joined on Feb 21, 2024

  • 2025q1 Homework1 (lab0) contributed by < duckcone > Reviewed by HeatCrab 只要 next != head 就判斷 current 節點的字串是否與 next 節點的字串相同,若是相同就將 next = next->next。 這裡的 while 迴圈,可以使用 list.h 中的 list_for_each_safe 來取代,增加可讀性。 簡單實作如下: + struct list_head *safe;
     Like  Bookmark
  • contributed by <duckcone> 2025q1 第 1 週測驗題 測驗 1
     Like  Bookmark
  • contributed by < duckcone > Linux 核心專題:排程器原理 執行人: jeremy90307 false sharing 為了避免 falxe sharing 問題,可以採用對齊 cache line 的方式,雖然可以提高效能,但是否會浪費過多的記憶體空間? 實作輕量級的 Mutex Lock 由於每個節點都需要等待親代節點就緒才能執行下一個階段的工作,是否會有隱含的同步問題?
     Like  Bookmark
  • 淺談 Linux 核心:系統呼叫 (System Call) 我們可以將 Linux kernel 當做程式運行於特權模式 (privileged mode) 的函式庫,如果要使用這個函式庫,必須使用硬體提供的特殊指令。以 x86 為例,呼叫普通函式庫使用 call 和 ret ,呼叫 Linux kernel 則需要用 syscall 和 sysret。 系統呼叫 (system call) 是 userspace 和 kernel 進行交互的界面,讓使用者的程式可以請求 kernel 進行更高權限的操作,例如硬體相關的操作 (e.g. 讀寫檔案) 、行程 (process) 的建立與執行等等。 一切的一切就從 Hello World 開始 參考 Linux 核心設計: 賦予應用程式生命的系統呼叫 文章中的範例,可以透過簡單的程式來了解系統呼叫的運作過程。 給定 hello.c:
     Like  Bookmark
  • 利用 RDTSC 量測時脈週期 在進行程式的時間測量時,可以透過 rdtsc 指令取得時脈週期。 rdtsc 會返回 CPU 啟動之後所經歷的時脈週期數量,因此我們可以透過該指令在兩個區段相減過後的值來計算一段時間,例如量測執行一段程式碼所花費的時間。 在 CPU 啟動之後,會自動累積週期數,並且會將值紀錄在 EDX 和 EAX 暫存器, <mark>EDX 為高位元, EAX 為低位元</mark>。 EDX 和 EAX 暫存器 暫存器分為 32 位元以及 64 位元暫存器。RDX 和 RAX 皆為 64 位元暫存器,對應的 EDX 與 EAX 則為 32 位元暫存器。32 位元和 64 位元暫存器並不是獨立的暫存器,以 RAX 與 EAX 為例, EAX 佔了 RAX 的低位 32 位元,因此對 EAX 暫存器修改時也會影響到 RAX 暫存器。 image 參考資料:Day6 - 為什麼要使用暫存器?
     Like  Bookmark
  • 新增 System Call 至 Linux 核心 在網路上尋找有關新增 system call 至 Linux 核心的文章時,發現有些文章所提供的方式無法順利執行,可能是核心版本的差異導致作法不同,因此想紀錄下自己嘗試後能夠成功的方法。 這篇文章除了是自己的筆記之外,也告訴大家如何新增一個簡單的 system call,並且透過 QEMU 運作。同時也感謝網路上許多大神的無私奉獻,提供各種教學文章。 :::warning 在本篇筆記的命令列範例中,若前綴為 $ 者,表示其執行在 host 端;而前綴為 # 者,表示其須執行在 guest 端 (QEMU 內) ::: 測試環境如下:
     Like  Bookmark
  • 利用 QEMU 與 GDB 追蹤 Linux 核心 GDB 全名為 GNU Debugger ,是 GNU 軟體系統中的標準除錯器,在許多類 Unix 的作業系統中都能夠使用,而現有的 GDB 所能支援除錯的程式語言有 C 、 C++ 、 Pascal 以及 FORTRAN。本篇文章主要是介紹如何編譯 Linux 核心並且在 QEMU 中運作,同時透過 GDB 追蹤 Linux 核心。 :::warning 在本篇筆記的命令列範例中,若前綴為 $ 者,表示其執行在 host 端;前綴為 # 者,表示其須執行在 guest 端 (QEMU 內);前綴為 (gdb) 者,表示其執行在 GDB 模式。 ::: 測試環境如下: OS: Ubuntu 22.04
     Like  Bookmark