• 操作系统访问内存异常问题排查


    在写内核代码的时候定义了一个结构体,在往结构体里属性赋值时访问内存异常,直接jump到未知地址。

    代码如下:

     在执行stack->function=function时报错。

    排查过程:

    考虑是否是代码写的有问题,先在本机编写相同代码用gcc编译运行来测试,结果没有任何问题。

    考虑是否是stack->function这个内存地址问题,可能是这个内存地址不能读写导致,通过gdb编译查看stack->function的内存地址为

     初看好像没有问题,是在内核地址的高1G范围内,但是当时忽略了这个地址的页表是否有问题。

    后来查看当执行到这个地方时的页表内容为:

     可以看到这个0xc0103ff0虚拟地址在页表里是没有映射项的。

    然后分析stack->function的内存地址是malloc_page分配的,然后给malloc_page分配的起始又加上了4096来定位到该页的高地址。代码如下:

     这里就有个问题,就是C语言里的 地址加   和   数字加  的区别。具体可以查相关博客,关键词:C语言指针加1。这里是指针加一,所以并不是期望的地址值加上4096,而是加上了2^14次方,导致地址值超过了分配的地址最大值,页表里找不到映射项,所以访问地址异常。

    代码改成注释的那段就可以解决这个问题,让pcb->thread_stack的地址落在了页表的映射项上。

  • 相关阅读:
    BZOJ1029_建筑抢修_KEY
    黑匣子_KEY
    食物链_KEY
    滑雪_KEY
    抓猫_KEY
    线段树初步__ZERO__.
    听说alphago又要挑战sc2了?——我眼中的人工智能
    我眼中的算法
    opencv拼接相关1
    Cstring到string
  • 原文地址:https://www.cnblogs.com/caiyao/p/13807481.html
Copyright © 2020-2023  润新知