《linux内核设计与实现》实践之模块及深入
《linux内核设计与实现》实践之模块及深入
写在前面的话。
基础模块部分我已经做完了,设计到的知识点无非就是,编写模块代码,编写Makefile文件,加载模块和卸载模块部分。由于大家都写了这部分的博客,我也就不再赘述,我重点想写一下,页表模块的深入和改进。
一、编写代码



二、编写Makefile文件

三、加载模块,尝试运行
查看gedit进程号可知为pid = 18968

查看gedit的起始地址0x0804880c

转化为10进制数为134514700,即va = 134514700


出现问题

原因是没有在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命令查看详细信息的结果如下图所示。

发现结果是一致的,所以说明我们编写的模块功能可以正常实现。
下面尝试新的做法。
未完待续。。。。。。
《linux内核设计与实现》实践之模块及深入的更多相关文章
- linux内核设计与实现学习笔记-模块
模块 1.概念: 如果让LINUX Kernel单独运行在一个保护区域,那么LINUX Kernel就成为了“单内核”. LINUX Kernel是组件模式的,所谓组件模式是指:LINUX K ...
- 《Linux内核设计与实现》读书笔记(十七)- 设备与模块
本章主要讨论与linux的设备驱动和设备管理的相关的4个内核成分,设备类型,模块,内核对象,sysfs. 主要内容: 设备类型 内核模块 内核对象 sysfs 总结 1. 设备类型 linux中主要由 ...
- 《Linux内核设计与实现》 第一二章学习笔记
<Linux内核设计与实现> 第一二章学习笔记 第一章 Linux内核简介 1.1 Unix的历史 Unix的特点 Unix很简洁,所提供的系统调用都有很明确的设计目的. Unix中一切皆 ...
- 《Linux内核设计与实现》学习记录一
chapter1 Linux内核简介 前言:Unix是一个具有相似应用程序编程接口(API)并且基于相似设计理念的操作系统家族. 1.1 Unix的历史 1.Unix演化版实现了任务管理.换页机制.T ...
- 初探内核之《Linux内核设计与实现》笔记下
定时器和时间管理 系统中有很多与时间相关的程序(比如定期执行的任务,某一时间执行的任务,推迟一段时间执行的任务),因此,时间的管理对于linux来说非常重要. 主要内容: 系统时间 定时器 定时器相关 ...
- 《Linux内核设计与实现》CHAPTER17阅读梳理
<Linux内核设计与实现>CHAPTER17阅读梳理 [学习时间:3.5hours] [学习内容:设备类型,模块,内核对象,sysfs] 个人思考部分见[]标出的部分 一.课堂讲解整理& ...
- 《Linux内核设计与实现》课本第四章自学笔记——20135203齐岳
<Linux内核设计与实现>课本第四章自学笔记 进程调度 By20135203齐岳 4.1 多任务 多任务操作系统就是能同时并发的交互执行多个进程的操作系统.多任务操作系统使多个进程处于堵 ...
- 《Linux内核设计与实现》课本第十八章自学笔记——20135203齐岳
<Linux内核设计与实现>课本第十八章自学笔记 By20135203齐岳 通过打印来调试 printk()是内核提供的格式化打印函数,除了和C库提供的printf()函数功能相同外还有一 ...
- 《Linux内核设计与实现》课本第五章学习笔记——20135203齐岳
<Linux内核设计与实现>课本第五章学习笔记 By20135203齐岳 与内核通信 用户空间进程和硬件设备之间通过系统调用来交互,其主要作用有三个. 为用户空间提供了硬件的抽象接口. 保 ...
随机推荐
- spring加载多个配置文件
首先我们都知道要使用spring,则需要在web.xml中增加如下代码: web.xml: 1:<listener><listener-class>org.springfram ...
- 腾讯QQ形象18年变迁史,最早的QQ企鹅形象居然长这样!
1999年,腾讯创建之初,这是当时QQ的形象,现在看起来很滑稽,又高又瘦.当时公司并没有专职的设计师,所以这个形象就凑合着用了. 后来,腾讯也觉着上一个形象做的不是特别好,于是在2000年的时候,公司 ...
- java学习第二天 回顾运算符
一.回顾运算符: 补充: 三元运算符. 代码: /* 三目运算符: 三元运算符: 结构: 条件?条件成立的结果 :条件不成立的结果 ; */ class Demo1 { public static v ...
- Swift 提示:Initialization of variable was never used consider replacing with assignment to _ or removing it
Swift 提示:Initialization of variable was never used consider replacing with assignment to _ or removi ...
- MXNet设计和实现简介
原文:https://github.com/dmlc/mxnet/issues/797 神经网络本质上是一种语言,我们通过它来表达对应用问题的理解.例如我们用卷积层来表达空间相关性,RNN来表达时间连 ...
- [Unity3D]Unity资料大全免费分享
都是网上找的连七八糟的资料了,整理好分享的,有学习资料,视频,源码,插件……等等 东西比较多,不是所有的都是你需要的,可以按 ctrl+F 来搜索你要的东西,如果有广告,不用理会,关掉就可以了,如 ...
- 图像缩放_OpenCv
图像缩放是一种比较简单的图像处理操作,这里给出opencv中的代码, opencv的版本C语言接口 int resize_c() { const char *pstrImageName = " ...
- sar命令的使用
http://blog.csdn.net/wudiyi815/article/details/7494847 http://blog.csdn.net/colin_liu2009/article/de ...
- 《DSP using MATLAB》示例Example5.14
代码: x1 = [1,2,2]; x2 = [1,2,3,4]; y = circonvt(x1,x2,4) n1 = 0:1:length(x1)-1; n2 = 0:1:length(x2)-1 ...
- AMR 转mp3 失败
private void changeToMp3(String sourcePath) { File source = new File(sourcePath); String mp3TargetPa ...