ARM筆記:应用调试之自制系统调用、编写进程查看器(二)

发布者:yunhao最新更新时间:2018-04-13 来源: eefocus关键字:ARM  系统调用  进程查看器 手机看文章 扫描二维码
随时随地手机看文章

在本节里面我们就详细来讲一下如何用我们自己实现的系统调用来调试应用程序

一、步骤

1、修改应用程序的可执行文件,替换某个位置的代码为swi val

2、执行程序

3、进入到sys_hello->在sys_hello里面打印信息->执行原来的指令->返回

二、具体实现

我们的应用程序是:

//file:test_sc.c

#include


int cnt = 0;


void C(void)

{

int i = 0;


while (1)

{

printf("Hello, cnt = %d, i = %d\n", cnt, i);

cnt++;

i = i + 2;

                sleep(5);

}

}


void B(void)

{

C();

}



void A(void)

{

B();

}


int main(int argc, char **argv)

{

A();

return 0;

}

具体步骤:

(1)编译:arm-linux-gcc test_sc.c -o test_sc

(2)反汇编:arm-linux-objdump -D test_sc > test_sc.dis

(3)我们打开上面得到的可执行文件和反汇编文件

比如我们想在C函数的i=i+2;处打断点的话,我们先在反汇编文件里面找到对应的指令:

84d4: e2833002  add r3, r3, #2 ; 0x2

其中:e2833002是机器码,这是我们所需要的!

我们去可执行文件里面去搜索这个机器码,在可执行文件里它对应的机器码应该是:02 30 83 e2

我们将此机器码改为swi指令的机器码!

我们可以将上一节里面的文件反汇编一下,然后得到swi的机器码为:ef900160

(4)经过上面的修改,当程序执行到i=i+2;这条指令时,会产生系统调用,最终执行sys_hello函数。

在sys_hello函数里面,我们可以最一些必要的工作,具体程序如下:

//fs/read_write.c

asmlinkage void sys_hello(const char __user * buf, int count)

{

static int cnt = 0;

int val;

int ret;

struct pt_regs *regs; 

       copy_from_user(&val, (const void __user *)0x000107c8, 4);

printk("sys_hello: cnt = %d\n", val);


//获取当前进程的struct pt_regs结构体,这个函数需要本文件包含一个头文件:#include

regs = task_pt_regs(current);

regs->ARM_r3 += 2;//相当于我们自己实现了那个被替换的指令


copy_from_user(&val, (const void __user *)(regs->ARM_fp - 16), 4);

printk("sys_hello: i = %d\n", val);

if (++cnt == 5)

{

copy_from_user(&val, (const void __user *)0x8504, 4);

printk("[0x8504] code = 0x%x\n", val);

printk("regs->ARM_lr  = 0x%x\n", regs->ARM_lr);

val = 0xe2833002;


ret = access_process_vm(current, 0x8504, &val, 4, 1);

printk("access_process_vm ret = %d\n", ret);

cnt = 0;

}

return;

}


此外还需要在:include/linux/syscalls.h 文件里将函数声明改为:asmlinkage void sys_hello(const char __user * buf, int count);


(5)编译内核,用新内核启动


(6)运行测试程序(在此之前要修改测试程序的权限:chmod 777 test_sc_swi),输出信息如下:

Hello, cnt = 0, i = 0

sys_hello: cnt = 1

sys_hello: i = 0

Hello, cnt = 1, i = 2

sys_hello: cnt = 2

sys_hello: i = 2

Hello, cnt = 2, i = 4

sys_hello: cnt = 3

sys_hello: i = 4

测试成功!

本节讲的调试方法比较晦涩,一般不会采用!

关键字:ARM  系统调用  进程查看器 引用地址:ARM筆記:应用调试之自制系统调用、编写进程查看器(二)

上一篇:ARM嵌入式之lcd驱动程序之显示图片
下一篇:ARM嵌入式应用调试之自制系统调用

推荐阅读最新更新时间:2024-03-16 15:59

ARM裸机点LED
1 汇编实现: .global _start _start: // 把外设的基地址告诉CPU ldr r0, =0x70000000 //对于6410来说,内存(0x00000000~0x60000000),外设(0x70000000-0x7fffffff) orr r0, r0, #0x13 //外设大小:256M mcr p15,0,r0,c15,c2,4 //把r0的值(包括了外设基地址+外设大小)告诉cpu // 关看门狗 ldr r0, =0x7E004000 mov r1, #0 str r1, // 设置GP
[单片机]
Windows下基于ADS+J-Link 的ARM开发环境搭建
在一般ARM编程教学和实验环境里,一般采用 ADS加+并口转Jtag板+H-Jtag的开发环境。但是这种方法最大缺点是需要机器上有一个并口。现在无论PC还是笔记本都很难有并口,因此采用USB接口调试器就大行其道。其中Segger的JLink是比较有名和方便的调试器。 ADS 1.2 ,可以如下链接下载 http://esoft.mcu123.com/MCU123_temp_0080309@/ARM/ads1.2.rar 硬件可以参考这个 http://s.click.taobao.com/t_1?i=qz0qHj7qltKQRQ%3D%3D&p=mm_11796696_0_0&n=11 一.
[单片机]
Windows下基于ADS+J-Link 的<font color='red'>ARM</font>开发环境搭建
ARM内核的中断技术
    摘要: 以ARM7TDMI处理器为例,详细介绍ARM内核的三种中断:常规中断、快中断和软件中断;结合应用,给出优化的中断处理程序的ARM指令代码,对电子设计人员有效大的参考价值。     关键词: ARM 中断 快速 精简指令系统 1 ARM7TDMI简介 ARM7TDMI是一款经典的通用32位微处理器,采用精简指令系统(RISC)和流水线结构。典型应用如GPS、PDA、双向寻呼机、移动电话、板卡间高速通信等。 ARM7TDMI定义有7种工作模式,本文涉及到的有:用户模式,程序正常运行时的模式;快中断模式,处理器响应快中断而进入的模式;中断模式,处理响应常规中断而进入的模式;监督模式,操作系统
[嵌入式]
基于ARM的人体生理参数监护系统的设计
1 引言 随着我国经济的快速发展、城市化进程的日益加速、人们生活节奏的不断加快,越来越多的人们开始感到自己的健康每况愈下,很多人直至病情突发才明白。据报道,我国绝大多数人都处于亚健康状态。随着现代电子技术的发展,16/32位CPU的广泛应用,传统的生理信号监护仪的CPU系统也在逐渐的由8位 CPU向更高位数的处理器发展。随着监护仪功能的强大,对数据处理速度的要求越来越高,使得8位CPU的发展受到了限制,16/32位CPU可以在远高于 8位CPU的时钟频率下正常工作,数据一次性吞吐量大,处理器的价格却在下降,16/32位CPU开始被广泛应用于生理信号监护仪中。 该监护系统采用了ARM7系列芯片中的LPC2292嵌入式微处理器,主要
[单片机]
ARM处理器Linux下浮点运算单元运用
1). 浮点运算单元(FPU)简介 Float Point Unit,浮点运算单元是专用于浮点运算的协处理器,在计算领域,例如三角函数以及时域频域变换通常会用到浮点运算。当CPU执行一个需要浮点数运算的程序时,有三种方式可以执行:软件仿真器(浮点运算函数库)、附加浮点运算器和集成浮点运算单元。 区别于以往的ARM9处理器,目前基于Cortex构架的ARM处理均集成了浮点运算单元。如Nvidia Tegra 2, Tegra 3和 NXP/Freescale i.MX 6集成了VFPv3浮点运算单元,NXP/Freescale i.MX 7 则集成了VFPv4浮点运算单元。ARM 浮点架构 (VFP) 为半精度、单精度和双精度浮
[单片机]
关于arm时钟频率的设置及编程
OSC是用无源晶振,EXT是用有源晶振或外部时钟2440的12M是Oscillator 是有源的呀! 2440的12M是Oscillator Crystal 无源晶体 Oscillator 有源晶体(里面有有源器件) 无源晶振内只有一片按一定轴向切割的石英晶体薄片,供接入运放(或微处理器的XTAL端)以形成振荡.有源晶振内带运放,工作在最佳状态,电源后,可直接输出一定频率的等幅正弦波,一般至少有4引脚,体积稍大. 准备先不跑系统,把S3C2440和周边硬件熟悉一下再说。 对于任何一个单片机,要使用它首先就要弄明白他的时钟系统,MCU的时钟就像人的心脏
[单片机]
ARM+Win8铁壁 Intel与Android结盟
    英特尔(Intel)在智慧手机和平板电脑的微处理器端起步较晚,目前在行动市场上远远落后给ARM阵营处理器。为了扳回一城,英特尔主动发起攻势,与Google进行合作。未来新版的Android系统将能支援Atom处理器,并能结合Atom处理器的指令集架构及硬体装置进行运算的最佳化。 事实上,英特尔对于ARM架构等同于独霸行动处理器市场,早就非常感冒。特别是微软宣布Windows8将支援ARM架构处理器之后,一来ARM架构等同于Android与Windows系统通吃,二来英特尔独占Windows 市场的局面也告终结。如此看来,英特尔拉拢Google阵营,似乎是不得不,且必须走的战略方向。 Google 资深副总裁Andy
[手机便携]
基于ARM处理器的机器人硬件设计
  随着人们生活水平的日益提高,我国人口的老龄化也越来越明显,吸尘机器人作为服务机器人的一种,能够代替人进行清扫房间、车间、墙壁等一些简单劳动。   使服务机器人有了广阔的市场,已成为一些企业和科研院所研究的焦点。目前市场上的吸尘机器人虽然也具有智能性,但大多由于结构不尽合理、通用性差、集成度高而导致成本高,不利于普及。在研究总结市场上相对成熟产品的基础上,基于ARM Cortex-M3处理器设计一款具备自我导航功能的室内吸尘机器人。外形紧凑、结构简单、运行平稳、噪音小,并且成本低,操作方便,还具有可扩展接口,用户能够根据实际需要对其功能做进一步开发。   1、吸尘机器人总体构成   利用ARM Cortex-M3处理器设
[单片机]
基于<font color='red'>ARM</font>处理器的机器人硬件设计
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved