当前位置: 首页 > news >正文

哪些网站使用vue做的家在深圳龙华

哪些网站使用vue做的,家在深圳龙华,微信商城小程序官网,wordpress建设下载网站一、背景 大部分qemu调试kernel 都是讲解从start_kernel开始设置断点#xff0c;然后开启调试#xff1b; 但是我们熟悉linux启动流程的伙伴肯定知道#xff0c;在start_kernel之前还有一段汇编#xff0c;包括初始化页表及mmu等操作#xff0c; 这部分如何调试呢#x…一、背景 大部分qemu调试kernel 都是讲解从start_kernel开始设置断点然后开启调试 但是我们熟悉linux启动流程的伙伴肯定知道在start_kernel之前还有一段汇编包括初始化页表及mmu等操作 这部分如何调试呢 二、如何从第一行代码开始调试 无论是gdb调试还是JTAG调试其中最重要的一个就是加载symbols 到正确的物理/虚拟地址是物理地址还是虚拟地址取决于此时mmu是否有打开 我们需要知道kernel 的第一行地址是什么 对应的symbols的区域在vmlinux的哪里 qemu 启动kernel的物理地址 qemu 启动增加-S 选项时启动时停止等待gdb 连接这时会显示一个地址这个就是当前启动的物理地址 vmlinux中的的起始地址(虚拟地址): 在源码的System.map或者通过gdb打开vmlinux查看内核的入口是_text虚拟地址0xffff800080000000 _text的定义在arch/arm64/kernel/vmlinux.lds.S 注意这里的section name.head.text 放的是_text 不要和.text段名搞混了 ENTRY(_text) ... SECTIONS { ....head.text : {_text .;HEAD_TEXT}.text : ALIGN(SEGMENT_ALIGN) { /* Real text segment */_stext .; /* Text and read-only data */IRQENTRY_TEXTSOFTIRQENTRY_TEXTENTRY_TEXTTEXT_TEXTSCHED_TEXTLOCK_TEXTKPROBES_TEXTHYPERVISOR_TEXT*(.gnu.warning)}. ALIGN(SEGMENT_ALIGN);_etext .; /* End of text section */ ... qemu启动的物理地址和vmlinux 中启动地址_text 虚拟地址的关系 先来看qemu的启动地址0x0000000040000000 附近内容 (gdb) x /16i 0x00000000400000000x40000000: ldr x0, 0x400000180x40000004: mov x1, xzr0x40000008: mov x2, xzr0x4000000c: mov x3, xzr0x40000010: ldr x4, 0x400000200x40000014: br x40x40000018: stxrh w0, w0, [x0]0x4000001c: udf #00x40000020: .inst 0x40200000 ; undefined0x40000024: udf #00x40000028: udf #00x4000002c: udf #00x40000030: udf #00x40000034: udf #00x40000038: udf #00x4000003c: udf #0(gdb) x /16x 0x0000000040000000 0x40000000: 0x580000c0 0xaa1f03e1 0xaa1f03e2 0xaa1f03e3 0x40000010: 0x58000084 0xd61f0080 0x48000000 0x00000000 0x40000020: 0x40200000 0x00000000 0x00000000 0x00000000 0x40000030: 0x00000000 0x00000000 0x00000000 0x00000000 注意不同的qemu版本可能起始的物理地址不同本人电脑使用ubuntu22.04自带版本6.2.0 geekgeek-virtual-machine:~/workspace/linux/linux-6.6.1$ qemu-system-aarch64 --version QEMU emulator version 6.2.0 (Debian 1:6.2dfsg-2ubuntu6.15) Copyright (c) 2003-2021 Fabrice Bellard and the QEMU Project developers 源码路径https://gitlab.com/qemu-project/qemu.git 切换到6.2.0版本 geekgeek-virtual-machine:~/workspace/linux/qemu_src/qemu$ git tag | grep 6.2 v1.6.2 v2.6.2 v6.2.0 v6.2.0-rc0 v6.2.0-rc1 v6.2.0-rc2 v6.2.0-rc3 v6.2.0-rc4 geekgeek-virtual-machine:~/workspace/linux/qemu_src/qemu$ git reset --hard v6.2.0 qemu启动kernel的部分在qemu源码路径hw/arm/boot.c (gdb) si 0x0000000040000010 in ?? ()0x0000000040000010: 84 00 00 58 ldr x4, 0x40000020(gdb) x /x 0x40000020 0x40000020: 0x40200000ldr x4, 0x4000002 //把0x40000020 地址存储的值读取到x4,实际就是上面bootloader_aarch64[]数组定义的//FIXUP_ENTRYPOINT_LO FIXUP_ENTRYPOINT_HI br x4 //跳转到x4 并执行 通过qemu 代码的注释也可以看到在这个版本的qemu中arm64的kernel 起始地址是放在0x40200000并从这里开始执行第一条指令 所以我们要在qemu中做的就是将物理地址0x40200000 与vmlinux中的第一条指令地址0xffff800080000000 (_text) 对齐即可 gdb 已经连接qemu linux kernel (gdb) x /16x 0x40200000 0x40200000: 0xfa405a4d 0x146a6427 0x00000000 0x00000000 0x40200010: 0x02860000 0x00000000 0x0000000a 0x00000000 0x40200020: 0x00000000 0x00000000 0x00000000 0x00000000 0x40200030: 0x00000000 0x00000000 0x644d5241 0x00000040gdb vmlinux直接查看_text处的汇编 (gdb) x /16x _text 0x80000000 _text: 0xfa405a4d 0x146a6427 0x00000000 0x00000000 0x80000010 $d8: 0x02860000 0x00000000 0x0000000a 0x00000000 0x80000020 $d24: 0x00000000 0x00000000 0x00000000 0x00000000 0x80000030 $d40: 0x00000000 0x00000000 0x644d5241 0x00000040 通过readelf确认那些段需要映射 geekgeek-virtual-machine:~/workspace/linux/linux-6.6.1$ aarch64-none-linux-gnu-readelf -S vmlinux There are 43 section headers, starting at offset 0x18ff9fb8:Section Headers:[Nr] Name Type Address OffsetSize EntSize Flags Link Info Align[ 0] NULL 0000000000000000 000000000000000000000000 0000000000000000 0 0 0[ 1] .head.text PROGBITS ffff800080000000 000100000000000000010000 0000000000000000 AX 0 0 65536[ 2] .text PROGBITS ffff800080010000 00020000000000000102b000 0000000000000000 AX 0 0 65536[ 3] .rodata PROGBITS ffff800081040000 0105000000000000009dc8c8 0000000000000000 WA 0 0 4096 ......[15] .rodata.text PROGBITS ffff800081a94800 01aa48000000000000005800 0000000000000000 AX 0 0 2048[16] .init.text PROGBITS ffff800081aa0000 01ab0000000000000008c6f8 0000000000000000 AX 0 0 8 ......[19] .init.data PROGBITS ffff800081b95000 01ba500000000000000c551a 0000000000000000 WA 0 0 256 ...... 地址映射关系 section namevirtual addrphy addr.head.text0xffff8000800000000x40200000.text0xffff8000800100000x40210000.rodata0xffff8000810400000x40240000.rodata.text0xffff800081a948000x41C94800.init.text0xffff800081aa00000x41CA0000.init.data0xffff800081b950000x41D95000 启动gdb 时不要加载vmlinux 通过add-symbol-file 指定section 要加载的物理地址 add-symbol-file vmlinux -s .head.text 0x40200000 -s .text 0x40210000 -s .rodata 0x40240000 -s .rodata.text 0x41C94800 -s .init.text 0x41CA0000 -s .init.data 0x41D95000 设置断点b _text 然后就可以单步调试 三、总结 其实不管使用什么调试器gdb/T32/Crash/lldb第一步要做的都是将elf和调试target的执行地址做一个对齐当然这个对齐可能是物理地址对齐无mmu,如bootloaderelf编译的地址就是代码运行的物理地址也有可能是虚拟地址对齐开启了mmu 比如kernel start_kernel 之后部分也有可能是物理地址与虚拟地址对齐比如本文中的_text到start_kernel 掌握了这个规律也就掌握的调试的入口密码。
http://www.zqtcl.cn/news/96074/

相关文章:

  • 柳州做网站的企业做黑彩网站
  • 商城网站开发那家好网站建设知识平台
  • 莱州网站定制flash网站cms
  • 经营范围里的网站建设直播系统程序
  • 58同城类似的网站开发wordpress 地方生活
  • wordpress 七牛ossseo系统
  • 郑州做网站 熊掌号太原今天最新通知
  • 文章网站如何与压力做足球比赛直播间在线观看
  • 越秀网站建设优化呼和浩特住房和城乡建设部网站
  • 河南省路桥建设集团网站建网站公司郑州
  • 海沧做网站深圳外贸招聘
  • 网站建设置顶多少钱翻译成英文
  • 柳州正规网站制作公司哪家好怎么学好网站建设
  • 德宏做网站网站的设计思路范文
  • 自己的电脑做网站服务器深圳福田有什么好玩的地方
  • 奕腾网站建设上海十大装修公司排名榜单
  • 简述建设一个网站的基本步骤wordpress欢迎新会员
  • 国外医疗网站模板wordpress主题 科技
  • 海淀企业型网站建设wordpress自定义帖子链接
  • 自己的网站怎么优化做网页的
  • dw设计一个简单网站网页微信版文件传输
  • 网站地图怎么做XML宁波网站建设服务提供商
  • 中石化两学一做网站获取网站域名
  • 吉林长春火车站官网湖北葛洲坝建设工程网站
  • 重庆网站推广服务广告公司女员工深夜兼职
  • 网站的要素是什么wordpress框架解密_day3
  • 抽奖怎么做网站彩页设计公司
  • 推广网站文案素材lamp环境wordpress
  • 合肥网站建设公司 推荐百度下载安装2021
  • 沈阳网站备案照相离婚证app制作软件