进程中的数据结构下

在程序执行的过程中,一旦涉及到系统调用,就需要进入内核继续执行。那么如何将用户态和内核态的执行串起来。需要下面的两个重要变量:

struct thread_info    thread_info;
void  *stack;

用户态函数栈

栈是一个从高地址到低地址,往下增长的结构。
32位: 在CPU中,ESP是栈顶指针寄存器,EBP是栈基地址指针寄存器。函数返回的时候,返回值会保存在EAX寄存器中国,从栈中弹出返回地址,将指令跳转回去,参数也从栈中弹出,然后继续执行A
64位: rdi、rsi、rdx、rcx、r8、r9 这 6 个寄存器,用于传递存储函数调用时的 6 个参数。如果超过 6 的时候,还是需要放到栈里面。然而,前 6 个参数有时候需要进行寻址,但是如果在寄存器里面,是没有地址的,因而还是会放到栈里面,只不过放到栈里面的操作是被调用函数做的

内核态函数栈

32位的内核栈是8K,64位的内核栈是16K。
内核栈的最低地址是一个thread_info结构,在内核栈的最高地址,存放的是另一个结构pt_regs,32位和64位的定义不一样。

通过task_struct 找内核栈

task_struct的stack指针在手,可以通过下面的函数找到这个线程内核栈。至于怎么找pt_regs?找到栈底的位置然后再用指针操作,就可以找到内核寄存器

通过内核栈找task_struct

32位主要靠thread_info,64位主要靠Per-CPU变量

你可能感兴趣的:(操作系统)