通过JTAG对比内核启动后text/rodata段内容

关键词:vmlinux、strip、dump、_text、__end_rodata等等。

在日常的调试中,可能会在某些情况下踩到内核重要的数据,比如代码段或者rodata之类。

这种情况下,需要确认这些数据是否异常。

所谓的异常就是从DDR中读出的数据能否和vmlinux对上。

1. 准备vmlinux数据

原始的vmlinux文件,需要strip:

strip vmlinux -o vmlinux_stripped

然后去掉vmlinux的0x1000头部。

dd if=vmlinux_stripped of=vmlinux_stripped_noheader bs=4096 skip=1

最终得到的文件vmlinux_stripped_noheader就是加载到内核中运行的可执行文件。

2. 从DDR中导出数据

连接上JTAG,然后通过dump memory将DDR中数据导出。

dump memory kernel.bin 0x8000000 0x809c7200

其中0x80000000是内核执行的起始地址,0x809c7200可以从System.map中获取,也即_end值。

3. 对比数据

从下图可以看出,在内核启动之后不变的数据部分是代码段(_text <--> _etext)和只读数据段(__start_rodata <--> __end_data)。

在System.map中找到如下几个关键地址:

...
80049000 T _text
...
806af4e8 T _etext
...
806b0000 R __start_rodata
...
80909000 R __end_rodata
...

在从_text到__end_rodata中间的数据,在整个运行期间是不会改变的。

但是存在一个特殊的RO_AFTER_INIT_DATA段,这部分数据在init初始化之后就不会改变。但是仍然和vmlinux是不一样的。

#ifndef RO_AFTER_INIT_DATA
#define RO_AFTER_INIT_DATA                        \
    __start_data_ro_after_init = .;                        *(.data..ro_after_init)                            __end_data_ro_after_init = .;
#endif

从DDR中导出_text到__end_rodata之间的数据:

dump memory kernel.bin 0x80049000 0x80909000

从stripped之后的vmlinux中截取_text到__end_rodata之间的数据:

dd if=vmlinux_stripped of=vmlinux_stripped_noheader bs=4096 skip=74 count=2240

0x8004900对应73个页面,但是还需要去掉1个页面的头,所以一共是74个页面。

0x80909000-0x8004900=0x8c000,即一共2240个页面。

在BeyondCompare中进行二进制比较如下:

原文地址:https://www.cnblogs.com/arnoldlu/p/10932267.html

时间: 2024-10-07 19:51:14

通过JTAG对比内核启动后text/rodata段内容的相关文章

STM32F103 ucLinux开发之四(内核启动后的调试)

Stm32-uclinux启动后的调试 1.  修改__pfn_to_page使得能够启动 根据STM32F103 ucLinux开发之三(内核启动后不正常)的描述,内核无法启动是选择了平板内存模式后,下面两个宏定义,导致计算错误,从而Backtrace的. #define __pfn_to_page(pfn)     (mem_map + ((pfn) - ARCH_PFN_OFFSET)) #define __page_to_pfn(page)  ((unsigned long)((page

自定义内核启动后的Logo

1.使用图像GIMP工具 2.详细步骤如下: A.将800x480的图片导入到GIMP工具. B.选中GIMP菜单栏进行以下操作 图像 -->模式 -->索引 .在弹出的窗口当中,选中调色板,最大颜色值修改为224. .点击[转换]按钮,退出. C.将文件"Export As"文件类型为ppm格式,并且文件名为:logo_linux_clut224.ppm,输出格式为ASCII,最后进行保存. D.将logo_linux_clut224.ppm拷贝到内核目录当中的drive

内核启动后,lcd显示logo失败

针对-s5pv210,但对其他平台也使用 lcd显示logo失败,若显示成功默认的logo是一只企鹅,但是串口打印"Start display and show logo",但是LCD屏没有显示 [ 0.833071] s3cfb s3cfb: [fb2] dma: 0x465ab000, cpu: 0xe1000000, size: 0x005dc000 [ 0.845112] FIMD src sclk = 166750000 [ 0.965701] s3cfb s3cfb: re

Linux内核源码分析--内核启动之(1)zImage自解压过程(Linux-3.0 ARMv7) 【转】

转自:http://blog.chinaunix.net/uid-25909619-id-4938388.html 研究内核源码和内核运行原理的时候,很总要的一点是要了解内核的初始情况,也就是要了解内核启动过程.我在研究内核的内存管理的时候,想知道内核启动后的页表的放置,页表的初始化等信息,这促使我这次仔细地研究内核的启动代码. CPU在bootloader的帮助下将内核载入到了内存中,并开始执行.当然,bootloader必须为zImage做好必要的准备:  1. CPU 寄存器的设置: R0

Linux内核启动及根文件系统载入过程

上接博文<u-boot之u-boot-2009.11启动过程分析> Linux内核启动及文件系统载入过程 当u-boot開始运行bootcmd命令,就进入Linux内核启动阶段.与u-boot类似,普通Linux内核的启动过程也能够分为两个阶段,但针对压缩了的内核如uImage就要包含内核自解压过程了.本文以linux-2.6.37版源代码为例分三个阶段来描写叙述内核启动全过程.第一阶段为内核自解压过程,第二阶段主要工作是设置ARM处理器工作模式.使能MMU.设置一级页表等,而第三阶段则主要为

I.MX6Q(TQIMX6Q/TQE9)学习笔记——内核启动与文件系统挂载

经过前面的移植,u-boot已经有能力启动内核了,本文主要来看下如何通过之前移植的u-boot来启动内核.如果按照前面的文章完成了LTIB 的编译,那么,Linux的内核应该就会出现rpm/BUILD/目录下,接下来,我们就开始移植这个3.0.35版本的内核到TQIMX6Q. 内核的编译 为了简化内核编译的过程,可以在内核目录下创建编译脚本,命名为build.sh,内容如下: [cpp] view plaincopy #!/bin/sh export ARCH=arm export CROSS_

Linux内核启动及加载根文件系统

</pre></h1><p><span style="font-family:KaiTi_GB2312;font-size:18px;">上接博文<<a target=_blank href="http://blog.csdn.net/gqb_driver/article/details/8931775" style="text-decoration: none; font-family: 'Mi

第3阶段——内核启动分析之创建si工程和启动内核分析(3)

目标: (1)创建Source Insight 工程,方便后面分析如何启动内核的 (2)分析uboot传递参数,链接脚本如何进入stext的 (3) 分析stext函数如何启动内核 1 创建内核source sight 工程 1.1 点击 "add all" 添加所有文件,后面再慢慢删去Arch目录和Include目录中与2440芯片没用的文件. 1.2 点击Remove Tree 删除Arch文件夹,再添加与2440相关的硬件核心代码以及其它公用的代码 Arch:包含了平台,处理器相

2.16.3.内核启动的汇编阶段

参考https://blog.csdn.net/skyflying2012/article/details/41344377 本节是内核启动的汇编阶段剩余内容,主要是cpu的校验.机器码的校验.传参tag的校验.页表的创建.各种段的处理等. 2.16.3.1.__lookup_processor_type (1)我们从cp15协处理器的c0寄存器中读取出硬件的CPU ID号,然后调用这个函数来进行合法性检验.如果合法则继续启动,如果不合法则停止启动,转向__error_p启动失败. (2)该函数