模块

通过在HOST上修改linux kernel源代码,重新编译一个vmlinux,然后,通过qemu根据这个bzImage 启动一个vm,进行调试

  1. #cat drivers/char/test.c
  2. #include <linux/kernel.h>
  3. #include <linux/module.h>
  4. #include <linux/sysfs.h>
  5. #include <linux/init.h>
  6. #include <linux/proc_fs.h>
  7. #include <linux/seq_file.h>
  8. #include <linux/mm_types.h>
  9. #define DRIVER_VERSION "1.0.0"
  10. #define DRIVER_AUTHOR "Ahao Mu"
  11. #define DRIVER_DESC "TEST_MODULE"
  12. static struct proc_dir_entry *pde = NULL;
  13. static int test_open(struct inode *inode, struct file *file)
  14. {
  15. pr_info("%s (%s) test_open\n", DRIVER_DESC, DRIVER_VERSION);
  16. return 0;
  17. }
  18. static ssize_t test_read(struct file *file, char __user *buf, size_t length, loff_t *ppos)
  19. {
  20. pr_info("%s (%s) test_read\n", DRIVER_DESC, DRIVER_VERSION);
  21. struct vm_area_struct *vma;
  22. struct dentry *dentry;
  23. for (vma = current->mm->mmap; vma; vma = vma->vm_next) {
  24. dentry = (vma->vm_file && vma->vm_file->f_path.dentry ?
  25. vma->vm_file->f_path.dentry: NULL);
  26. pr_info("[%016x - %016x] [%016x %016x] [%s]\n",
  27. vma->vm_start, vma->vm_end,
  28. vma->vm_page_prot.pgprot,
  29. vma->vm_flags,
  30. dentry ? (char *)dentry->d_name.name : "");
  31. }
  32. return 0;
  33. }
  34. static int test_release(struct inode *inode, struct file *file)
  35. {
  36. pr_info("%s (%s) test_release", DRIVER_DESC, DRIVER_VERSION);
  37. return 0;
  38. }
  39. static loff_t test_lseek(struct file *file, loff_t loff, int a)
  40. {
  41. pr_info("%s (%s) test_release", DRIVER_DESC, DRIVER_VERSION);
  42. return loff;
  43. }
  44. static const struct file_operations test_proc_fops = {
  45. .owner = THIS_MODULE,
  46. .open = test_open,
  47. .read = test_read,
  48. .llseek = test_lseek,
  49. .release = test_release,
  50. };
  51. static int __init test_init(void)
  52. {
  53. pr_info("%s (%s) loaded", DRIVER_DESC, DRIVER_VERSION);
  54. pde = proc_create("test", 0, NULL, &test_proc_fops);
  55. if (!pde) {
  56. pr_warn("%s: Unable to create /proc/test\n", __func__);
  57. return -ENOMEM;
  58. }
  59. return 0;
  60. }
  61. static void __exit test_exit(void)
  62. {
  63. pr_info("%s (%s) unload", DRIVER_DESC, DRIVER_VERSION);
  64. }
  65. module_init(test_init);
  66. module_exit(test_exit);
  67. MODULE_VERSION(DRIVER_VERSION);
  68. MODULE_LICENSE("GPL V2");
  69. MODULE_AUTHOR(DRIVER_AUTHOR);
  70. MODULE_DESCRIPTION(DRIVER_DESC);
  1. #vim drivers/char/Makefile
  2. obj-y += test.o

调试

从HOST上对GUEST(vm) 启动的kernel进行调试

  1. #gdb vmlinux
  2. #(gdb) target remote localhost:1234
  3. #(gdb) b drivers/char/test.c:test_read
  4. Breakpoint 1 at 0xffffffff8151cac0: file drivers/char/test.c, line 22.
  5. (gdb)
  6. (gdb) info b
  7. Num Type Disp Enb Address What
  8. 1 breakpoint keep y 0xffffffff8151cac0 in test_read at drivers/char/test.c:22
  9. (gdb)
  10. (gdb) c
  11. Continuing.
  12. [Switching to Thread 1.2]
  13. Thread 2 hit Breakpoint 1, test_read (file=0xffff880468ba4300, buf=0xffff8804688b3000 "", length=4096, ppos=0xffffc90001ddbc90) at drivers/char/test.c:22
  14. 22 {
  15. (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. BZOJ_1415_[Noi2005]聪聪和可可_概率DP+bfs

    BZOJ_1415_[Noi2005]聪聪和可可_概率DP+bfs Description Input 数据的第1行为两个整数N和E,以空格分隔,分别表示森林中的景点数和连接相邻景点的路的条数. 第2 ...

  2. Robotframework之Run Keyword And Return Status和Run Keyword

    今天在android项目中遇到一个问题,场景达人每天第一次接单时,会弹出提示框:每日完成订单配送后将扣取1元保险费,是否确认接单?,点击确定后,才能接单成功,并且只有每天第一次接单才会弹出 如下图 此 ...

  3. hdu5521 ( Dijkstra )

    题目描述: 给定一张图,问从1和n相遇的最短时间. 这道题的输入比较特殊,不能直接存,所以怎么输入,怎么存取,只要可以访问到一个节点的相邻节点就可以,由于spfa算法的时间复杂度为m*n,而Dijks ...

  4. UI:数据的解析

    在懒加载的时候要注意事项: 必须使用 self.XX 的样式去开辟空间,不能使用 _XX 的格式去开辟,因为前者是内部的 set 方法,而后者并不走内部的 set 方法. json 文件的创建  xm ...

  5. windows server 2003 修改远程链接端口

    服务器默认的远程链接的端口是3389,只能内网访问,外网不能访问,现映射了8400端口给服务器,内外网都可以访问,因此需要修改服务器的远程链接的端口. 运行中 输入:regedit 选择十进制,将33 ...

  6. linux中的C里面使用pthread_mutex_t锁(转载)

    转自:http://blog.csdn.net/w397090770/article/details/7264315 linux下为了多线程同步,通常用到锁的概念. posix下抽象了一个锁类型的结构 ...

  7. Ocelot(一)- .Net Core开源网关

    Ocelot - .Net Core开源网关 作者:markjiang7m2 原文地址:https://www.cnblogs.com/markjiang7m2/p/10857688.html 源码地 ...

  8. zabbix离线安装

    LAMP环境 1.apache安装 #安装包(yum install --downloadonly --downloaddir=/opt/apache httpd httpd-devel) 1.1拷贝 ...

  9. 《Windows核心编程系列》九谈谈同步设备IO与异步设备IO之同步设备IO

    同步设备IO 所谓同步IO是指线程在发起IO请求后会被挂起,IO完成后继续执行. 异步IO是指:线程发起IO请求后并不会挂起而是继续执行.IO完毕后会得到设备的通知.而IO完成端口就是实现这种通知的很 ...

  10. 转】Cassandra单集群实验2个节点

    原博文出自于: http://blog.fens.me/category/%E6%95%B0%E6%8D%AE%E5%BA%93/page/3/ 感谢! Cassandra单集群实验2个节点 前言 A ...