免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1600 | 回复: 1
打印 上一主题 下一主题

[内核入门] Linux中的栈(Stack) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-11-03 22:41 |只看该作者 |倒序浏览
原文发表于:http://hi.baidu.com/sangwf/item/c8d20a440fea45adde2a9f55

栈(Stack)和堆(Heap)的区别,这里就不赘述了。如果你无法区分两者,这篇文章就不太适合你看。在研究Linux 0.12时,总是被其中关于栈切换的部分弄混,现在总算认识比较清楚了,做一个总结分享。

1. 栈的向下生长,是地址增加还是地址减小?


可能是某位前辈喜欢将内存结构画成柱状的,最下面是小地址,最上面是大地址,所谓向下生长,就是地址减小。比如你执行push eax,就等价于sub esp, 4; mov [esp], eax。即先将esp的值(一个地址)减少4,然后将eax的值存在esp所指向的地址中。对于x86体系中,数值的表示是Little-Endian的,即数值的低位存放在低地址,高位存在于高地址。假设esp的值是0x10000004,eax的值是0x12345678,那么执行push eax后,esp变成了0x10000000,[0x10000000] = 0x78,[0x10000001] = 0x56,[0x10000002] = 0x34,[0x10000003] = 0x12。

2. 内核栈和用户栈的关系

如果没有研究过内核,可能会认为一个任务只有一个栈,没有所谓内核栈和用户栈的区分。事实上我现在还觉得除了更易开发方面的考虑,为何要存在内核栈?网上许多信息都说是为了安全,到底是怕谁破坏谁呢?是内核破坏用户进程?这个有点说不过去,内核其实什么都能干,还怕内核写错了,一不小心把用户栈中的内容搞坏了?还是怕用户进程破坏了内核栈?而一个进程要么处于内核态,要么处于用户态。内核态可以理解为是无状态的,也就是本次的内核态执行,并不依赖于上次的内核态信息。一旦在用户态中,内核态所使用的现场就会清理干净,就不存在被破坏的问题了。

用户态的进程在运行时,分配临时变量,或者函数调用的参数传递,都会使用到用户栈。当进行系统调用时,就会将用户栈的ss和esp压入到内核栈,还有其它的如EIP压入内核栈,然后进行系统调用。系统调用是软中断,通过这种方式进入到了内核态,调用的整个过程就是使用内核栈了。而每一次系统调用时,内核栈的ss和esp是直接从TSS任务段中获取的,也就是每次都是固定的空栈。

3. 硬件中断时,用的是什么栈?

系统调用是软中断,硬件中断(如键盘、时钟)是硬中断,两者处理过程中一般都是用的当前运行进程的内核栈(Linux内核的新版本中,在内核栈<=4k时,系统会为每个CPU分配一个独立的硬中断栈,避免使用用户进程内核栈带来的栈溢出的问题)。中断有优先级和是否可抢占的机制。如果一个中断处理逻辑被一个新的高优先级中断所打断,处理逻辑就像执行了一次函数调用,结束后在返回。中断程序中,要注意保护现场,用完什么寄存器,在结束时要恢复到原状。一般通过开始时push到栈,结束时pop恢复来实现。

4. ebp与esp的关系

ebp主要进行一些协助工作。一般在函数调用时,先push ebp,将旧的ebp压入栈中,然后mov ebp, esp,即将esp的值保存在ebp中。为什么要这么使用呢?你想想看,栈主要用于临时变量的分配,中间分配个若干次,esp指向的地址都不知道偏到哪里了,如果再想获取最开始的函数参数,那就麻烦透了。有了ebp,就可以通过ebp+n的方式,获取到对应的参数值。同时,在函数执行完毕时,通过mov esp, ebp,直接将esp移动到最开始的位置,省的中间算偏移的时候算错,引起更大的问题。然后执行pop ebp,又将ebp恢复到了开始的值。

以上四点是我遇到的最困惑的几个问题,如果你还有其他疑问,请反馈给我再补充上去。

论坛徽章:
15
射手座
日期:2014-02-26 13:45:082015年迎新春徽章
日期:2015-03-04 09:54:452015年辞旧岁徽章
日期:2015-03-03 16:54:15羊年新春福章
日期:2015-02-26 08:47:552015年亚洲杯之卡塔尔
日期:2015-02-03 08:33:45射手座
日期:2014-12-31 08:36:51水瓶座
日期:2014-06-04 08:33:52天蝎座
日期:2014-05-14 14:30:41天秤座
日期:2014-04-21 08:37:08处女座
日期:2014-04-18 16:57:05戌狗
日期:2014-04-04 12:21:33技术图书徽章
日期:2014-03-25 09:00:29
2 [报告]
发表于 2013-11-04 08:51 |只看该作者
学习学习!!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP