《linux內核設計與實現》實踐之模塊及深刻linux
寫在前面的話。spa
基礎模塊部分我已經作完了,設計到的知識點無非就是,編寫模塊代碼,編寫Makefile文件,加載模塊和卸載模塊部分。因爲你們都寫了這部分的博客,我也就再也不贅述,我重點想寫一下,頁表模塊的深刻和改進。firefox
1、編寫代碼設計
2、編寫Makefile文件3d
3、加載模塊,嘗試運行blog
查看gedit進程號可知爲pid = 18968進程
查看gedit的起始地址0x0804880c 博客
轉化爲10進制數爲134514700,即va = 134514700虛擬機
出現問題it
緣由是沒有在root權限下加載。
解決:
首先要寫在以前的加載失敗的模塊scn(雖然失敗,可是已經加載)
接着在root權限下從新加載。
檢查是否加載成功
Tail查看相關信息,出現錯誤
錯誤緣由是,我在解決第一個問題的時候,把gedit scn.c進程關閉了,因此pid號發生了改變。
解決方法:從新作一遍,先卸載scn模塊。
爲了方便起見,我以後的實驗都在root權限下作。
Pid = 20101
edit的起始地址0x0804880c ,發現沒有改變,即va = 134514700
結果仍是失敗了,因此我準備換一個進程看看是什麼狀況,此次用firefox
可是,我發現firefox並非一個可執行文件,並不能反彙編,因此我仍是回到了最初的起點。。。。。。。
這一次成功加載。
查看模塊運行信息。
能夠看到上一次失敗的運行信息。
這一次的失敗緣由是
Va的值找的不對,應該看得是init處的起始地址,我找的是init@@Base處的起始地址。
在嘗試多種修改後,仍是不能解決問題。我又從新看了一遍原理。
因爲一直失敗,我猜想多是我參考的學姐的代碼並不適用於個人虛擬機,我仔細研究了一下原理後,發現多是個人虛擬機雖然是32位,可是是能夠進行地址擴展的。因此,不能只用頁全局目錄(Page Global Directory)、 頁表(Page Table)兩種頁表就能夠,還要加上頁上級目錄(Page Upper Directory)、頁中間目錄(Page Middle Directory)。因此修改後的源代碼以下圖所示。
由於makefile文件,已經寫好了,就不須要更改了,直接make就能夠了。能夠成功生成5315.ko文件。
接下來就是加載模塊了,咱們須要得到pid的信息。
由上圖知Pid = 24268
接着查看va的值,發現va的值不變,因此能夠直接加載模塊。成功加載後,查看相關信息。
使用dmesg命令查看詳細信息的結果以下圖所示。
發現結果是一致的,因此說明咱們編寫的模塊功能能夠正常實現。
下面嘗試新的作法。
未完待續。。。。。。