当前位置:首页 » 操作系统 » linux内核堆栈

linux内核堆栈

发布时间: 2024-08-27 13:41:47

linux内核中用户空间栈和内核栈的区别

您好,很高兴为您解答。

1.进程的堆栈

内核在创建进程的时候,在创建task_struct的同事,会为进程创建相应的堆栈。每个进程会有两个栈,一个用户栈,存在于用户空间,一个内核栈,存在于内核空间。当进程在用户空间运行时,cpu堆栈指针寄存器里面的内容是用户堆栈地址,使用用户栈;当进程在内核空间时,cpu堆栈指针寄存器里面的内容是内核栈空间地址,使用内核栈。

2.进程用户栈和内核栈的切换

当进程因为中断或者系统调用而陷入内核态之行时,进程所使用的堆栈也要从用户栈转到内核栈。

进程陷入内核态后,先把用户态堆栈的地址保存在内核栈之中,然后设置堆栈指针寄存器的内容为内核栈的地址,这样就完成了用户栈向内核栈的转换;当进程从内核态恢复到用户态之行时,在内核态之行的最后将保存在内核栈里面的用户栈的地址恢复到堆栈指针寄存器即可。这样就实现了内核栈和用户栈的互转。

那么,我们知道从内核转到用户态时用户栈的地址是在陷入内核的时候保存在内核栈里面的,但是在陷入内核的时候,我们是如何知道内核栈的地址的呢?

关键在进程从用户态转到内核态的时候,进程的内核栈总是空的。这是因为,当进程在用户态运行时,使用的是用户栈,当进程陷入到内核态时,内核栈保存进程在内核态运行的相关信心,但是一旦进程返回到用户态后,内核栈中保存的信息无效,会全部恢复,因此每次进程从用户态陷入内核的时候得到的内核栈都是空的。所以在进程陷入内核的时候,直接把内核栈的栈顶地址给堆栈指针寄存器就可以了。

3.内核栈的实现

内核栈在kernel-2.4和kernel-2.6里面的实现方式是不一样的。

在kernel-2.4内核里面,内核栈的实现是:

Uniontask_union{
Structtask_structtask;
Unsignedlongstack[INIT_STACK_SIZE/sizeof(long)];
};

其中,INIT_STACK_SIZE的大小只能是8K。

内核为每个进程分配task_struct结构体的时候,实际上分配两个连续的物理页面,底部用作task_struct结构体,结构上面的用作堆栈。使用current()宏能够访问当前正在运行的进程描述符。

注意:这个时候task_struct结构是在内核栈里面的,内核栈的实际能用大小大概有7K。

内核栈在kernel-2.6里面的实现是(kernel-2.6.32):

Unionthread_union{
Structthread_infothread_info;
Unsignedlongstack[THREAD_SIZE/sizeof(long)];
};

其中THREAD_SIZE的大小可以是4K,也可以是8K,thread_info占52bytes。

当内核栈为8K时,Thread_info在这块内存的起始地址,内核栈从堆栈末端向下增长。所以此时,kernel-2.6中的current宏是需要更改的。要通过thread_info结构体中的task_struct域来获得于thread_info相关联的task。更详细的参考相应的current宏的实现。

structthread_info{
structtask_struct*task;
structexec_domain*exec_domain;
__u32flags;
__u32status;
__u32cpu;
…..
};

注意:此时的task_struct结构体已经不在内核栈空间里面了。


如若满意,请点击右侧【采纳答案】,如若还有问题,请点击【追问】

希望我的回答对您有所帮助,望采纳!

~ O(∩_∩)O~

❷ Linux内存堆栈段管理机制研究linux堆栈段

Linux内存管理机制研究
Linux内存管理机制包括堆栈段管理,在内存空间运行程序或处理数据时,堆栈段管理为Linux及其应用程序提供了很大的方便。本文将重点介绍 Linux 内存管理机制下的堆栈段管理系统。
Linux 内存管理机制下的堆栈段管理机制,是 Linux 操作系统对内存空间进行管理的一种算法。它通过将内存空间划分为不同的段,而这些段又有不同的属性和用途,实现对内存空间的更加高效管理。
堆栈段管理机制下,内存空间将分为堆、栈和数据段,其中数据段用于存储数据,堆用于动态内存分配,栈用于存放函数调用的参数和局部变量。
实际的内存分配采用分段存取技术,其实现机制如下:
1.将每一段分配一段编号,同时为每个段设定一个基地址,不同段之间有一个偏移量,以表示不同段之间的位置关系;
2.给每一段设置一个长度,用于存储数据或代码,其中堆和栈的长度在运行时是可以变的,数据段的长度在程序编译完毕后是固定的;
3.为每一段分配允许的访问权限,段中可以有一个或多个字节的数据,可以读取数据的权限也可以写数据的权限,而数据段则可以设置允许读入及写出的权限。
段管理机制下,每个段中可以有允许多个地址,这些地址形成一个大地址空间,Linux 将它抽象成虚拟地址空间,用户程序只需要管理虚拟地址,而不需要在意其内存的实际地址,从而减少了程序员的工作量,提高了程序开发的效率,这也是Linux 内存管理服务下程序编写效率之所在。
总之,Linux 内存管理机制中的堆栈段管理,可以有效管理内存空间,保证程序运行及数据处理的高效安全。综上所述,Linux 内存管理机制下的堆栈段管理是 Linux 操作系统实现内存空间高效管理的不可或缺的一环,其重要性不容忽视。

❸ linux中断处理程序使用的堆栈是内核的堆栈吗,在哪里

当然是,进程生成时,会被分配一个task_struct 结构(常说的进程控制块),2.4内核中,在task_struct 结构体上面的7KB空间就是。加上task_struct结构本身(1KB),进程内核栈共8KB(两个页面 ),不会动态扩展,所以非常有限(你会见到内核代码用"大块"内存都会kmalloc申请的,就是这个原因)。2.6内核的没注意,不知一样否。详见:《Linux内核源代码情景分析(上)》267页。
为什么会在内核的原因是CPU的保护机制,中断处理需要更高的权限(可能执行硬件相关的操作),故要在0级,不会在用户区的。

热点内容
支付宝支付密码如何修改 发布:2024-11-25 06:38:47 浏览:923
java开发要学习什么技术 发布:2024-11-25 06:20:28 浏览:1000
java猿 发布:2024-11-25 06:18:36 浏览:127
如何刷安卓44 发布:2024-11-25 06:18:32 浏览:529
安卓手机怎么限制app时间 发布:2024-11-25 06:14:15 浏览:403
福建虚拟服务器管理软件云服务器 发布:2024-11-25 06:05:46 浏览:106
android加载图片 发布:2024-11-25 06:05:00 浏览:168
linux的ls 发布:2024-11-25 05:47:56 浏览:844
oracle存储过程游标实例 发布:2024-11-25 05:40:32 浏览:804
xpsql2000 发布:2024-11-25 05:20:20 浏览:372