历史上的今天
返回首页

历史上的今天

今天是:2025年04月13日(星期日)

正在发生

2018年04月13日 | ARM筆記:应用调试之自制系统调用、编写进程查看器(二)

2018-04-13 来源:eefocus

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

一、步骤

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

测试成功!

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

推荐阅读

史海拾趣

Advanced Interconnections Corp公司的发展小趣事

为了进一步提升国际竞争力,AIC公司开始实施全球化布局战略。公司先后在多个国家设立了研发中心和生产基地,以便更好地服务全球客户。同时,AIC公司还积极参加国际展览和交流活动,与海外企业建立合作关系,推动产品的全球化销售。这些举措使AIC公司的国际影响力不断提升,市场份额也进一步扩大。

Advanced Milliwave Laboratories Inc公司的发展小趣事

AML深知技术创新是企业发展的核心动力。因此,公司始终坚持自主研发和技术创新,不断推出新的微波产品和技术。这些新产品不仅具有更高的性能和更广泛的应用范围,还进一步提升了AML在微波技术领域的竞争力。同时,AML还注重与高校和研究机构的合作,共同开展技术研发和人才培养,为公司的长远发展提供了有力支持。

AC Photonics Inc公司的发展小趣事

AC Photonics Inc公司自成立以来,一直致力于光电技术的研发与应用。在公司成立初期,研发团队在光子集成技术上取得了重大突破,成功开发出一种高效、稳定的光电转换器。这一技术的问世,不仅提升了数据传输的速度和稳定性,还大大降低了能耗,为公司的业务发展奠定了坚实的基础。随着这一技术的逐步推广和应用,AC Photonics Inc在电子行业中逐渐崭露头角。

BusBoard公司的发展小趣事

一个优秀的企业不仅要有优质的产品和服务,还要有独特的企业文化。BusBoard公司注重企业文化的建设和传承,通过举办各种活动、培训等方式,让员工更好地了解公司的价值观和发展理念。同时,公司还鼓励员工积极参与公司事务、提出建设性意见,让员工成为公司发展的重要力量。这种以人为本的企业文化使得BusBoard公司的员工队伍更加团结、稳定和有活力。

以上五个故事从不同角度展示了BusBoard公司发展起来的相关情况。这些故事不仅反映了公司的成长历程和发展成果,也体现了公司在电子行业中的地位和影响力。随着科技的不断进步和市场需求的不断变化,BusBoard公司将继续保持创新、拓展市场、提升品质、建设文化,为电子行业的发展贡献更多的力量。

Headland Technology Product Group公司的发展小趣事

在电子行业中,产品质量是企业生存和发展的基石。HBControls深知这一点,因此始终将品质管理放在首位。公司建立了完善的质量管理体系,从原材料采购、生产加工到成品检验,每一个环节都严格把关。此外,HBControls还定期对员工进行质量意识培训,确保每一位员工都能将品质理念融入到日常工作中。正是凭借卓越的产品质量和优质的服务,HBControls赢得了众多客户的信赖和好评。

Cellergy公司的发展小趣事

在电子行业的快速发展中,Cellergy公司以一项创新技术打破了行业内的常规。该公司成功研发出了一种新型电容器,其性能远超市场上同类产品。这一技术突破不仅为Cellergy公司赢得了大量订单,还使其在电子行业中的地位得到了显著提升。随着技术的不断完善和市场的不断拓展,Cellergy公司逐渐成为了电容器领域的佼佼者。

问答坊 | AI 解惑

温度控制系统

本帖最后由 paulhyde 于 2014-9-15 04:26 编辑 题目要求:设计一个具有温度传感器的温度检测及显示的系统。要求系统具有温度检测、显示、用户输入等功能。可采用DS18B20数字温度传感器或AD590等温度传感器作为检测端,以MCS51或其他微控制芯片作为M ...…

查看全部问答>

使用哪种开发工具好呢?

EVC里边怎么不会出现代码提示框呢?是不是没有VS方便啊。…

查看全部问答>

KEIL C与protues连接问题请高手帮帮忙【急】

各位老师好!    我在使用protues仿真时出现以下问题,无法解决,请你们帮帮忙看看是什么原因,谢谢! 在keil c 编译、连接完成后,就会出现一个提示框显示 Fail to connect command socket to port 127.0.0.1:8000 GLE=00002743 点 ...…

查看全部问答>

工控PLC资料+编程软件(免费)

  更多下载可上网址http://wqlcd.com/new/league.asp?keyno=34[52RD…

查看全部问答>

QuartusII不能产生POF文件解决办法

QuartusII编译以后不能产生POF文件往往是由于没有选择EPCS器件造成,下面就如何选择EPCS介绍以下步骤: 1 打开QuartusII2 打开“Assignments/Device”3 点击“Device anf Pin Option/Configuration” 4 选择“Use Configuration device”在下拉 ...…

查看全部问答>

DSP的并口仿真器SEED-XDSPP如何在CCS配置?

DSP的并口仿真器SEED-XDSPP如何在CCS配置?初学者求助大家了,希望打击帮助我!最好说的具体点。先谢谢了!…

查看全部问答>

fpga 中图像传输时序

请教一下各位,在fpga 中 从sdram 中读取图像数据时, 怎么能够做到把每一帧分别识别出来?另外,在考虑时序问题时是怎么计算的,比如 主时钟60Mhz ,大小640*480模式下。 还有就是如何根据这些计算出来的延迟周期 延迟为基准,产生不同宽度和周期的 ...…

查看全部问答>

新人试出物联网无线模块、无线数据传输模块或者裸RF收发芯片

本品为工程富余的全新短距离射频传输模块,可以用做简单的家电无线控制、简单的无线数据传输、 无线遥控器,或者串口1-》无线发送-》无线接收-》串口2 模式的无线串口数据传输。主要芯片:MSP430 8位单片机CC1020 射频芯片射频PA芯片粗略参数:无线 ...…

查看全部问答>