Я пытался понять, как работает макрос current
, поэтому начал просматривать исходный код ядра Linux версии 4.19.Пытался понять для архитектуры x86
include / asm-generic / current.h: 8
#define get_current() (current_thread_info()->task)
#define current get_current()
Затем я попытался найти определение current_thread_info ().
include / linux / thread_info.h
#ifdef CONFIG_THREAD_INFO_IN_TASK
/*
* For CONFIG_THREAD_INFO_IN_TASK kernels we need <asm/current.h> for the
* definition of current, but for !CONFIG_THREAD_INFO_IN_TASK kernels,
* including <asm/current.h> can cause a circular dependency on some platforms.
*/
#include <asm/current.h>
#define current_thread_info() ((struct thread_info *)current)
#endif
Затем я попытался найти текущее определение
arch / x86 / include / asm / current.h
DECLARE_PER_CPU(struct task_struct *, current_task);
static __always_inline struct task_struct *get_current(void)
{
return this_cpu_read_stable(current_task);
}
#define current get_current()
get_current () снова возвращает struct task_struct, почему мы типизируем его в struct thread_info в current_thread_info ().
Не могли бы вы объяснить, как выполняется текущий.Я где-то читал, что он находится вверху или внизу стека ядра