A little kernel debug tip

little kernel分析 little kernel做为Android系统的bootloader,最早用google工程师实现,其后由高通,MTK等芯片厂商做了各自平台的适配。 lk的主要功能: 初始化硬件模块,如时钟,中断,UART,USB,LCD,PMIC,eMMC/UFS等。 更新cmdline。其中重要的是区分启动模式。 选择和更新device tree。 设置好系统状态,跳转到kernel。 MMU = 阅读详情
I want to share with you one piece of kernel debug tip, and also remind myself in the future.

As you know linux kernel organizesits components into various subsystems. And in order to support various  devices, each subsystem provides common interface structures to let  devices describe themselves at initialization. 

So you'll be seeing this kind of staff alot:

const struct address_space_operations jfs_metapage_aops = {
    .readpage    = metapage_readpage,
    .writepage    = metapage_writepage,
    .sync_page    = block_sync_page,
    .releasepage    = metapage_releasepage,
    .invalidatepage    = metapage_invalidatepage,
    .set_page_dirty    = __set_page_dirty_nobuffers,
};


Then within the subsystem, you'll only see readpage, writepage called but unknowing which device actually implemented them.

Take this one as an example, in page-writeback.c:

/*
 * Function used by generic_writepages to call the real writepage
 * function and set the mapping flags on error
 */
static int __writepage(struct page *page, struct writeback_control *wbc,
               void *data)
{
    struct address_space *mapping = data;
    int ret = mapping->a_ops->writepage(page, wbc);
    mapping_set_error(mapping, ret);
    return ret;
}


I don't know which real writepage function is called actually, so:

1. Print the function address of mapping->a_ops->writepage, use %p. It's 0xc11fb260 in my test.
2. Check the kernel symbol table using `readelf -s <your kernel image>`
3.  Now you can see the address range of the kernel image. In my cases it's  0x80xxxxxx, clearly not matching the function address. So it's highly  possible the function is defined within a kernel module, e.g. ko.
4. Log on the STB, `cat /proc/module` find the kernel module  which has a mapping address close to the function address. In this case  its jfs.ko, it live between 0xc11e1000 and 0xc1197000.
5. Get the in module address offset by 0xc11fb260 - 0xc11e10000, the result is 0x1a260.
6. Find the jfs.ko, and `addr2line -f -e jfs.ko 0x1a260`,  then you can see the actuall function is metapage_writepage, and it's  defined in jfs_metapage.c

It's a small piece of tip, so I think I just mail it instead of a knowledge share. Ignore it if it's too simple for you :P 

Enjoy a try and hope it helps!

LK(little kernel)第一行代码链接位置分析及lk启动过程 LK是(L)ittle (K)ernel的缩写,是一个功能及其强大的bootloader开源项目,但现在只支持arm和x86平台。 LK的一个显著的特点就是它实现了一个简单的线程机制(thread),和对高通处理器的深度定制和使用。因此高通平台android普遍采用LK作为其bootloader。但是,LK只是整个系统的引导部分。 1,lk的代码链接方式以及第一行代码的位置 本文以高通平台为 阅读详情

相关推荐

ArcGIS渔网分割实战:用Create Fishnet快速生成1km×1km网格(附GDP数据分析案例)

本文详细解析了ArcGIS中Create Fishnet工具在渔网分割中的应用,从基础操作到GDP空间分析全流程。通过1km×1km网格的创建与优化,实现经济数据的空间标准化和可视化表达,解决数据融合与分析的三大核心痛点。

weixin_29250403的博客 295

linux/android memory/flash layout

通常做bootloader和kernel的人都会对memory layout感兴趣,最近修改了一次memory/flash layout,先记录下来: 1.flash layout    flash layout是rom的分布图,通常直接看partion table就能直接明了。 2.memory layout    通常android下memory 可能分成以下几个部分:    boo

xiewen2010的专栏 2015

写给音响工程师的科普文章(二)——从模电角度去了解调音台话放

    上一篇讲到调音台第一级放大电路为差分放大器,关于差分放大器的基础知识可以参考以下资料:https://wenku.baidu.com/view/e6a46aaa2af90242a995e537 在教材中的差分放大器基本形式是这样子的,在实际电路中把RE电阻换成两个2倍RE,于是变成这样 然后我们现在来对比调音台中的差分放大器和教材中的有什么区别,我就拿yamaha 01V 96来说...

huanghaoAudio的博客 7701

little kernel中的memory管理

在lk中通过我们一般通过malloc来申请内存 void *malloc(size_t size) { return heap_alloc(size, 0); } malloc 直接调用heap_alloc 来申请。 lk_main函数中通过调用heap_init来初始由于malloc申请的heap void heap_init(void) { LTRACE_ENTRY;

jason的笔记 2099

1、硬件工程师笔面试真题汇总(2025版本)

答:按照使用习惯,电源指示灯用红色,信号指示灯用绿色这两种颜色的LED 灯技术最成熟,价格最便宜通孔是贯穿整个PCB 的过孔盲孔是从PCB 表层连接到内层的过孔埋孔是埋在PCB 内层的过孔。大多数PCB厂家的加工能力是这样的:大于等于8mil 的过孔可以做机械孔小于等于6mil 的过孔需要做激光孔对小于等于6mil 的微型孔,在钻孔空间不够时,允许一部分过打在PCB 焊盘上。

XU157303764的博客 2万+

SCADA|KingSCADA通过组合框选择修改变量的值

《SCADA项目中组合框控件的使用方法》 本文详细介绍了SCADA系统中组合框(下拉框)控件的应用方法。通过具体示例演示如何实现:当选择"雷工笔记"时变量值为100,选择"雷工杂谈"时为200,选择"小李食代"时为300的功能。主要实现步骤包括:1)创建项目并添加组合框控件;2)设置Items选项及对应数值;3)创建内存变量;4)使用GetCurrentIndex()和GetItemData()方法;5)在选项变化事件中编写脚本。该控件在SCADA

做有价值的事,积累有价值的笔记! 864

kernel - debug 调试方法

一、使用devmem查看指定物理内存地址的值 busybox中提供有devmem命令,运用该命令可以直接查看硬件寄存器的值 busybox devmem 二、使用内核自带动态调试打印 pr_debug: echo -n 'file gpiolib.c +p' > /sys/kernel/debug/dynamic_debug/control 三、故意让系统崩溃 echo "c" > /...

weixin_30826761的博客 471

疾风气象大模型4.0白皮书

《疾风气象大模型白皮书摘要》 疾风气象大模型(J-AFM)是国内首个基于3D建模的气象智能平台,突破传统二维气象分析的局限,采用体素化技术构建"x-y-z-t"四维统一模型,实现从分钟级短临到30天跨时效的连续预测。核心技术包括:1)多源数据三维同化,融合雷达、卫星、风廓线等异构数据;2)物理约束AI解码器,嵌入能量守恒、湍流封闭等气象原理;3)行业适配插件,服务风电、光伏、航空等领域,如山地风场尾流校正、云影短临预测。平台支持批流一体推理与边缘部署,提供概率化输出和误差溯源能力,显著降

专注AI大模型,软件混淆,授权 540

linux内核调试环境搭建步骤

linux内核调试环境搭建步骤 linux 2.6.26 与其后的版本,其内置已经支持kgdb了。 下面的内容描述了怎样在Linux环境下,搭建虚拟机调试linux内核的主要步骤:我的环境是Ubuntu10.4+VirtualBox(linux2.6.32.16内核源码)。 一、安装VirtualBox以及目标机Linux 这里目标机用来做测试环境,根据具体开发需要,可

探秘 3139

小米15修复“NV损坏” 去除主板校验电阻步骤解析与图示

小米15系列将搭载骁龙8至尊版处理器,采用台积电3nm工艺。文章分析了手机出现"NV损坏"故障的表现及修复方法,包括通信异常、系统启动问题等典型症状,并介绍了去除主板校验电阻和刷写工程固件两种修复方案。重点讲解了去除主板电阻后刷写QCN文件的操作流程,强调在维修过程中需要结合分析与思考。适用于小米15系列特定机型(24129PN74G/I/C)的硬件修复。

小马哥的专栏 313

语音信号的AGC自适应增益调整matlab仿真

语音信号的自动增益控制(Automatic Gain Control,AGC)是音频处理领域中的一项重要技术。其核心功能是实时调整输入信号的幅度,使其保持在一定范围内,以优化输出信号的质量。AGC广泛应用于语音通信、语音识别、音频录制和播放等领域,旨在解决输入信号幅度波动问题,确保输出信号的稳定性和清晰度。一、AGC的基本原理1.1 幅度调整自动增益控制的基本原理是根据输入信号的幅度动态地调整系统的增益。

平时工作较为繁忙,私信消息一般晚上回复,谢谢大家~~ 919

gdb_kdb_kgdb

kdb ftp://oss.sgi.com/projects/kdb/download/latest ftp://oss.sgi.com/www/projects/kdb/download/  内核的源代码中就有,用menuconfig重新设置内核选项,在kernel hacking中。 kdb编译,安装,使用完全手册 编译kdb 步骤1: kdb不是Linu

探秘 1737

贝叶斯网络 (Bayesian Networks) 原理与代码实例讲解

贝叶斯网络 (Bayesian Networks) 原理与代码实例讲解 1. 背景介绍 1.1 什么是贝叶斯网络? 贝叶斯网络(Bayesian Networks)是一种基于概率论的图形模型,用于表示随机

AI天才研究院 1332

System.map文件

亲自编译过linux内核的可能编译完内核都会发现在生成vmlinuz的目录下面多出来一个System.map文件,一般位于/boot目录下,那么这个文件是做什么用的呢? 通常我们会把发送到标准输出设备的链接映象信息重定向到一个文件中(如System.map)。编译内核时,System.map文件用于存放内核符号表信息。符号表是所有内核符号及其对应地址的一个列表,随着每次内核的编译,就会产生一

探秘 1136

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

linux kernel, driver, network driver

1, code  base/3pp/linux-st7109/patches       2, linux kernel code git   http://landley.net/writing/git-bisect-howto.html This downloads a local copy of the entire revision history (b

探秘 972

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

insmod: error inserting 'hello.ko': -1 Invalid module format

1, make xconfig General setup---->>>local version -append to kernel release:       在这儿添加下面内容 -170.2.117.fc10.i686 or modify ./.config file: # # General setup # CONFIG_EXPERIMENTAL=y CONFIG_L

探秘 855

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

Linux 2015 年最热门的 10 篇技术文章

Linux 2015 Linux 热门文章 Top 10 来自微信公众号 LinuxHub 「Linux爱好者」专注分享 Linux 相关内容,包括:业界动态、工具资源、使用技巧、课程和书籍等。 长按上面的二维码关注 LinuxHub 后,发送  2015  阅读以下10篇热门Linux文章 《Deb

探秘 807

Linux的时间函数

Linux的时间函数 #include struct timezone tz; gettimeofday (&tv , &tz); struct timeval tv; gettimeofday (&tv , NULL); fprintf(stderr, "%s:%d:%s, tv_sec:%ld   tv_usec:%ld      leosu \n",__FILE__,

探秘 771

Linux内核编译详解_01

Linux内核编译详解 #tar -zxvf linux-2.4.18.tar.gz.tar.gz  #make xconfig(基于图形窗口模式的配置界面,Xwindow下推荐使用)  #make dep #make clean #make bzImage或make zImage #make modules #make modules_install #depmod

探秘 698

kernel 网站资源汇总

Linux Kernel Newbies(内核开发新手的邮件列表):  http://kernelnewbies.org/                                http://janitor.kernelnewbies.org/ LKML:公开的邮件列表,是kernel.org的产物; 一些很好的信件资料存档网站, lkml.org     

探秘 682

initrd**.img: boot loader initialized RAM disk

initrd initrd 所代表的英文含义: initial RAM disk 初始 RAM 磁盘(initrd)是在系统引导过程中挂载的一个临时根文件系统,用来支持两阶段的引导过程。 initrd文件中包含了各种可执行程序和驱动程序,它们可以用来挂载实际的根文件系统,然后再将这个 initrd RAM 磁盘卸载,并释放内存。 在很多嵌入式Linux 系统中,initrd 就是最终的

探秘 671

Linux 系统内核的调试_01

linux 2.6.26 与其后的版本,其内置已经支持kgdb了。 本文将首先介绍 Linux 内核上的一些内核代码监视和错误跟踪技术,这些调试和跟踪方法因所要求的使用环境和使用方法而各有不同,然后重点介绍三种 Linux 内核的源代码级的调试方法。 调试是软件开发过程中一个必不可少的环节,在 Linux 内核开发的过程中也不可避免地会面对如何调试内核的问题。但是,Linux

探秘 573

Linux 系统内核的调试_02

2.4 kgdb的一些特点和不足 使 用kgdb作为内核调试环境最大的不足在于对kgdb硬件环境的要求较高,必须使用两台计算机分别作为target和development机。尽管使用 虚拟机的方法可以只用一台PC即能搭建调试环境,但是对系统其他方面的性能也提出了一定的要求,同时也增加了搭建调试环境时复杂程度。另外,kgdb内核 的编译、配置也比较复杂,需要一定的技巧,笔者当时做的时候也是费了

探秘 544

linux 进程间通信综述

linux进程间通信主要分为以下4个领域 (1)消息传递(管道,FIFO,消息队列) (2)同步(互斥锁,条件变量,读写锁,信号量) (3)共享内存区(匿名共享内存区,有名共享内存区) (4)过程调用(Solaris门,Sun RPC) linux进程间的信息共享可以分为 (1) 基于文件系统的共享 (2) 基于内核的共享 (3) 基于共享内存区的共享 IPC对象

探秘 543

linux core dump

How to enable core dump: – #ulimit ­c unlimited – #echo /tmp/core.%e.%p > /proc/sys/kernel/core_pattern

探秘 460
上一篇: DirectFB, OpenGL, OpenGL ES, EGL, EGLFS, GLX; OpenVG, XCB
下一篇: shell+sed+awk和perl和python的区别
bamboolsu
博客等级 码龄22年 200粉丝 394原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值