如何查詢x86 64平台上的核心堆疊位置

2021-10-14 04:12:21 字數 875 閱讀 4688

current巨集在linux 核心中負責獲取當前cpu上的task_struct,通常是借助thread_info和核心棧實現

我們需要先找到對應的核心棧,核心棧的棧底位置就是thread_info結構體:

對於x86 64bit平台來說:

declare_per_cpu

(unsigned

long

, kernel_stack)

;212

213static

inline

struct thread_info *

current_thread_info

(void

)214

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);

在x86 64平台上編譯龍芯平台go執行環境

系統 deepin v20 平台 x86 64 交叉編譯器 mips loongson gcc7.3 2019.06 29 linux gnu,即gcc 7.3.1。待後續更正 wget交叉編譯化境搭建見在x86 64平台上搭建龍芯mips64交叉編譯環境 安裝git sudo apt instal...

在 x86 64平台下 除錯 arm 的使用者態程式

實驗 arm 使用者態程式是本地交叉編譯出來的,如果是別的程式直接拷貝過來,可能會有相容性問題 file hello hello elf 32 bit lsb executable,arm,eabi5 version 1 sysv dynamically linked,interpreter lib...

6410平台上配置WIN CE的DDR引數

win ce系統中配置ddr引數主要有以下幾個檔案,當然ddr的時序引數就不贅述,此處敘述主要是大小和位址引數。1,檔案memparam mddr.inc中 dmc1 mem cfg memory configuration register dmc1 mem cfg2 memory configu...