1、首先内核态的进程堆栈,另一个是紧挨进程描述符的数据结构thread_info,叫线程描述符,内核的堆栈大小一般为8KB,也就是8192个字节,占用两个页。
2、接着thread_union结构体的大小为8192个字节,也就是stack数组的大小,类型是unsigned long类型,由于联合体中的成员变量都是占用同一块内存区域。
3、然后有一个前提假设,成员占用的字节数相同,当成员所占的字节数不同时,只会覆盖相应的字节,对于thread_union联合体可以同时访问这两个成员,只要能够正确获取到两个成员变量的地址。
4、接着用于保存各种特定的进程标志,最重要的两个是TIF_SIGPENDING,如果进程有待处理的信号就置位,TIF_NEED_RESCHED表示进程应该需要调度器选择另一个进程替换本进程执行。
5、然后PC指针在dev_get_by_flags中,不能访问的内核虚地址为45685516,内核中一般可访问的地址都是以0xCXXXXXXX开头的地址。
6、最后在fault.c文件中,__do_kernel_fault函数打印中Unable to handle kernel pagi荏鱿胫协ng request at virtual address 45685516,该地址是内核空间不可访问的地址。