《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命令查看详细信息的结果以下图所示。
发现结果是一致的,因此说明咱们编写的模块功能能够正常实现。
下面尝试新的作法。
未完待续。。。。。。