《linux內核設計與實現》實踐之模塊及深刻

 《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命令查看詳細信息的結果以下圖所示。

發現結果是一致的,因此說明咱們編寫的模塊功能能夠正常實現。

 

下面嘗試新的作法。

未完待續。。。。。。

相關文章
相關標籤/搜索