兰州网站建设模板云南网官网

diannao/2026/1/19 14:18:48/文章来源:
兰州网站建设模板,云南网官网,wordpress国内访问,玉溪的网站建设公司一、背景 qemu单步调试arm64 linux kernel-CSDN博客介绍了如何单步调试kernel#xff0c; 但是我们经常写一些测试driver, driver的部分如何调试#xff1f; 二、环境准备 调试driver 就需要准备一个简单的driver#xff0c; 这里用最简单的hello world来演示如何调试 但是我们经常写一些测试driver, driver的部分如何调试 二、环境准备 调试driver 就需要准备一个简单的driver 这里用最简单的hello world来演示如何调试程序非常简单生成一个字符设备并且在cat的时候打印变量还加了一个全局变量用来gdb调试查看变量使用 #include linux/module.h /* Needed by all modules */ #include linux/kernel.h /* Needed for KERN_INFO */ #include linux/init.h /* Needed for the macros */ #include linux/miscdevice.h /* Needed for misc device */int global_hello_value 996;#define DEVICE_NAME Helloworldvoid test_for_debug(void) { printk(KERN_INFO just for debug the text section %d, global_hello_value); }static int hello_open(struct inode *inode, struct file *file){test_for_debug();return 0; }static struct file_operations hello_fops { .owner THIS_MODULE,.open hello_open, };static struct miscdevice hello_misc { .minor MISC_DYNAMIC_MINOR,.name Helloworld,.fops hello_fops, };static int __init hello_start(void) {int ret;ret misc_register(hello_misc);if (ret 0) {printk(KERN_EMERG %s register failed %d.\n, DEVICE_NAME, ret);return ret;} printk(KERN_INFO Hello world\n); return 0; }static void __exit hello_end(void) { test_for_debug();misc_deregister(hello_misc);printk(KERN_INFO hello_end Goodbye\n); } MODULE_LICENSE(GPL); MODULE_AUTHOR(geek); MODULE_DESCRIPTION(A simple Hello world misc driver!); MODULE_VERSION(0.1);module_init(hello_start); module_exit(hello_end); 编译ko需要使用 make modules指令 make ARCHarm64 CROSS_COMPILEaarch64-none-linux-gnu- modules -j8 编译完成后会在hello driver的源码目录生成对应的ko文件; 将ko 放在我们的rootfs 中参考前一篇 无人知晓qemu搭建arm64 linux kernel调试环境 rootfs image制作部分挂载rootfs.img, 拷贝ko, 然后umount img sudo mount rootfs.img rootfs sudo mkdir rootfs/driver sudo cp ../hello_driver.ko rootfs/driver/ sudo umount rootfs 三、加载ko insmod 加载打印hello world, 同时生成/dev/Helloworld节点 ~ # insmod driver/hello_driver.ko [ 11.203785] Hello world ~ # cd /dev/ /dev # ls Helloworld ptypc tty36 ttyp0 gdb 连接后尝试看下之前ko的global_hello_value变量无法显示test_for_debug函数也是无法找到的 (gdb) p global_hello_value No symbol global_hello_value in current context. (gdb) b test_for_debug Function test_for_debug not defined. Make breakpoint pending on future shared library load? (y or [n]) n 四、调试ko 调试ko的步骤也是分三步先加载ko, 确认ko加载的地址然后加载ko symbols,加载地址需要和实际加载一致 ; 最后一步就是加断点然后启动调试即可 方法1 insmod ko之后根据节点/sys/module/XXXX/sections/ 确认ko 加载的地址 /driver # cat /sys/module/hello_driver/sections/.text 0xffff80007a860000 加载ko symbols gdb 中执行 (gdb) add-symbol-file drivers/my_driver/hello_driver.ko -s .text 0xffff80007a860000 add symbol table from file drivers/my_driver/hello_driver.ko at.text_addr 0xffff80007a860000 (y or n) y Reading symbols from drivers/my_driver/hello_driver.ko... 然后再设置断点 (gdb) b test_for_debug Breakpoint 1 at 0x4: test_for_debug. (3 locations) (gdb) c Continuing. continue 后 qemu中cat节点即可触发中断 /dev # cat Helloworld gdb窗口 (gdb) bt #0 0xffff80007a860004 in test_for_debug () at drivers/my_driver/hello_driver.c:12 #1 hello_open (inode0xffff000002f11610, file0xffff00000381bb00) at drivers/my_driver/hello_driver.c:16 #2 0xffff8000808623d8 in misc_open (inode0xffff000002f11610, file0xffff00000381bb00) at drivers/char/misc.c:165 #3 0xffff8000802c8250 in chrdev_open (inode0xffff000002f11610, filp0xffff00000381bb00) at fs/char_dev.c:414 #4 0xffff8000802bcfcc in do_dentry_open (f0xffff00000381bb00, inode0xffff000002f11610, open0xffff8000802c8194 chrdev_open) at fs/open.c:929 #5 0xffff8000802beda0 in vfs_open (path0x2 hello_end2, file0xffff000002f11610) at fs/open.c:1063 #6 0xffff8000802d6350 in do_open (opoptimized out, fileoptimized out, ndoptimized out) at fs/namei.c:3640 #7 path_openat (nd0xffff800082adbc40, op0x4 hello_end4, flags2055602176) at fs/namei.c:3797 #8 0xffff8000802d706c in do_filp_open (dfd-100, pathname0xffff000002e40000, op0xffff800082adbd74) at fs/namei.c:3824 #9 0xffff8000802bf048 in do_sys_openat2 (dfd-100, filename0x646c error: Cannot access memory at address 0x646c, how0x3 hello_end3) at fs/open.c:1422 #10 0xffff8000802bf388 in do_sys_open (modeoptimized out, flagsoptimized out, filenameoptimized out, dfdoptimized out) at fs/open.c:1437 #11 __do_sys_openat (modeoptimized out, flagsoptimized out, filenameoptimized out, dfdoptimized out) at fs/open.c:1453 #12 __se_sys_openat (modeoptimized out, flagsoptimized out, filenameoptimized out, dfdoptimized out) at fs/open.c:1448 #13 __arm64_sys_openat (regs0xffff80007a860000 hello_open) at fs/open.c:1448 #14 0xffff800080027738 in __invoke_syscall (syscall_fnoptimized out, regsoptimized out) at arch/arm64/kernel/syscall.c:37 #15 invoke_syscall (regs0xffff800082adbeb0, scno58833664, sc_nr2055602176, syscall_table0x2 hello_end2) at arch/arm64/kernel/syscall.c:51 #16 0xffff800080027840 in el0_svc_common (regs0xffff800082adbeb0, scno1, syscall_table0x2 hello_end2, sc_nroptimized out) at arch/arm64/kernel/syscall.c:136 #17 0xffff8000800278fc in do_el0_svc (regs0xffff000002f11610) at arch/arm64/kernel/syscall.c:155 #18 0xffff800081016224 in el0_svc (regs0xffff800082adbeb0) at arch/arm64/kernel/entry-common.c:678 #19 0xffff800081016688 in el0t_64_sync_handler (regs0xffff80007a860000 hello_open) at arch/arm64/kernel/entry-common.c:696 #20 0xffff800080011d4c in el0t_64_sync () at arch/arm64/kernel/entry.S:59 但是还有一个问题查看global_hello_value怎么失败了 (gdb) p global_hello_value Cannot access memory at address 0x288 这是因为前面我加载symbols时没有指定.data段只指定了.text段 退出gdb重新修改ko 加载symbols 指令为.text, .data 等段信息均在/sys/module/hello_driver/sections/ 下 (gdb) add-symbol-file drivers/my_driver/hello_driver.ko -s .text 0xffff80007a860000 -s .data 0xffff80007a862000 add symbol table from file drivers/my_driver/hello_driver.ko at.text_addr 0xffff80007a860000.data_addr 0xffff80007a862000 (y or n) y Reading symbols from drivers/my_driver/hello_driver.ko... (gdb) p global_hello_value $1 996 方法2增加断点在load_module中停住这样可以debug 初始化的部分比如module_init中的函数如果我们驱动在这里有bug,根本没机会生成/sys/module下的driver 段信息 ko加载的可以参考这篇 linux ko模块动态加载源码分析 核心就是在do_init_module 设置断点然后从结构体struct module 提取module加载信息 注意module_init函数在 .init.text 段add-symbol-file 需要加入这个 .init.text 才能在module init设置断点 (gdb)b do_init_module 设置好断点后继续然后加载ko,触发断点后将struct module的段信息及地址信息用gdb 显示出来 (gdb) n 2523 freeinit-init_text mod-mem[MOD_INIT_TEXT].base; (gdb) p *mod-sect_attrs-attrs20 在hello_start 设置断点 (gdb) add-symbol-file drivers/my_driver/hello_driver.ko -s .text 18446603338276798464 -s .init.text 18446603338276823040 -s .data 18446603338276806656 add symbol table from file drivers/my_driver/hello_driver.ko at.text_addr 0xffff80007a860000.init.text_addr 0xffff80007a866000.data_addr 0xffff80007a862000 (y or n) y Reading symbols from drivers/my_driver/hello_driver.ko...(gdb) b hello_start Breakpoint 2 at 0xffff80007a866000: file drivers/my_driver/hello_driver.c, line 34.Thread 2 hit Breakpoint 2, hello_start () at drivers/my_driver/hello_driver.c:34 warning: Source file is more recent than executable. 34 ret misc_register(hello_misc); (gdb) bt #0 hello_start () at drivers/my_driver/hello_driver.c:34 #1 0xffff800080014dbc in do_one_initcall (fn0xffff80007a866000 hello_start) at init/main.c:1232 #2 0xffff800080120d20 in do_init_module (mod0xffff80007a862180) at kernel/module/main.c:2530 #3 0xffff800080122dfc in load_module (info0xffff800082af3ac8, uargs0xffff0000035e9d80 \004, flags0) at kernel/module/main.c:2981 #4 0xffff800080123020 in __do_sys_init_module (umod0x23756d60, len38752, uargs0x5bdf21 ) at kernel/module/main.c:3058 #5 0xffff800080123140 in __se_sys_init_module (uargsoptimized out, lenoptimized out, umodoptimized out) at kernel/module/main.c:3038 #6 __arm64_sys_init_module (regs0x0 hello_end) at kernel/module/main.c:3038 #7 0xffff800080027738 in __invoke_syscall (syscall_fnoptimized out, regsoptimized out) at arch/arm64/kernel/syscall.c:37 #8 invoke_syscall (regs0xffff800082af3eb0, scno56532352, sc_nr0, syscall_table0x0 hello_end) at arch/arm64/kernel/syscall.c:51 #9 0xffff800080027840 in el0_svc_common (regs0xffff800082af3eb0, scno-48, syscall_table0x0 hello_end, sc_nroptimized out) at arch/arm64/kernel/syscall.c:136 #10 0xffff8000800278fc in do_el0_svc (regs0x0 hello_end) at arch/arm64/kernel/syscall.c:155 #11 0xffff800081016224 in el0_svc (regs0xffff800082af3eb0) at arch/arm64/kernel/entry-common.c:678 #12 0xffff800081016688 in el0t_64_sync_handler (regs0x0 hello_end) at arch/arm64/kernel/entry-common.c:696 #13 0xffff800080011d4c in el0t_64_sync () at arch/arm64/kernel/entry.S:595 Backtrace stopped: previous frame identical to this frame (corrupt stack?) 方法3利用vmlinux-gdb.py脚本中的lx-symbols辅助命令 利用gdb脚本加载 也是三步先构建gdb script环境; 去掉gdb 脚本执行限制 ; 调用lx-symbols获取ko加载地址当让script中除了获取lx-symbols外还有很多其他脚本辅助我们调试; 参考https://www.codenong.com/cs105354913/ 构建脚本环境 make ARCHarm64 CROSS_COMPILEaarch64-none-linux-gnu- scripts_gdb 根目录生成vmlinux-gdb.py表示成功 去掉gdb脚本加载限制在~/.config/gdb/gdbinit 中添加set auto-load safe-path / 环境变量 此时在linux source加载vmlinux也会提示这个限制错误及解决方法 添加环境变量后重新启动gdb出现了加载vmlinux-gdb.py脚本的错误 上面的报错原因是因为编译kernel版本中打开了config CONFIG_DEBUG_INFO_REDUCED, 这个会影响gdb script的完整功能在arch/arm64/ configs/defconfig中去掉这个config,重新编辑后加载vmlinux 编译kernel之后记得还需要重新生成下脚本 make ARCHarm64 CROSS_COMPILEaarch64-none-linux-gnu- scripts_gdb (gdb) lx-symbols loading vmlinux scanning for modules in /home/geek/workspace/linux/linux-6.6.1 loading 0xffff80007a860000: /home/geek/workspace/linux/linux-6.6.1/drivers/my_driver/hello_driver.ko 这个指令会自动加载ko symbols, 直接加断点即可调试免去了前面通过 add-symbol-file 设置ko section的繁琐步骤但是如果你是调试驱动 init的部分还是得使用上面的方法2 方法3虽然配置有些麻烦但是vmlinux-gdb.py 提供了非常多的调试功能 apropos lx 可以查看这些调试功能能帮助我们提升调试的效率 (gdb) apropos lx function lx_clk_core_lookup -- Find struct clk_core by name function lx_current -- Return current task. function lx_dentry_name -- Return string of the full path of a dentry. function lx_device_find_by_bus_name -- Find struct device by bus and name (both strings) function lx_device_find_by_class_name -- Find struct device by class and name (both strings) function lx_i_dentry -- Return dentry pointer for inode. function lx_module -- Find module by name and return the module variable. function lx_per_cpu -- Return per-cpu variable. function lx_radix_tree_lookup -- Lookup and return a node from a RadixTree. function lx_rb_first -- Lookup and return a node from an RBTree function lx_rb_last -- Lookup and return a node from an RBTree. function lx_rb_next -- Lookup and return a node from an RBTree. function lx_rb_prev -- Lookup and return a node from an RBTree. function lx_task_by_pid -- Find Linux task by PID and return the task_struct variable. function lx_thread_info -- Calculate Linux thread_info from task variable. function lx_thread_info_by_pid -- Calculate Linux thread_info from task variable found by pid lx-clk-summary -- Print clk tree summary lx-cmdline -- Report the Linux Commandline used in the current kernel. lx-configdump -- Output kernel config to the filename specified as the command lx-cpus -- List CPU status arrays lx-device-list-bus -- Print devices on a bus (or all buses if not specified) lx-device-list-class -- Print devices in a class (or all classes if not specified) lx-device-list-tree -- Print a device and its children recursively lx-dmesg -- Print Linux kernel log buffer. lx-dump-page-owner -- Dump page owner lx-fdtdump -- Output Flattened Device Tree header and dump FDT blob to the filename lx-genpd-summary -- Print genpd summary lx-getmod-by-textaddr -- Look up loaded kernel module by text address. lx-interruptlist -- Print /proc/interrupts lx-iomem -- Identify the IO memory resource locations defined by the kernel lx-ioports -- Identify the IO port resource locations defined by the kernel lx-list-check -- Verify a list consistency lx-lsmod -- List currently loaded modules. lx-mounts -- Report the VFS mounts of the current process namespace. lx-page_address -- struct page to linear mapping address lx-page_to_pfn -- struct page to PFN lx-page_to_phys -- struct page to physical address lx-pfn_to_kaddr -- PFN to kernel address lx-pfn_to_page -- PFN to struct page lx-ps -- Dump Linux tasks. lx-slabinfo -- Show slabinfo lx-slabtrace -- Show specific cache slabtrace lx-sym_to_pfn -- symbol address to PFN lx-symbols -- (Re-)load symbols of Linux kernel and currently loaded modules. lx-timerlist -- Print /proc/timer_list lx-version -- Report the Linux Version of the current kernel. lx-virt_to_page -- virtual address to struct page lx-virt_to_phys -- virtual address to physical address lx-vmallocinfo -- Show vmallocinfo 比如我想要查看所有task的信息执行lx-ps即可如果要看task_struct的详细信息将显示的地址转换成struct task_struct *指针即可显示 比如查看一个进程的进程名 (gdb) p ((struct task_struct*)0xffff000002d68ec0)-comm $6 watchdogd\000\000\000\000\000\000

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/90321.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何知道一个网站是谁做的wordpress 搭网站

什么是metadata表 Metadata表即Hudi元数据表,是一种特殊的Hudi表,对用户隐藏。该表用于存放普通Hudi表的元数据信息。Metadata表包含在普通Hudi表内部,与Hudi表是一一对应关系。 元数据表的作用 ApacheHudi元数据表可以显著提高查询的读/写性能。元数据表的主要目的是消…

东莞万江网站制作台州网站搜索优化

优先级类型 React内部对于优先级的管理,贯穿运作流程的4个阶段(从输入到输出),根据其功能的不同,可以分为3种类型: 1 )fiber优先级(LanePriority) 位于 react-reconciler包,也就是L…

免费做图片的网站有哪些网站建设风格

原文在简书首发:http://www.jianshu.com/p/badf412db4e7lua-cmsgpack是一个开源的MessagePack实现方式、纯C的库,没有任何其它依赖,编译后可以直接被lua调用,目前主要支持Lua5.1/5.2/5.3 版本。1、什么是MessagePack?-…

高端网站定制站广西网站建设渠道

目录 一、前言 二、代码 一、前言 有些时候我们需要开启或暂停一些服务,比如说开启Apach或暂停MySQL服务等,最近工作中也开发了这方面的功能,记录下来怎样使用PHP语言来开启或暂停Apache、MySQL服务的运行状态。 这种方法也适用其他服务。…

淘客网站备案wordpress能开发商城网站吗

1. 元件基本介绍 2. 基础元件的使用 3. 表单型元件的使用 4. 菜单与表格元件的使用 使用:如果想使用某个元件,我们只需要将它从元件库中拖入画布摆放即可。 - 对齐:默认情况下,两个矩形元件并排摆放,中间的边框为两…

ps制作网站背景邹城网站定制

一个三电源切换电路 电路描述 1、Q1、Q2为NMOS,Q3、Q4和Q5为PMOS管,D1为二极管。 2、BAT1和BAT2为电池,BAT2的容量比BAT1大,VIN_5V为外部电源,VOUT为输出,给系统供电。 3、VOUT会从优先级高的电源取电&a…

重庆专业企业建设网站网络营销方案范文3篇

原文链接&#xff1a;https://blazor-university.com/components/capturing-unexpected-parameters/捕获意外参数源代码[1]之前我们已经看到了如何使用特定名称声明参数和级联参数。例如&#xff0c;一个将 <img> 元素包装在一些自定义 HTML 中的自定义组件。<div cla…

企业官方网站如何做蓝v认证上海住房和城乡建设局网站

111转载于:https://www.cnblogs.com/zoeeying/p/10139131.html

自助建站的一般流程西安旅游攻略必去景点

宝塔一键修改mysql数据库存放路径&#xff0c;更改默认数据目录脚本&#xff01;该shell脚本仅限于宝塔bt.cn linux面板使用&#xff0c;希望对有需要的朋友有所帮助&#xff0c;如有问题请留言&#xff01;主要参数功能:1.默认修改数据库存放路径sh mysql_Transfer.sh2.还原数…

郑州做网站外包的公司十堰吧

在 Linux 中开启 Flask 项目持续运行 在部署 Flask 项目时&#xff0c;情况往往并不是那么理想。默认情况下&#xff0c;关闭 SSH 终端后&#xff0c;Flask 服务就停止了。这时&#xff0c;您需要找到一种方法在 Linux 服务器上实现持续运行 Flask 项目&#xff0c;并在服务器…

网站编排百度热度榜搜索趋势

在 CMake 中&#xff0c;target_include_directories 命令用于向特定目标&#xff08;如可执行文件或库&#xff09;添加包含目录&#xff0c;以便编译器能够找到特定目标所需的头文件。 基本语法 target_include_directories(target_name[SYSTEM] [BEFORE]directory1[direct…

珠海做网站公司有哪些wordpress 删除demo

一、前言 上周工作遇到了一个需求&#xff0c;同步多个省份销号数据&#xff0c;解绑微信粉丝。分省定时将销号数据放到SFTP服务器上&#xff0c;我需要开发定时任务去解析文件。因为是多省份&#xff0c;服务器、文件名规则、数据规则都不一定&#xff0c;所以要做成可配置是有…

天梭手表官方网站word怎么做网页

schoolcms // 版本信息 const THINK_VERSION 3.2.3; ThinkPHP3.2完全开发手册 http://document.thinkphp.cn/manual_3_2.html

做网站需要绑定电脑ip吗中信建设四川分公司招聘

一、缩短访问路径 1、如图访问该文件路径 没有缩短之前&#xff0c;访问的路径是 http://localhost/zerg_new/public/index.php/api/v1/banner/1 缩短后&#xff0c;访问的路径是 http://z_new.cn/api/v1/banner/1 2、缩短路径步骤 本机apache配置&#xff0c;小编使用的…

邢台网站制作哪里有建设完网站成功后需要注意什么

锯齿形斜纹组织图&#xff1a; 分析&#xff1a; 前半齿长度k&#xff0c;表示山谷到山峰的列数&#xff0c;也就是锯齿的宽度&#xff1b; 锯齿飞数s&#xff0c;表示山峰到山峰的行数&#xff0c;也就是锯齿的高度。 起始点相差4格&#xff0c;也就是第一部分整体向上移动…

企业网站seo手机南京网站建设与维护

什么叫静态链表&#xff1f;——用顺序表模拟链表&#xff0c;就叫做静态链表 第一列相当于数据域data&#xff0c;第二列相当于指针域next&#xff0c; 第一行&#xff08;0&#xff09;相当于头结点&#xff08;头结点的数据域不放数据&#xff09; &#xff08;a&#xff…

南昌网站建设模板技术公司注册免费

openai用tf实现的真的看不懂&#xff0c;大佬的世界… PPO的详细细节 1. 奖励模型和策略的价值头将 query 和 response 的连接作为输入 奖励模型和策略的价值头 不 仅仅查看响应。相反&#xff0c;它将 query 和 response 连接在一起&#xff0c;作为 query_response def ge…

模板建站可以做优化吗抚顺建设银行网站

正题 题目链接:https://www.luogu.org/problemnew/show/P3100 题目大意 一个空矩阵&#xff0c;每次可以将B∗BB*BB∗B的矩阵覆盖为RRR或者BBB。 求BBB最大是多少使得可以覆盖使得原矩阵成为目标矩阵。 解题思路 我们考虑贪心&#xff0c;先分析一下性质。 假设答案为kkk&…

大型门户网站建设企业佛山微商网站建设

leetcode-剑指offer-321.面试题22-链表中的倒数第k个节点22.面试题24-反转链表23.面试题25-合并两个排序链表-递归24.面试题26-树的子结构25.面试题27-二叉树的镜像26.面试题28-对称二叉树27.面试题29-顺时针打印矩阵28.面试题30-包含min函数的栈29.面试题31-栈的押入&#xff…

如何丰富网站内容金种子酒业网站建设

目录 1 Display Widgets简介 2 如何使用Display Widgets部件 2.1 QLabel组件-显示图像或文本 2.2 QCalendarWidget组件-日历简单的使用 2.3 QLCDNumber组件-控件作时钟的显示 2.4 QProgressBar组件-模拟手机电池充电 2.5 QFrame组件-绘制水平/垂直线 Display Widgets将分…