理解Linux内核栈可以从以下几个方面来考虑:
内核态与用户态:在阅读Linux内核及相关资料时,需要明确它所描述的是内核态还是用户态的内容。这有助于理解所讨论的是在哪个执行环境下进行的操作。
进程与线程的描述:用户态的进程和线程在内核中都使用一个task_struct结构实例进行描述。类似于设计模式中的桥接模式(handle-body),用户态所看到的进程PID和线程TID可以视为handle,而task_struct就是body。
堆和栈的用户态概念:C语言书籍中对堆和栈的大部分讨论都是针对用户态的概念。用户态的堆和栈对应于用户进程虚拟地址空间中的某个区域,栈向下增长,堆通过malloc分配,向上增长。
用户空间堆栈的描述:用户空间堆栈在task_struct->mm->vm_area中进行描述,它们都属于进程虚拟地址空间的一个区域。
内核态的栈描述:内核态的栈描述在task_struct->stack中,栈的底部是thread_info对象。通过thread_info对象可以快速获取task_struct对象。整个栈区域通常只有一页内存(可配置),在32位系统中为4KB。
进程的内核栈:因此,进程的内核栈也是进程私有的,只需从task_struct->stack获取即可。
内核态的堆概念:内核态没有进程堆的概念,内存分配使用kmalloc()函数,实际上是由Linux内核统一管理的。一般情况下,使用slab分配器,它是一个内存缓存池,管理所有可通过kmalloc()分配的内存。因此,从原理上看,在Linux内核态,kmalloc分配的内存可以被所有运行在Linux内核态的任务访问到。
通过以上解析,我们可以更好地理解Linux内核栈及其与用户态堆栈和内核态堆的区别与联系。
刚好,我这里有上位机入门,学习线路图,各种项目,需要留个6。