linux 栈空间?linux软件资源网站
大家好,关于linux 栈空间很多朋友都还不太明白,今天小编就来为大家分享关于linux软件资源网站的知识,希望对各位有所帮助!
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上设置栈空间上限,以确保应用程序正常运行。
首先,我们需要使用“ulimit”命令来检查当前栈空间上限的大小。我们可以使用以下命令来查看当前设置:
`ulimit–n`
该指令会显示当前shell使用的栈空间限制。如果结果显示低于需要的栈空间上限,那么就需要重新设置该限制。
要重新设置栈空间的上限,我们可以使用以下命令:
`ulimit-s stacksize`
其中“stacksize”为所需的栈空间限制(以KB为单位)。请注意,有时可能需要在使用该命令之前关闭并重新启动shell。
如果您想永久设置栈空间限制,那么您可以编辑shell的配置文件。比如,如果您使用bash,那么您可以编辑“~/.bashrc”文件并添加以下行:
`ulimit-s stacksize`
这样,每次启动shell时,都会设置栈空间限制为指定的值。
Linux也为服务器和工作站提供了“limit.conf”文件,允许您按照组或用户设置栈空间上限。您可以使用以下命令打开“/etc/security/limits.conf”文件:
`vim/etc/security/limits.conf`
然后添加以下行,指定用户的栈空间的上限:
`* hard stack stacksize`
这会以“stacksize”(以KB为单位)为用户设置栈空间上限。
通过以上步骤,我们可以在Linux上设置栈空间上限,以便应用程序正常运行。要正确设置栈空间,请确保栈空间上限高于应用程序所需的最大内存量。这可以帮助提高应用程序的性能,并确保它可以正常运行。
Linux进程虚拟地址空间的分布,以及堆和栈的区别
一、具体分布如图所示:
二、关于堆和栈
(1)分配方式:
栈:由编译器自动分配释放,存放函数的参数值,局部变量的值等。其操作方式类似于数据结构中的栈。
堆:一般由程序员分配释放,它的分配方式类似于链表。
(2)申请后系统的响应:
栈:只要所申请的空间小于栈的剩余空间,则系统为程序分配内存,否则栈溢出。
堆:操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,遍历该链表,找出第一个大于所申请空间的节点,然后将其从链表中删除并分配,如果没用完,则系统会把多余的重新放回到链表中。
(3)申请大小的限制:
栈:栈是高地址向低地址扩展的连续内存,栈的大小一般是2M;
堆:堆是低地址向高地址扩展的不连续内存,堆的大小与计算机有效的虚拟内存有关系。
(4)申请效率:
栈:由系统自动分配,速度较快;
堆:速度慢,容易产生内存碎片;
关于Linux命令的介绍,看看《linux就该这么学》,具体关于这一章地址3w(dot)linuxprobe/chapter-02(dot)html.