如何查找x86-64平台上的内核堆栈位置

本文详细介绍了Linux内核中current宏如何获取当前CPU上的task_struct结构,主要通过percpu变量kernel_stack和thread_info结构体实现。在x86_64平台上,内核栈的起始地址由kernel_stack+KERNEL_STACK_OFFSET-THREAD_SIZE计算得出。在进程切换时,kernel_stack会更新以记录当前进程的内核栈位置。
摘要由CSDN通过智能技术生成

current宏在Linux 内核中负责获取当前cpu上的task_struct,通常是借助thread_info和内核栈实现
我们需要先找到对应的内核栈,内核栈的栈底位置就是thread_info结构体:
对于x86 64bit平台来说:

DECLARE_PER_CPU(unsigned long, kernel_stack);
212 
213 static inline struct thread_info *current_thread_info(void)
214 {
215     struct thread_info *ti;
216     ti = (void *)(percpu_read_stable(kernel_stack) +
217               KERNEL_STACK_OFFSET - THREAD_SIZE);
218     return ti;
219 }
220 

内核栈获取是通过读取kernel_stack这个percpu变量来得到的。那么整个过程是如何实现的呢:

定义kernel_stack percpu变量,通过kernel_stack + KERNEL_STACK_OFFSET - THREAD_SIZE即可获得内核栈的起始地址,所以kernel_stack 这个变量就是用来记录进程的内核栈的,在每次进程切换时,更新kernel_stack percpu变量记录当前进程的内核栈位置:

__notrace_funcgraph struct task_struct *
 __switch_to(struct task_struct *prev_p, struct task_struct *next_p)
 {
    percpu_write(kernel_stack,
           (unsigned long)task_stack_page(next_p) +
           THREAD_SIZE - KERNEL_STACK_OFFSET);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值