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

原创 2014年07月24日 23:12:11

在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_GDB
    if (gdb_mem_fault_handler) {
        regs->pc = (unsigned long)gdb_mem_fault_handler; 
        return;
    }
#endif

	rt_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_FINSH
	list_thread();
#endif
	rt_hw_cpu_shutdown();
}

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

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

然后告诉我们写入错误




工程已经放出

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

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


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

判断输入的字符串是否为合法IP地址的程序

判断输入的字符串是否为合法IP地址的程序今天写一个IP地址冲突检测程序的时候,写完之后用测试用例测试,发现所写程序没有判断所输入的ip地址是否为合法的IP地址,因此自己写了一个判断输入字符串是否为合法...
  • bad_good_man
  • bad_good_man
  • 2015年08月27日 11:38
  • 2015

Java中判断一个IP地址是否在一个网段内

要判断两个IP地址是不是在同一个网段,就将它们的IP地址分别与子网掩码做与运算,得到的结果一网络号,如果网络号相同,就在同一子网,否则,不在同一子网。...
  • C_PlayBoy
  • C_PlayBoy
  • 2015年07月01日 23:28
  • 4484

ajax判断url是否连通

昨天遇到了一个判断一个url请求是否是可连通的问题,无法避免的遇到了ajax跨域请求的问题,之后网上查了找到貌似可以行的2个办法,一个使用标签去动态的设置其src属性,不存在跨域问题,试了一遍,没试出...
  • xiawei308307786
  • xiawei308307786
  • 2013年10月07日 09:51
  • 1250

(rt-thread gdb)cm系列的GDB移植

待更
  • wzyy2
  • wzyy2
  • 2014年08月06日 15:07
  • 619

rt_thread_nano_stm32f30x

  • 2017年12月25日 17:20
  • 632KB
  • 下载

RT-Thread.pack

  • 2017年12月05日 14:15
  • 1.24MB
  • 下载

基于Mini2440平台的RT-Thread RTOS开发手册.pdf

  • 2014年03月20日 21:10
  • 717KB
  • 下载

RT-Thread用户手册

  • 2014年11月14日 17:12
  • 36.99MB
  • 下载

keil下Rt-Thread工程搭建

  • 2013年05月14日 14:36
  • 838KB
  • 下载

rt-thread广播机制测试源码

  • 2013年03月01日 20:14
  • 20KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:(rt-thread gdb)关于probe_kernel_write(判断地址是否可以写入)
举报原因:
原因补充:

(最多只允许输入30个字)