contributed by < yyyyuwen
>
作業說明︰ K04: fibdrv
linux-headers
套件linux-headers
套件已正確安裝fibdrv.ko
核心模組fibdrv.ko
核心模組在 Linux 核心掛載後的行為ref : Linux Memory Management, kmalloc kzalloc vmalloc malloc 和get_free_page()的區別
兩者皆是管理 kernal 的 memory , kmalloc 返回的是虛擬位址,且他分配的 memory 在實體上是連續的,對於進行 DMA 的設備很重要。
而 vmalloc 只是虛擬地址連續,實體地址不一定連續。不能直接用於 DMA 。
兩者的工作方式相似,不過因為在實體地址上的不連續,使得效率不高。因此只在不得已時才會使用 vmalloc (通常為了要獲得大塊的 memory )。 vmalloc 分配的一般為大塊內存,而 kmalloc 一般分配的為小塊內存,(一般不超過128k);
實體上連續可做 mmap() -> shared page (延伸)
原文網址:https://kknews.cc/code/5o4lqq8.html
空間主要被分為兩個部份 : user space and kernal space.
user space : 0~3GB (PAGE_OFFSET, equal to 0xC000000 in 0x86)
kernal space : 3GB~4GB
在這一次的實驗中,我們將會使用 kmalloc ,來實現 big number arithmetic.
Linux 的 Device Driver 主要分為兩個類型 Block Device Driver 與 Character Device Driver 。
差別:
module_init(sys_init)
module 被 Kernel 加載時會使用到module_exit(sys_exit)
結束時(卸載)會調用到。可以利用 insmod
和 rmmod
來加載與卸載 module (要在)super user 的模式下。
根據Linux Virtual File System 介面,會先宣告一個 file_operations 的資料型態 ,如下
接下來會設定一些對應到 VFS system call 的函式。當在使用者模式程式(client.c
)中呼叫到 system call(read()
, write()
…)時,藉由 VFS 將其對應到在 file_operations 裡設定的函式(fib_read()
, fib_write()
…)。
參考比對 kdnvt 與 KYG-yaya573142 兩位同學的作法。
首先因為在計算 之後的數字沒辦法以數值的方式列出, 得到的預期輸出為
+
= +
=
但由於在 64 位元系統中, TMAX = ,會導致 overflow 的結果,更詳細的解說在此。
而改進方式在說明有提及,有兩種方式
long long
的形式:long long
的方式,如此一來會變成兩個16位元的數,而有號數最大範圍到。string
的方式:long long
可以消耗較少的 memory usage。原始的程式碼如下,我們可以不需要將所有的值存下來,只需要利用參數來紀錄前一個變數數字就好了。
改良如下:
參考作業說明跟 KYG-yaya573142 <排除干擾效能分析的因素> 來做修改
將 CPU 獨立給特定程式來做使用
修改
修改之後利用 sudo update-grub
更新再重開機。
觀察到 affinity list 不包含該編號的 CPU
透過指定處理器親和性 (processor affinity,亦稱 CPU pinning),可以將程式固定在特定的 CPU 中執行。且client 只有在 fibdrv 掛載時才能被執行, 因此這個指令將會被寫在另外一個專門量測的 bash 檔,命名為 performance.sh
。
原因 : 為了防範記憶體損壞漏洞被利用的電腦安全技術。ASLR通過隨機放置行程關鍵資料區域的定址空間來防止攻擊者能可靠地跳轉到記憶體的特定位置來利用函式。現代作業系統一般都加設這一機制,以防範惡意程式對已知位址進行Return-to-libc攻擊。 參考
make checck
時遇到一個錯誤:利用 dmesg
查看可能出錯的地方
發現可能是版本有問題,因此重新掛載一次,先 make clean
再 make
一次就成功了。