DragonOS icon indicating copy to clipboard operation
DragonOS copied to clipboard

feat: debug kernel stack

Open Godones opened this issue 7 months ago • 11 comments

目标: 检测内核栈溢出bug 实现: 在分配内核栈时手动在内核高位地址空间分配一个映射区间,同时保留一块未映射区域

Godones avatar May 23 '25 13:05 Godones

@fslongjin 请帮我看看这段代码实现有什么错误吗?感觉没什么错误,但是无法运行

Godones avatar May 23 '25 13:05 Godones

@fslongjin 请帮我看看这段代码实现有什么错误吗?感觉没什么错误,但是无法运行

具体是啥问题,贴一下报错?

chiichen avatar May 23 '25 13:05 chiichen

image 运行到这里内核就结束了

Godones avatar May 23 '25 13:05 Godones

image 运行到这里内核就结束了

是固定挂在这还是在启动阶段随机挂的

chiichen avatar May 23 '25 14:05 chiichen

固定这个位置

Godones avatar May 23 '25 14:05 Godones

具体位置是开启中断后,我打印了中断处理信息,发现发生了几次中断,然后就结束了

Godones avatar May 23 '25 14:05 Godones

具体位置是开启中断后,我打印了中断处理信息,发现发生了几次中断,然后就结束了

刚才看了一下,暂时没发现问题,我明天认真看看。

fslongjin avatar May 23 '25 15:05 fslongjin

我为x86加了kernel wp的保护,现在这个机制能检测到栈溢出了。但是还存在以下问题:

  1. 要分配多一倍的内存
  2. 栈溢出的时候,do_kern_addr_fault没实现。难以看到栈回溯。

fslongjin avatar Jun 09 '25 06:06 fslongjin

我为x86加了kernel wp的保护,现在这个机制能检测到栈溢出了。但是还存在以下问题:

  1. 要分配多一倍的内存
  2. 栈溢出的时候,do_kern_addr_fault没实现。难以看到栈回溯。

内核栈的检测只是用来debug使用,在内核稳定后应该使用原有的实现,所以分配多一倍的内存并没有太多的副作用。 由于只有触发异常才能检测到栈溢出,很难从异常处理中进行堆栈回溯,这里只是暂时打印了触发该异常的函数

Godones avatar Jun 09 '25 13:06 Godones

我在想,异常处理程序里面不是有发生异常时的栈指针吗?那为啥不能traceback哈哈哈

fslongjin avatar Jun 09 '25 13:06 fslongjin

使用unwind进行堆栈展开时,它的工作方式是从当前栈帧逐步向上展开的,它不能对异常处理函数进行展开

Godones avatar Jun 09 '25 13:06 Godones