From 16611225b9821592419289e76edd1e52246a6f93 Mon Sep 17 00:00:00 2001 From: gatieme Date: Sat, 30 Jul 2016 16:46:21 +0800 Subject: [PATCH] =?UTF-8?q?=E7=80=B9=E5=B1=BD=E6=9D=BD=E6=B5=9C=E5=94=97hr?= =?UTF-8?q?ead=5Finfo=E9=90=A8=E5=8B=AB=EE=84=9F=E6=B6=94=3F..?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Makefile | 2 +- .../02-create/06-thread_info/README.md | 42 +++++++++++------- .../06-thread_info/images/thread_info.jpg | Bin 0 -> 22903 bytes 3 files changed, 28 insertions(+), 16 deletions(-) create mode 100644 study/kernel/01-process/02-create/06-thread_info/images/thread_info.jpg diff --git a/Makefile b/Makefile index 5ef71a2..3869e54 100644 --- a/Makefile +++ b/Makefile @@ -2,7 +2,7 @@ all:github -COMMIT="测试的proc_test的驱动proc_final包括只读proc_entry, 只写proc_entry和可读写proc_entry..." +COMMIT="完善了thread_info的学习..." .PHONY : github github: diff --git a/study/kernel/01-process/02-create/06-thread_info/README.md b/study/kernel/01-process/02-create/06-thread_info/README.md index 237d3d7..290b015 100644 --- a/study/kernel/01-process/02-create/06-thread_info/README.md +++ b/study/kernel/01-process/02-create/06-thread_info/README.md @@ -7,11 +7,11 @@ Linux进程内核栈与thread_info结构详解 -#前言 +#1 前言 ------- -##为什么需要内核栈 +##1.1 为什么需要内核栈 ------- * 进程在内核态运行时需要自己的堆栈信息, 因此linux内核为每个进程都提供了一个内核栈kernel stack, @@ -34,7 +34,7 @@ struct task_struct >需要注意的是,**内核态堆栈**仅用于内核例程,Linux内核另外为中断提供了单独的**硬中断栈**和**软中断栈** -##为什么需要thread_info +##1.2 为什么需要thread_info ------- * 内核还需要存储每个进程的PCB信息, linux内核是支持不同体系的的, 但是不同的体系结构可能进程需要存储的信息不尽相同, 这就需要我们实现一种通用的方式, 我们将体系结构相关的部分和无关的部门进行分离 @@ -42,7 +42,7 @@ struct task_struct 用一种通用的方式来描述进程, 这就是struct task_struct, 而thread_info就保存了特定体系结构的汇编代码段需要访问的那部分进程的数据,我们在thread_info中嵌入指向task_struct的指针, 则我们可以很方便的通过thread_info来查找task_struct -##将两种结构融合在一起 +##1.3 将两种结构融合在一起 ------- linux将内核栈和进程控制块thread_info融合在一起, 组成一个联合体thread_union @@ -51,10 +51,10 @@ linux将内核栈和进程控制块thread_info融合在一起, 组成一个联 -#内核数据结构描述 +#2 内核数据结构描述 ------- -##thread_union +##2.1 hread_union ------- 对每个进程,Linux内核都把两个不同的数据结构紧凑的存放在一个单独为进程分配的内存区域中: @@ -89,14 +89,26 @@ union thread_union 下图中显示了在物理内存中存放两种数据结构的方式。线程描述符驻留与这个内存区的开始,而栈顶末端向下增长。 下图摘自ULK3,进程内核栈与进程描述符的关系如下图: -![thread_info](./images/thread_info.gif) +![thread_info](./images/thread_info.jpg) -在这个图中,esp寄存器是CPU栈指针,用来存放栈顶单元的地址。在80x86系统中,栈起始于顶端,并朝着这个内存区开始的方向增长。从用户态刚切换到内核态以后,进程的内核栈总是空的。因此,esp寄存器指向这个栈的顶端。一旦数据写入堆栈,esp的值就递减。 +在这个图中, -同时我们可以看到, thread_info和内核栈虽然共用了thread_union结构, 但是thread_info大小固定, 存储在联合体的开始部分, 而内核栈由高地址向低地址扩展, 当内核栈的栈顶到达thread_info的存储空间时, 则会发生栈溢出 +* esp寄存器是CPU栈指针,用来存放栈顶单元的地址。在80x86系统中,栈起始于顶端,并朝着这个内存区开始的方向增长。从用户态刚切换到内核态以后,进程的内核栈总是空的。因此,esp寄存器指向这个栈的顶端。一旦数据写入堆栈,esp的值就递减。 -##task_struct中的内核栈stack +同时我们可以看到, + +* thread_info和内核栈虽然共用了thread_union结构, 但是thread_info大小固定, 存储在联合体的开始部分, 而内核栈由高地址向低地址扩展, 当内核栈的栈顶到达thread_info的存储空间时, 则会发生栈溢出 + +* 系统的current指针指向了当前运行进程的thread_union(或者thread_info)的地址 + +* 进程task_struct中的stack指针指向了进程的thread_union(或者thread_info)的地址, 在早期的内核中这个指针用struct thread_info *thread_info来表示, 但是新的内核中用了一个更浅显的名字void *stack, 即内核栈 + +即,进程的thread_info存储在进程内核栈的最低端 + + + +##2.2 task_struct中的内核栈stack ------- 我们之前在描述task_struct时就提到了其stack指针指向的是内核栈的地址。 @@ -133,7 +145,7 @@ task_thread_info用于通过task_struct来查找其thread_info的信息, 只需 ``` -##内核栈数据结构描述thread_info +##2.3 内核栈数据结构描述thread_info ------- thread_info是体系结构相关的,结构的定义在[thread_info.h](http://lxr.free-electrons.com/ident?v=4.5;i=thread_info)中 @@ -146,11 +158,11 @@ thread_info是体系结构相关的,结构的定义在[thread_info.h](http://l -#函数接口 +#3 函数接口 ------- -##内核栈与thread_info的通用操作 +##3.1 内核栈与thread_info的通用操作 ------- 原则上, 只要设置了预处理器常数`__HAVE_THREAD_FUNCTIONS`通知内核, 那么各个体系结构就可以随意在stack数组中存储数据。 @@ -222,7 +234,7 @@ static inline int kstack_end(void *addr) >前面我们在讲[_do_fork创建进程](http://blog.csdn.net/gatieme/article/details/51569932)的时候, 提到dup_task_struct会复制父进程的task_struct和thread_info实例的内容, 但是stack则与新的thread_info实例位于同一个内存, 这意味着父子进程的task_struct此时除了栈指针之外完全相同。 -##获取当前在CPU上正在运行进程的thread_info +##3.2 获取当前在CPU上正在运行进程的thread_info ------- 所有的体系结构都必须实现两个current和current_thread_info的符号定义宏或者函数, @@ -270,7 +282,7 @@ static inline int kstack_end(void *addr) >>请参见 :http://lxr.free-electrons.com/ident?v=4.5;i=current -##分配和销毁thread_info +##3.3 分配和销毁thread_info ------- 进程通过[alloc_thread_info_node](http://lxr.free-electrons.com/source/kernel/fork.c?v=4.5;#L161)函数分配它的内核栈,通过[free_thread_info](http://lxr.free-electrons.com/source/kernel/fork.c?v=4.5#L170)函数释放所分配的内核栈。 diff --git a/study/kernel/01-process/02-create/06-thread_info/images/thread_info.jpg b/study/kernel/01-process/02-create/06-thread_info/images/thread_info.jpg new file mode 100644 index 0000000000000000000000000000000000000000..795a265efef620843544db5c71d07a650db2eb4d GIT binary patch literal 22903 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