模块

通过在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)的更多相关文章

  1. 用.netcore写一个简单redis驱动,调试windows版本的redis.平且给set和get命令添加参数.

    1. 下载windows版本的redis 2.开发环境vs2017  新建一个 .net core控制台. private static Socket socket = new Socket(Addr ...

  2. mini2440驱动奇谭——ADC驱动与測试(动态挂载驱动)

    博客:http://blog.csdn.net/muyang_ren 实现功能:开发板动态载入adc驱动模块并能通过測试程序 系统:Ubuntu 14.04     驱动交叉编译内核:linux-2. ...

  3. 实验作业:使gdb跟踪分析一个系统调用内核函数

    实验作业:使gdb跟踪分析一个系统调用内核函数(我使用的是getuid) 20135313吴子怡.北京电子科技学院 [第一部分] 根据视频演示的步骤,先做第一部分,步骤如下 ①更新menu代码到最新版 ...

  4. 【驱动】linux设备驱动·字符设备驱动开发

    Preface 前面对linux设备驱动的相应知识点进行了总结,现在进入实践阶段! <linux设备驱动入门篇>:http://infohacker.blog.51cto.com/6751 ...

  5. 将一个对象相同的属性(不区分大小写)赋值给一个新对象 DataTable的一个简单的扩展

    将一个对象相同的属性(不区分大小写)赋值给一个新对象   1 public static T Mapper<S, T>(S source) 2 { 3 T t = Activator.Cr ...

  6. 反汇编调试内核驱动 Oops提示【转】

    以下部分内容转自:https://blog.csdn.net/jiatingqiang/article/details/7481497 反汇编调试内核驱动 arm-none-linux-gnueabi ...

  7. linux设备驱动第三篇:如何实现一个简单的字符设备驱动

    在linux设备驱动第一篇:设备驱动程序简介中简单介绍了字符驱动,本篇简单介绍如何写一个简单的字符设备驱动.本篇借鉴LDD中的源码,实现一个与硬件设备无关的字符设备驱动,仅仅操作从内核中分配的一些内存 ...

  8. linux设备驱动第三篇:如何写一个简单的字符设备驱动?

    在linux设备驱动第一篇:设备驱动程序简介中简单介绍了字符驱动,本篇简单介绍如何写一个简单的字符设备驱动.本篇借鉴LDD中的源码,实现一个与硬件设备无关的字符设备驱动,仅仅操作从内核中分配的一些内存 ...

  9. linux设备驱动第三篇:写一个简单的字符设备驱动

          在linux设备驱动第一篇:设备驱动程序简介中简单介绍了字符驱动,本篇简单介绍如何写一个简单的字符设备驱动.本篇借鉴LDD中的源码,实现一个与硬件设备无关的字符设备驱动,仅仅操作从内核中分 ...

随机推荐

  1. bzoj4031

    4031: [HEOI2015]小Z的房间 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 823  Solved: 407[Submit][Statu ...

  2. TCP协议中的三次握手和四次挥手(图解)【转载】

    建立TCP需要三次握手才能建立,而断开连接则需要四次握手.整个过程如下图所示: 先来看看如何建立连接的. 首先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资 ...

  3. P4357 [CQOI2016]K远点对(KDTree)

    传送门 又一次产生了KDTree本质就是爆搜的感觉-- 大概就类似于p4169,只不过是从最近点对变成了第\(k\)远点对 我们开一个小根堆,里面放\(k\)个元素,起初全为\(0\),然后每一次都把 ...

  4. js 编码详解

    今天在整理 js编码解码方法时,在网上搜资料,发现一篇文章讲的不错,讲解的非常简单明了,于是乎就想转载过来,却发现无法转载到博客园,最后只能卑鄙的摘抄过来.js编码解码就是将一些对URL和数据库敏感的 ...

  5. python网络爬虫之三re正则表达式模块

    """ re正则表达式,正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的 一些特定字符,及这些特定字符的组合,组成一个"规则字符串",然后用 ...

  6. python爬取网页图片(二)

    从一个网页爬取图片已经解决,现在想要把这个用户发的图片全部爬取. 首先:先找到这个用户的发帖页面: http://www.acfun.cn/u/1094623.aspx#page=1 然后从这个页面中 ...

  7. 递推DP UVA 590 Always on the run

    题目传送门 题意:题意难懂,就是一个小偷在m天内从城市1飞到城市n最小花费,输入的是每个城市飞到其他城市的航班. 分析:dp[i][j] 表示小偷第i天在城市j的最小花费.状态转移方程:dp[i][j ...

  8. 贪心+枚举/哈希表 HDOJ Trouble

    题目传送门 题意:5个集合,每个集合最多200个数字,问是否每个集合挑一个数加起来和为0. 分析:显然n^5的程序果断超时,甚至n^3logn的二分也过不了.想n^3的方法,既然判断有没有,那么可以将 ...

  9. IIS中不让下级应用程序继承主域名的web.config配置

    <location path="." allowOverride="true" inheritInChildApplications="fals ...

  10. 设计模式 -- Abstract Factory 抽象工厂

    1.常规的对象创建方法 //创建一个Road对象 Road road=new Road(); new的问题:实现依赖,不能应对“具体实例化类型”额变化. 解决思想: 封装变化点--哪里变化,封装哪里( ...