- 論壇徽章:
- 0
|
5可用積分
記得在linux內(nèi)核的do_page_fault中, 如果產(chǎn)生缺頁(yè)異常的地址不超過(guò)棧的增長(zhǎng)方向若干(32)字節(jié), 則內(nèi)核讓棧自動(dòng)增長(zhǎng).
而應(yīng)用程序編譯后, 進(jìn)入一個(gè)函數(shù)時(shí)總是直接就通過(guò)add esp把棧上的變量劃好了(棧上的變量應(yīng)該不限于32字節(jié)).
那么, 什么情況下會(huì)通過(guò)do_page_fault來(lái)擴(kuò)展棧呢? 函數(shù)調(diào)用時(shí), 如果esp超出了棧的范圍, 棧會(huì)得到擴(kuò)展嗎?
望指點(diǎn), 感激不盡~ |
最佳答案
查看完整內(nèi)容
Linux kernel判斷的是,如果你fault的address < esp - 32,認(rèn)為是非法的。因?yàn)樵L問(wèn)< esp的地址都是非法的,除了pusha, 它是先訪問(wèn)棧,然后在decrease esp,所以kernel加了32byte的余量。(看了一下最新的kernel, 又有了點(diǎn)變化,好像有了新的指令"enter",也和pusha一樣,但是有可能會(huì)access棧下65536+32*4的地方)你說(shuō)的情況是,棧上的局部變量,這些變量的地址不可能 < esp (先decrease esp, 然后再訪問(wèn)著些變量,產(chǎn)生page fault, k ...
|