contributed by: <flawless0714
>
kernel_fpu_begin()
, kernel_fpu_end()
)。而一般 kernel 中的浮點數運算都會由軟體做掉(fixed point, 用整數運算相關 ops 即可完成),雖然效率沒有 FPU 好,但基於少用與省時(context switch)所以尚可接受。lazy state switching
功能,這功能讓 OS 不用在每次 context switch 都須維護 FPU/SIMD state,此功能搭配 kernel 一起運作。發生 context switch 時,kernel 會先對 FPU/SIMD 做標記,假如在待會新的 context 都沒有用到 FPU/SIMD 相關運算則其 state 將持續保存上個 context 的內容,反之,則會在新的 context 進行相關 ops 前對 kernel 發 trap,以使其保存上個 context 的內容。有鑑於此特性,資訊安全人員發現其可能被濫用的缺陷。有心人士可於 user space 使用一些嫖妓倆 (提及於 Mechanism)以存取到前個 process 的 FPU/SIMD state,這是非常嚴重的問題,因為 FPU/SIMD 相關暫存器不只保存浮點數運算相關資料,其也被用來暫存加密相關資料, e.g. AES instruction set。 作業系統相關工程師為了修復此缺陷讓作業系統效能下降了不少(其中一個解決方法是每次 context switch 都強制 FPU/SIMD state 一起切換,進而增加不少切換時間開銷),而麻省理工強者在去年(2019年)底研究出同時能解決此缺陷又不失效能的方法。calc.c
檔案中,和 fibdrv 一樣有 character device,但註冊用的 kernel API 不同 (register_chrdev
vs. alloc_c⇚hrdev_region
),能否解釋其差異和適用場合呢?
register_chrdev
可自訂 driver 的 major number 與 minor number,而 alloc_chrdev_region
僅可自訂 major number。register_chrdev
(使用 0 作為 major number 參數時還是會動態分配 major number) 適合用於 common devices,他們經常會比你要載 driver 還早拿到你想要的 major number。除非你寫的 driver 有進到 mainline,否則強烈建議使用 alloc_chrdev_region
,以減少註冊失敗的可能性。scripts/test.sh
檔案中,有一道命令為 sudo chmod 0666
,這個作用為何?對於我們測試有何幫助?能否對 fibdrv 建立的 /dev/fibonacci
device file 也套用類似修改呢?另外,請解釋 device file 在核心及使用者層級的功能calc.c
檔案中,用到 copy_to_user
這個 kernel API,其作用為何?本例使用該 API 做了什麼事?若是資料量增長,是否會有效能的嚴重衝擊呢?
copy_to_user()
的用途為將 kernel space 的記憶體複製到 user space,更明確的說法為複製 kernel 中 stack (copy_to_user()
在複製前會驗證是否欲複製之記憶體區塊位於 stack 內)內的內容到 user space 。MathEx
進行效能分析?能否找出相似的 math expression 來分析比較呢?
MathEx
原始程式碼的 expression.[ch]
裡頭 vec
相關的程式碼,主要做什麼事?有沒有發現類似 list 使用到的技巧呢?
mathex/test-unit.c
的測試項目MathEx
一類的 math expression 在真實世界有哪些應用?甚至,是否在 Linux 核心就存在類似的程式碼?
v4.15+
呢?expr_func()
struct expr
中的 function pointer,*f
,反之則以 NULL
assign 給 *f
;linux2019