chucknos

@chucknos

Joined on Dec 27, 2022

  • contributed by < nosba0957 > 檢查清單 [ ] 研讀前述 ==Linux 效能分析== 描述,在自己的實體電腦運作 GNU/Linux,做好必要的設定和準備工作 $\to$ 從中也該理解為何不希望在虛擬機器中進行實驗; [ ] 閱讀〈Linux 核心模組運作原理〉並對照 Linux 核心原始程式碼 (v6.1+),解釋 insmod 後,Linux 核心模組的符號 (symbol) 如何被 Linux 核心找到 (使用 List API)、MODULE_LICENSE 巨集指定的授權條款又對核心有什麼影響 (GPL 與否對於可用的符號列表有關),以及藉由 strace 追蹤 Linux 核心的掛載,涉及哪些系統呼叫和子系統? 在 /linux/kernel/module/main.c 中的 load_module 函式中可以找到 simplfy_symbols 函式的呼叫,在 simplify_symbols 內看到 case SHN_UNDEF: 內呼叫 resolve_symbol_wait 再呼叫到 resolve_symbol。最後找到 find_symbol 函式,其中使用到 list_for_each_entry_rcu。再深入查看可以在 find_exported_symbol_in_section 找到 bsearch,在 include/linux/bsearch.h 可以看到 bsearch 的實作,也就是透過 binary search 找到 symbol。MODULE_LICENSE 的影響是若此核心模組宣告非為 GPL,則其無法使用透過 EXPORT_SYMBOL_GPL 的 symbol。從 strace 中看到的系統呼叫有,mmap,mprotect,fstat,fcntl等。 [ ] 閱讀《The Linux Kernel Module Programming Guide》(LKMPG) 並解釋 simrupt 程式碼裡頭的 mutex lock 的使用方式,並探討能否改寫為 lock-free;
     Like  Bookmark
  • contributed by < nosba0957 > 改進測驗題 第三週測驗一 計算平方根的原理為 $$ N^2 = (a_n+a_{n-1}+a_{n-2}+...+a_0)^2,\ a_m=2^m \ or \ a_m=0 $$ 乘開後得到
     Like  Bookmark
  • contribute by < nosba0957 > 針對佇列的操作 q_new 使用 INIT_LIST_HEAD 初始化 head。因 malloc 不一定成功配置,所以使用 INIT_LIST_HEAD 前要先檢查 head 是否為 NULL。 struct list_head *q_new() { struct list_head *head = malloc(sizeof(struct list_head)); if (!head)
     Like  Bookmark
  • contributed by < nosba0957 > quiz1 測驗一 解釋程式碼 此 quick_sort() 函式是使用非遞迴的方式,所以需要用堆疊來紀錄每次迴圈需要的資料。而迴圈需要知道這次執行的子數列的起始位置和結束位置。所以使用 begin[] 和 end[] 來紀錄。i 則為目前堆疊位置索引。 進入迴圈後,兩指標 L 和 R 分別指向此次迴圈要執行的子串列的頭和尾,也就是紀錄在堆疊 begin[i] 和 end[i] 的值。pivot 的選擇是固定使用 L,所以比較下一步要比較節點和 pivot 大小時要從下一個開始,也就是 pivot->next。 graph1 我們使用 node_t *p 來迭代需要比大小的節點。比較的方式如下程式碼,value 是儲存 pivot->value。所以每個節點和 value 比大小後,大的值會加入到 right 串列,小的值加到 left 串列。
     Like  Bookmark
  • Ch5 The LLVM Intermediate Representation Introducing LLVM IR in-memory model Class Function: represent common IR Instruction: represent common IR prefix % for local variables. @ for global variables. IR alloca can reserve stack frame of current function.
     Like  Bookmark
  • 測驗 α−1 解釋程式碼運作原理 __treeint_dump() 是使用中序 (in-order) 方式印出節點。 __treeint_dump(st_left(n), depth + 1); struct treeint *v = treeint_entry(n); printf("%d\n", v->value); __treeint_dump(st_right(n), depth + 1); treeint_remove() 中先使用 treeint_find() 找到目標節點,再使用 st_remove() 刪除節點。st_remove() 透過 st_replace_right() 和 st_replace_left() 來刪除節點。若要刪除的節點有右子樹,則用右子樹的最小值取代。
     Like  Bookmark