免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: feelsmile
打印 上一主题 下一主题

那位大牛能详细解释下硬件堆栈和软件堆栈? [复制链接]

论坛徽章:
0
11 [报告]
发表于 2007-10-20 19:28 |只看该作者
原帖由 jamesr 于 2007-10-20 11:55 发表
在MIPS上,除了2个寄存器保存函数返回值,4个寄存器保存传入参数,8个寄存器保存临时变量外,并非没有其他的方法报存更多的信息了。如果一个函数使用的自动变量多于8个怎么办?

MIPS上有一个寄存器保存栈指针 ...

>>实际上也不能说实模式下操作的是物理地址,物理地址都需要 MMU 进行转换。
>>实模式与保扩模式下的段机制并无两样。实模式与保扩模式下的程序使用都是逻辑地址,也就是说:segment : offset 这种形式。这种形>>式的地址都经过段机制转换为线性地址。实模式下就是物理地址,保护模式下没开启分页也为物理地址,在开启分页后是虚拟地址。

物理地址需要MMU转换是什么意思?以前我也看到版主这样提过,一直不明白,我认为有误。对于打开段机制来说,使用的都是逻辑地址,这我是同意的,如果版主指的MMU转换是逻辑地址到物理地址的转换,那我倒没什么异议。但这有点绝对,毕竟只有x86使用段机制,其它架构下实模式都直接使用物理地址。
此外,没开paging的保护模式确实使用逻辑地址,转换后为物理地址,多谢版主补充



>>实际上向什么方向增长并不是由操作系统和 endian 关系来决定。而是由 stack segment  的 descriptor 属性来决定。segment 的
>>descriptor 有个标志位 D/B 决定这个段是 expand-up 还是 expand-down

我这里说操作系统是指栈指针的起始地址取决于操作系统的地址空间布局,呵呵,那个帖子里是个长句,版主多半看走眼了。
栈增长方向。版主说的是对的。


>>x86_64 基本上去掉了段机制,但这不是完全的。CS、DS、SS 及ES 已经被忽略。除了 CS 的某些属性可用外。 FS/GS 还是可以用于>>>段机制来管理。所有的内存参考都是基于 0 。RSP 确实是实际的线指针。

是的,这个时候应该说是RSP了,不是ESP了。


>>若要从物理上去定义硬件栈结构,恐怕只有 X86 才有真正的硬件栈结构。那就是 x86 独特的浮点寄存器堆结构:
>>由 FR0 ~ FR7 浮点寄存器组成的一个浮点寄存栈结构。栈指针是:x87 的 status word 寄存器中有一个 top 域来指出栈顶,也就是逻>>辑上 ST(0) 就是栈顶,它可以对应 FR0~FR7 任一个寄存器。x87 的这个栈结构像一个圆形的环,栈满会自动回卷

寄存器多的RISC都有这种硬件栈,而且更先进和复杂,例如我前面提到的IA64和sparc。它们通常有多个指针寄存器来指明当前寄存器栈的脏区、清洁区,还有一个指针寄存器指向内存,当寄存器栈耗尽时还会自动把脏区压到内存中去,并且支持寄存器rename,也就是你看到的寄存器号只是逻辑号,和实际寄存器的对应由硬件转换。非常类似于我们程序中的栈。
但据我所知MIPS和alpha没有,因为它们通用寄存器少,只有32个,没用到这种机制。


[ 本帖最后由 zx_wing 于 2007-10-20 19:32 编辑 ]

论坛徽章:
0
12 [报告]
发表于 2007-10-20 19:39 |只看该作者
原帖由 jamesr 于 2007-10-20 11:55 发表
在MIPS上,除了2个寄存器保存函数返回值,4个寄存器保存传入参数,8个寄存器保存临时变量外,并非没有其他的方法报存更多的信息了。如果一个函数使用的自动变量多于8个怎么办?

MIPS上有一个寄存器保存栈指针 ...

jamesr再次修正了我的错误。刚才我还回复说MIPS没有这个硬件栈机制呢
那么对于参数多于4个情况下,MIPS是否仍然通过栈取参数呢?还是将8个保存局部变量的寄存器分配一部分做输入参数寄存器?
惭愧,我有《see mips run》,但一直没时间去看,偷懒问了

论坛徽章:
0
13 [报告]
发表于 2007-10-20 20:51 |只看该作者
提示: 作者被禁止或删除 内容自动屏蔽

论坛徽章:
0
14 [报告]
发表于 2007-10-20 21:04 |只看该作者
原帖由 jamesr 于 2007-10-20 20:51 发表


我也是一知半解

是的,过多的参数通过栈取得。
MIPS中32个通用寄存器除了$0以外都是可以任意使用的,如果你自己从头构建一个系统的话,你可以随意使用这些寄存器。但通常还是有一定的使用约定 ...

>>MIPS的栈就是典型的软件栈吧!提供一个栈的指针寄存器和一个栈帧指针的寄存器,其它工作都交给软件。
噢噢。是我理解错你的意思了。这里MIPS的使用方式和x86差不多。
我想成的是,当调用一个函数时,分配寄存器给函数使用,当发现寄存器不够用时,有一个专门的寄存器指针指向一个特定的内存,然后把所有寄存器的值push到这个指针的位置上去,再把寄存器给函数使用。函数返回时,再从这个特定的内存中把原先寄存器的值pop回寄存器。
嗯,看来mips还是没有硬件栈的用法。

论坛徽章:
0
15 [报告]
发表于 2007-10-20 21:35 |只看该作者
弱弱地问一下,x86上面函数调用时ip是保存在什么栈里面的呢?

论坛徽章:
0
16 [报告]
发表于 2007-10-20 21:46 |只看该作者
原帖由 tianqio 于 2007-10-20 21:35 发表
弱弱地问一下,x86上面函数调用时ip是保存在什么栈里面的呢?

如果是说函数的返回地址的话,它在软件栈上,也就是内存中。没记错的话,应该在ebp+8这个位置(刚进入函数的时候)。
如果是说程序运行时的PC值的话,那保存在eip寄存器中。

论坛徽章:
0
17 [报告]
发表于 2007-10-20 22:25 |只看该作者
原帖由 zx_wing 于 2007-10-20 19:28 发表

>>实际上也不能说实模式下操作的是物理地址,物理地址都需要 MMU 进行转换。
>>实模式与保扩模式下的段机制并无两样。实模式与保扩模式下的程序使用都是逻辑地址,也就是说:segment : offset 这种形式。这种 ...


>> 物理地址需要MMU转换是什么意思?以前我也看到版主这样提过,一直不明白,我认为有误。

呵呵~ 偶是承着前面几位的话而发言,前面提到在 x86 平台下。
x86 下程序里用的不是物理地址,物理地址是从线性地址转换的。
在实模式下:逻辑地址经过 MMU 转换为线性地址(0~0xFFFFF),也就是:0xf000:ffff 这就形式转换为 0xfffff 这种形式
            这个线性地址就是物理地址。
保护模式下:同样逻辑地址经过 MMU 转换为线性地址(0~0xFFFFFFFF),未开启分页时,线性地址就等于物理地址。
            分页下,再转换为物理地址。

论坛徽章:
0
18 [报告]
发表于 2007-10-20 22:26 |只看该作者
原帖由 zx_wing 于 2007-10-20 19:28 发表

>>实际上也不能说实模式下操作的是物理地址,物理地址都需要 MMU 进行转换。
>>实模式与保扩模式下的段机制并无两样。实模式与保扩模式下的程序使用都是逻辑地址,也就是说:segment : offset 这种形式。这种 ...


另外,我对其它平台不太熟。
你说的 IA64 和 sparc 是有硬件栈,我不清楚。

论坛徽章:
0
19 [报告]
发表于 2007-10-20 22:39 |只看该作者
原帖由 mik 于 2007-10-20 22:25 发表


>> 物理地址需要MMU转换是什么意思?以前我也看到版主这样提过,一直不明白,我认为有误。

呵呵~ 偶是承着前面几位的话而发言,前面提到在 x86 平台下。
x86 下程序里用的不是物理地址,物理地址是从线 ...

嗯,我明白你的意思了。你是说多一层逻辑地址的转换。
主要逻辑地址到线型地址转换没有什么太多的技术含量,就加一个段基地址而已。不像线型地址到物理地址转换那么复杂。而且现在操作系统倾向于不是用段,段基址多为0,虽然从概念上说使用的仍然是逻辑地址,我也没把它们细做区分的。但概念上确实是这样的。

论坛徽章:
0
20 [报告]
发表于 2007-10-20 22:47 |只看该作者
原帖由 zx_wing 于 2007-10-20 22:39 发表

嗯,我明白你的意思了。你是说多一层逻辑地址的转换。
主要逻辑地址到线型地址转换没有什么太多的技术含量,就加一个段基地址而已。不像线型地址到物理地址转换那么复杂。而且现在操作系统倾向于不是用段,段 ...


所以,偶前一个贴子就说明了,实模下和保护模式下的段机制没什么两样。

x86 的段机制不能被 disable 掉。即使 64位模式下也不能完全 disable。但还是可以看出 AMD 是想极力有一种方式 disable 掉段机制,无奈为了兼容,段机制在 x86 根深蒂固了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP