[驱动] 一个简单内核驱动,通过qemu调试(1)

[驱动] 一个简单内核驱动,通过qemu调试(1),第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. 模块

通过在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_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_VERSION);    return 0;}static loff_t test_lseek(struct file *file,loff_t loff,int a){    pr_info("%s (%s) test_release",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_VERSION);    pde = proc_create("test",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_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/Makefileobj-y               += test.o
调试

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

#gdb vmlinux#(gdb) target remote localhost:1234#(gdb) b drivers/char/test.c:test_readBreakpoint 1 at 0xffffffff8151cac0: file drivers/char/test.c,line 22.(gdb)(gdb) info bNum     Type           disp Enb Address            What1       breakpoint     keep y   0xffffffff8151cac0 in test_read at drivers/char/test.c:22(gdb)(gdb) cContinuing.[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:2222  {(gdb)
总结

以上是内存溢出为你收集整理的[驱动] 一个简单内核驱动,通过qemu调试(1)全部内容,希望文章能够帮你解决[驱动] 一个简单内核驱动,通过qemu调试(1)所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址:https://www.54852.com/yw/1031800.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-05-24
下一篇2022-05-24

发表评论

登录后才能评论

评论列表(0条)

    保存