在linux内核里有这么一个函数

long void probe_kernel_write(*dst, void *src, size_t size)

故名意思,他就是探测内存是否可以写入,如果出错则返回非0

在STUB中我们经常要使用这么一个函数去替代memcpy

因为我们没法判断GDB要求地址的是否可以写入

在 arm下,该函数每次写入前都会调用

access_ok(VERIFY_READ, src, 1)
#define access_ok(type,addr,size)       (__range_ok(addr,size) == 0)

判断当前地址是否可以写入

但显然,运行LINUX的设备并没有我们rtos设备需要运行在flash上的特点

所以他的probe_kernel_write只是copy_to_user而已

range_ok也只是检测地址是否超出了进程空间

并不检测出我们设备写入flash的错误

那怎么解决?

这里我看到一个非常有意思的办法

static long probe_kernel_write(void *dst, void *src, size_t size)
{int i = 0;char *dst_ptr = (char *)dst;char *src_ptr = (char *)src;gdb_mem_fault_handler = &&err;for (i = 0; i<size; i++) {*(dst_ptr++) = *(src_ptr++);}<pre name="code" class="cpp">   gdb_mem_fault_handler = (void *)0;return 0;err:gdb_mem_fault_handler = (void *)0;return -1;
}

上面这个函数是怎么实现判断地址是否可以写入的呢?

主要在这里

    gdb_mem_fault_handler = &&err;

不清楚?

那我们看看dabt函数

void rt_hw_trap_dabt(struct rt_hw_register *regs)
{
#ifdef RT_USING_GDBif (gdb_mem_fault_handler) {regs->pc = (unsigned long)gdb_mem_fault_handler; return;}
#endifrt_hw_show_register(regs);rt_kprintf("data abort\n");rt_kprintf("thread %.*s stack:\n", RT_NAME_MAX, rt_current_thread->name);#ifdef RT_USING_FINSHlist_thread();
#endifrt_hw_cpu_shutdown();
}

对 就是把dabt异常的返回地址设置到我们的err上去

这样就直接跳过了中间的操作部分

然后告诉我们写入错误

工程已经放出

可以参考readme-zh.txt在BBB板上运行

https://code.csdn.net/wzyy2/gdbstub4rtt

就是汇编部分没有能力,写的太丑陋了=.=

(rt-thread gdb)关于probe_kernel_write(判断地址是否可以写入)相关推荐

  1. 关于RT thread系统节拍时钟的配置

    关于RT thread系统节拍时钟的配置                  -----本文基于rt-thread-3.1.3版本编写 首先,使用RTthread OS时,要配置(或者明白)它的系统节拍 ...

  2. rt thread studio使用QBOOT和片外flash实现OTA升级

    我们这里要使用单片机外部flash作为OTA的下载分区,外部flash硬件连接关系 PB3-->SPI3_CLK PB4-->SPI3_MISO PB5-->SPI3_MOSI PE ...

  3. Yeelink平台使用——远程控制 RT Thread + LwIP+ STM32

    1.前言     [2014年4月重写该博文]     经过若干时间的努力终于搞定了STM32+LwIP和yeelink平台的数据互通,在学习的过程中大部分时间花在以太网协议栈学习上,但是在RT Th ...

  4. RT Thread根据开发板制作BSP方法

    之前一直不懂怎么使用RT Thread的软件包,感谢网上的大神,看了你们的博客后大概了解一些,在此做下记录.用RT Thread软件包需要RT Thread的系统,但是RT Thread和RT Thr ...

  5. 基于rt thread smart构建EtherCAT主站

    我把源码开源到到了gitee,https://gitee.com/rathon/rt-thread-smart-soem 有兴趣的去可以下载下来跑一下 软件工程推荐用vscode 打开.rt thre ...

  6. rt thread系统下添加wiznet软件包后,不插网线CPU利用率100%问题

    rt thread系统下添加wiznet软件包后如果不插网线的话其他任务运行很卡,使用ps命令发现优先级低的任务很多都超时了 rt thread线程错误码 添加了一个可以查看CPU利用率的软件包CPU ...

  7. stm32f407单片机rt thread 片外spi flash OTA升级配置示例

    参考地址https://www.rt-thread.org/document/site/application-note/system/rtboot/an0028-rtboot/ 第一步,生成Boot ...

  8. 使用RT Thread设备框架封装一个I2C设备——DS3231

    使用RT Thread设备框架封装一个I2C设备--DS3231 前言 ENV配置 I2C测试 将ds3231封装成一个字符设备 结语 前言 学习rt thread的I2C的时候,恰巧手上的板子留了d ...

  9. linux gdb#039;查找寄存器地址,【Linux跟踪和调试】gdb

    8种机械键盘轴体对比 本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选? gdb是一个由GNU开源组织发布的.UNIX/LINUX操作系统下的.基于命令行的.功能强大的程序调试工具.对于一名Li ...

最新文章

  1. 通过构建城市来解释HTML,CSS和JavaScript之间的关系
  2. Android驱动学习-内部机制_回顾binder框架关键点
  3. 九、中缀表达式转为后缀表达式
  4. python线程卡死问题解决_python while True造成未响应或卡顿的解决方法
  5. redis作为hibernate的二级缓存
  6. 哥斯拉Godzilla webshell管理工具
  7. centos7 编译安装mysql-5.7.18
  8. libcurl curl_easy_setopt函数以及设置选项
  9. c语言混响,混响也是大学问,c与数字混响的区别-文章-数字音视工程网DAV01.COM...
  10. 苹果无人车四个最新专利:手势控制变道、车辆导流、路况感知及车辆控制
  11. centos 编译内核至2.6.39.4
  12. 【敏捷开发每日一贴】代码走查
  13. js 实现60秒倒计时
  14. 图片怎么转换成PDF,这三个方法轻松搞定!
  15. 加州大学圣地亚哥计算机硕士申请,美国加州大学圣地亚哥分校计算机工程硕士.pdf...
  16. 一只喵的西行记-10 哲学家H+计划
  17. **长庆油田.长庆局和四川石油管理局合并的通知(ZT)
  18. Android数据持久化
  19. 密歇根大学计算机专业怎么样,密歇根大学安娜堡分校UMich计算机科学Computer Science专业排名第26位(2021年THE世界大学商科排名)...
  20. 如何用计算机处理信息,计算机信息处理

热门文章

  1. formation计算机英语单词,计算机英语常用词汇_1000-1695_纯英文版
  2. jdk1.6 1.7 1.8下载地址
  3. linux tsql,linux下用tsql连接mssql数据库出错
  4. 比尔最“浪漫”的事 和IT一起慢慢变老
  5. ISO格式云主机创建QCOW2格式镜像
  6. 苹果系统测试硬盘软件怎么看,苹果电脑怎么检查或修好磁盘
  7. Linux下的cut选取命令详解
  8. 模糊查询:中文兼容苹果的原生输入法
  9. 在vi和vim上查找字符串
  10. 【计算机网络】MAC地址、IP地址以及ARP协议