亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊(cè) 查看新帖 |

Chinaunix

  平臺(tái) 論壇 博客 文庫(kù)
最近訪問(wèn)板塊 發(fā)新帖
查看: 3176 | 回復(fù): 7
打印 上一主題 下一主題

[求助] 關(guān)于棧的擴(kuò)展 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報(bào)告]
發(fā)表于 2009-08-12 23:27 |只看該作者 |倒序?yàn)g覽
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 ...

論壇徽章:
0
2 [報(bào)告]
發(fā)表于 2009-08-12 23:27 |只看該作者

回復(fù) #1 kouu 的帖子

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, kernel expand stack)。expand stack的話,根據(jù)vma->start 和 fault的address決定expand幾個(gè)page。
        
        vma = find_vma(mm, address);
        if (!vma)
                goto bad_area;
        if (vma->vm_start <= address)
                goto good_area;
        if (!(vma->vm_flags & VM_GROWSDOWN))
                goto bad_area;
        if (error_code & 4) {
                /*
                 * accessing the stack below %esp is always a bug.
                 * The "+ 32" is there due to some instructions (like
                 * pusha) doing post-decrement on the stack and that
                 * doesn't show up until later..
                 */
                if (address + 32 < regs->esp)
                        goto bad_area;
        }
        if (expand_stack(vma, address))
                goto bad_area;

[ 本帖最后由 eexplorer 于 2009-8-13 09:40 編輯 ]

論壇徽章:
0
3 [報(bào)告]
發(fā)表于 2009-08-12 23:36 |只看該作者
你說(shuō)的是用戶態(tài)的棧吧? 內(nèi)核態(tài)的好像是固定的。

論壇徽章:
0
4 [報(bào)告]
發(fā)表于 2009-08-13 09:21 |只看該作者
lz的問(wèn)題我也沒(méi)想通,關(guān)注。
個(gè)人感覺(jué)這樣應(yīng)該會(huì)造成段錯(cuò)誤。
另外,貌似現(xiàn)在用戶堆棧擴(kuò)展的大小已經(jīng)不限于32字節(jié)了
而是65536 + 32 * sizeof(unsigned long),
do_page_fault注釋寫的清楚,這是因?yàn)閤86的enter指令的引入
這么大的限制應(yīng)該不太容易越界了吧。。。

論壇徽章:
0
5 [報(bào)告]
發(fā)表于 2009-08-13 09:46 |只看該作者

回復(fù) #4 eexplorer 的帖子

To ls
棧上局部變量地址確實(shí)不會(huì)<esp,但是在進(jìn)入函數(shù)的時(shí)候esp是直接加上一個(gè)數(shù)來(lái)給局部變量留出空間的,假如局部變量很多的話,這時(shí)esp可能指向堆棧合法空間之下很遠(yuǎn)的位置,如果在這個(gè)函數(shù)中直接訪問(wèn)最低地址的變量不是就會(huì)超出linux給定的棧擴(kuò)展限制么?

論壇徽章:
0
6 [報(bào)告]
發(fā)表于 2009-08-13 09:55 |只看該作者
原帖由 peimichael 于 2009-8-13 09:46 發(fā)表
To ls
棧上局部變量地址確實(shí)不會(huì)


在acct_stack_growth()會(huì)check你說(shuō)的這種情況,

        if (size > rlim[RLIMIT_STACK].rlim_cur)
                return -ENOMEM;

論壇徽章:
0
7 [報(bào)告]
發(fā)表于 2009-08-13 10:36 |只看該作者
哦,明白了,非常感謝 eexplorer 兄~

之前最大的誤解就是: 處理缺頁(yè)異常時(shí),不是以vma來(lái)判斷棧的大小,而是以當(dāng)時(shí)的esp。

那么,esp是可以由用戶態(tài)程序自由控制增減的,do_page_fault應(yīng)該不能判斷esp的當(dāng)前值是不是被用戶程序惡意加減過(guò)。 這里應(yīng)該就只有靠 rlim 來(lái)限制了。 是這樣吧?

論壇徽章:
0
8 [報(bào)告]
發(fā)表于 2009-08-13 10:48 |只看該作者

回復(fù) #7 kouu 的帖子

> 那么,esp是可以由用戶態(tài)程序自由控制增減的,do_page_fault應(yīng)該不能判斷esp的當(dāng)前值是不是
> 被用戶程序惡意加減過(guò)。 這里應(yīng)該就只有靠 rlim 來(lái)限制了。 是這樣吧?

這個(gè)kernel應(yīng)該判斷不了,acct_stack_growth會(huì)判斷
1. 有沒(méi)有超過(guò)address space limit (RLIMIT_AS)
2. stack limit (RLIMIT_STACK)
3. 有沒(méi)有enough free memory

如果out of memory的話,kernel應(yīng)該會(huì)首先kill掉這個(gè)process
您需要登錄后才可以回帖 登錄 | 注冊(cè)

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號(hào)-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號(hào):11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報(bào)專區(qū)
中國(guó)互聯(lián)網(wǎng)協(xié)會(huì)會(huì)員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過(guò)ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請(qǐng)注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP