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...