《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命令查看详细信息的结果以下图所示。

发现结果是一致的,因此说明咱们编写的模块功能能够正常实现。

 

下面尝试新的作法。

未完待续。。。。。。

相关文章
相关标签/搜索