[驱动] 一个简单内核驱动,通过qemu调试(1)
模块
通过在HOST上修改linux kernel源代码,重新编译一个vmlinux,然后,通过qemu根据这个bzImage 启动一个vm,进行调试
#cat drivers/char/test.c
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/sysfs.h>
#include <linux/init.h>
#include <linux/proc_fs.h>
#include <linux/seq_file.h>
#include <linux/mm_types.h>
#define DRIVER_VERSION "1.0.0"
#define DRIVER_AUTHOR "Ahao Mu"
#define DRIVER_DESC "TEST_MODULE"
static struct proc_dir_entry *pde = NULL;
static int test_open(struct inode *inode, struct file *file)
{
pr_info("%s (%s) test_open\n", DRIVER_DESC, DRIVER_VERSION);
return 0;
}
static ssize_t test_read(struct file *file, char __user *buf, size_t length, loff_t *ppos)
{
pr_info("%s (%s) test_read\n", DRIVER_DESC, DRIVER_VERSION);
struct vm_area_struct *vma;
struct dentry *dentry;
for (vma = current->mm->mmap; vma; vma = vma->vm_next) {
dentry = (vma->vm_file && vma->vm_file->f_path.dentry ?
vma->vm_file->f_path.dentry: NULL);
pr_info("[%016x - %016x] [%016x %016x] [%s]\n",
vma->vm_start, vma->vm_end,
vma->vm_page_prot.pgprot,
vma->vm_flags,
dentry ? (char *)dentry->d_name.name : "");
}
return 0;
}
static int test_release(struct inode *inode, struct file *file)
{
pr_info("%s (%s) test_release", DRIVER_DESC, DRIVER_VERSION);
return 0;
}
static loff_t test_lseek(struct file *file, loff_t loff, int a)
{
pr_info("%s (%s) test_release", DRIVER_DESC, DRIVER_VERSION);
return loff;
}
static const struct file_operations test_proc_fops = {
.owner = THIS_MODULE,
.open = test_open,
.read = test_read,
.llseek = test_lseek,
.release = test_release,
};
static int __init test_init(void)
{
pr_info("%s (%s) loaded", DRIVER_DESC, DRIVER_VERSION);
pde = proc_create("test", 0, NULL, &test_proc_fops);
if (!pde) {
pr_warn("%s: Unable to create /proc/test\n", __func__);
return -ENOMEM;
}
return 0;
}
static void __exit test_exit(void)
{
pr_info("%s (%s) unload", DRIVER_DESC, DRIVER_VERSION);
}
module_init(test_init);
module_exit(test_exit);
MODULE_VERSION(DRIVER_VERSION);
MODULE_LICENSE("GPL V2");
MODULE_AUTHOR(DRIVER_AUTHOR);
MODULE_DESCRIPTION(DRIVER_DESC);
#vim drivers/char/Makefile
obj-y += test.o
调试
从HOST上对GUEST(vm) 启动的kernel进行调试
#gdb vmlinux
#(gdb) target remote localhost:1234
#(gdb) b drivers/char/test.c:test_read
Breakpoint 1 at 0xffffffff8151cac0: file drivers/char/test.c, line 22.
(gdb)
(gdb) info b
Num Type Disp Enb Address What
1 breakpoint keep y 0xffffffff8151cac0 in test_read at drivers/char/test.c:22
(gdb)
(gdb) c
Continuing.
[Switching to Thread 1.2]
Thread 2 hit Breakpoint 1, test_read (file=0xffff880468ba4300, buf=0xffff8804688b3000 "", length=4096, ppos=0xffffc90001ddbc90) at drivers/char/test.c:22
22 {
(gdb)
[驱动] 一个简单内核驱动,通过qemu调试(1)的更多相关文章
- 用.netcore写一个简单redis驱动,调试windows版本的redis.平且给set和get命令添加参数.
1. 下载windows版本的redis 2.开发环境vs2017 新建一个 .net core控制台. private static Socket socket = new Socket(Addr ...
- mini2440驱动奇谭——ADC驱动与測试(动态挂载驱动)
博客:http://blog.csdn.net/muyang_ren 实现功能:开发板动态载入adc驱动模块并能通过測试程序 系统:Ubuntu 14.04 驱动交叉编译内核:linux-2. ...
- 实验作业:使gdb跟踪分析一个系统调用内核函数
实验作业:使gdb跟踪分析一个系统调用内核函数(我使用的是getuid) 20135313吴子怡.北京电子科技学院 [第一部分] 根据视频演示的步骤,先做第一部分,步骤如下 ①更新menu代码到最新版 ...
- 【驱动】linux设备驱动·字符设备驱动开发
Preface 前面对linux设备驱动的相应知识点进行了总结,现在进入实践阶段! <linux设备驱动入门篇>:http://infohacker.blog.51cto.com/6751 ...
- 将一个对象相同的属性(不区分大小写)赋值给一个新对象 DataTable的一个简单的扩展
将一个对象相同的属性(不区分大小写)赋值给一个新对象 1 public static T Mapper<S, T>(S source) 2 { 3 T t = Activator.Cr ...
- 反汇编调试内核驱动 Oops提示【转】
以下部分内容转自:https://blog.csdn.net/jiatingqiang/article/details/7481497 反汇编调试内核驱动 arm-none-linux-gnueabi ...
- linux设备驱动第三篇:如何实现一个简单的字符设备驱动
在linux设备驱动第一篇:设备驱动程序简介中简单介绍了字符驱动,本篇简单介绍如何写一个简单的字符设备驱动.本篇借鉴LDD中的源码,实现一个与硬件设备无关的字符设备驱动,仅仅操作从内核中分配的一些内存 ...
- linux设备驱动第三篇:如何写一个简单的字符设备驱动?
在linux设备驱动第一篇:设备驱动程序简介中简单介绍了字符驱动,本篇简单介绍如何写一个简单的字符设备驱动.本篇借鉴LDD中的源码,实现一个与硬件设备无关的字符设备驱动,仅仅操作从内核中分配的一些内存 ...
- linux设备驱动第三篇:写一个简单的字符设备驱动
在linux设备驱动第一篇:设备驱动程序简介中简单介绍了字符驱动,本篇简单介绍如何写一个简单的字符设备驱动.本篇借鉴LDD中的源码,实现一个与硬件设备无关的字符设备驱动,仅仅操作从内核中分 ...
随机推荐
- Watir: 右键点击实例(某些如果应用AutoIt来做会更加简单高效)
require 'watir' module Watir class Element def top_edge assert_exists assert_enabled ole_object.getB ...
- 我的JSP中文编码解决方案
虽然以前就知道编码问题,但是一直没有遇到问题,以前用asp.net和php的时候,感觉很自然地写程序,没怎么特别处理编码问题,这回改用java写,真心被恶心到了. 进行了一番查阅学习后,终于搞明白了一 ...
- Chrome应用商店打不开解决方法
方法一.谷歌访问助手(推荐) 谷歌访问助手是一款免费的谷歌代理插件,不用配置即可打开Chrome应用商店,而且速度很不错. 1.根据自己使用的浏览器点击对应版本的插件.详细安装都在下面链接中. 下载地 ...
- 洛谷P2572 [SCOI2010]序列操作(珂朵莉树)
传送门 珂朵莉树是个吼东西啊 这题线段树代码4k起步……珂朵莉树只要2k…… 虽然因为这题数据不随机所以珂朵莉树的复杂度实际上是错的…… 然而能过就行对不对…… (不过要是到时候noip我还真不敢打… ...
- input type="file"文件上传到后台读取
html页面(表单采用bootStrap) js部分: //更换头像时把上传的图片post方式到控制器 <script type="text/javascript"> ...
- Luogu P1462 通往奥格瑞玛的道路【二分/最短路】
题目背景 在艾泽拉斯大陆上有一位名叫歪嘴哦的神奇术士,他是部落的中坚力量 有一天他醒来后发现自己居然到了联盟的主城暴风城 在被众多联盟的士兵攻击后,他决定逃回自己的家乡奥格瑞玛 题目描述 在艾泽拉斯, ...
- 利用OneDNS同步chrome数据
将DNS服务器改成OneDNS的 117.50.11.11 备用改为 117.50.22.22 然后刷新自己的DNS缓存,接着测试一下https://test.onedns.net即可 这样既可以正常 ...
- flask框架学习
第一:flask框架基础入门 第二:flask框架框架概述 第三:flask框架请求数据 第四:flask框架路由系统 第五:flask框架静态文件 第六:flask框架模板引擎 第七:flask其他 ...
- ACM_折线中点
折线中点 Time Limit: 2000/1000ms (Java/Others) Problem Description: 给定平面上N个点P1, P2, ... PN,将他们按顺序连起来,形成一 ...
- sdut1282Find the Path (floyd变形)
http://acm.sdut.edu.cn/sdutoj/problem.php?action=showproblem&problemid=1282 感觉这题就比较有意思了 ,虽说是看了别人 ...