怎么理解linux内核栈?

关于linux内核栈,一直很困惑,找不到详细资料。 1. linux内核栈是所有进程共享的吗,每个进程都有一个单独的内核栈? 2. 从内核模块编程的角…
关注者
288
被浏览
121,873
登录后你可以
不限量看优质回答 私信答主深度交流 精彩内容一键收藏

1. 读Linux内核以及相关的资料的时候,时刻要清醒地认识到它说的是内核态还是用户态的东西。

2. 一个用户态进程/线程在内核中都是用一个task_struct的实例描述的,这个有点类似设计模式里面的桥接模式(handle-body), 用户态看到的进程PID,线程TID都是handle, task_struct是body。

3. C语言书里面讲的堆、栈大部分都是用户态的概念,用户态的堆、栈对应用户进程虚拟地址空间里的一个区域,栈向下增长,堆用malloc分配,向上增长。

4. 用户空间的堆栈,在task_struct->mm->vm_area里面描述,都是属于进程虚拟地址空间的一个区域。

5.而内核态的栈在tsak_struct->stack里面描述,其底部是thread_info对象,thread_info可以用来快速获取task_struct对象。整个stack区域一般只有一个内存页(可配置),32位机器也就是4KB。

6. 所以说,一个进程的内核栈,也是进程私有的,只是在task_struct->stack里面获取。

7. 内核态没有进程堆的概念,用kmalloc()分配内存,实际上是Linux内核统一管理的,一般用slab分配器,也就是一个内存缓存池,管理所有可以kmalloc()分配的内存。所以从原理上看,在Linux内核态,kmalloc分配的所有的内存,都是可以被所有运行在Linux内核态的task访问到的。