精華區beta C_and_CPP 關於我們 聯絡資訊
最近寫 c code 一直想釐清一些問題 跟c程式沒有很直接相關,若發在這不妥再請麻煩版友告知了 m(_ _)m 最近在研讀virtual memory相關知識,大致上了解paging的運作模式 但仍不太懂 stack 往下長的實際情況是如何運作? stack就我的理解基本上是: 程式在執行 function call 時,堆疊便會一直往下長 [問題一] process 是在 loading 時才知道分配到的 stack 的起始位置嗎? [問題二] stack overflow 如何判定? 在此 stack 的大小是由誰決定的呢? [問題二] 如果有多個 process 同時運作,各自 stack 的起始位置又是如何分配呢? (一直往下長不會撞到嗎@@) (當某 process 需要的 stack 大小超過兩個 page 又是如何維護? page 如果不連續怎麼辦?) [問題三] 一個程式有code, text區段,是直接從 heap 下面開始剩餘記憶體 隨機取一page各自載入嗎?還是 memory 還有在更細分區塊? 還請各位前輩指教,或是指引我關鍵字QQ 我會去查資料 小弟目前正在研讀"程式設計師的自我修養-連結,載入,程式庫" 這本書寫的很詳細,卻又引出更多疑問 orz -- ◣▂ 丹丹先生,請問你對其他速食店降價 丹你老木! _ 心嘛? ▂▂▂ |════ ◤◤ ▁▃▃˙˙ ▇▇▇▇▇▇▇█ ╭═╮ █████ __ [TV] ██ ◥▆▄_◥██▄▃◢█◣ φjeans1020 -- ※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.132.251.85 ※ 文章網址: https://www.ptt.cc/bbs/C_and_CPP/M.1472306744.A.290.html
stupid0319: 看雪學院有一本加密與解密,有反組譯教學,可以看看 08/27 22:21
epithet: 二、可以在 stack 外圍設立一小段禁止寫入的區域,越界時 08/27 23:26
epithet: 才會觸動 二、 同一個 CPU 下,不會真的同時運作,切到 08/27 23:36
epithet: 的那個行程如果跟人相撞...其他行程的資料會被移到別處 08/27 23:38
b0920075: stack好像有個機制會把一個值放在stack裡面,會檢察看 08/28 01:37
b0920075: 有沒有被更改為其他值,有改到表示溢出。 08/28 01:37
kyuudonut: 謝謝各位前輩的回覆! 08/28 17:45
> -------------------------------------------------------------------------- < 作者: descent (「雄辯是銀,沉默是金」) 看板: C_and_CPP 標題: Re: [問題] memory stack 的問題 時間: Sat Aug 27 23:51:58 2016 ※ 引述《kyuudonut (善良老百姓)》之銘言: : 最近寫 c code 一直想釐清一些問題 : 跟c程式沒有很直接相關,若發在這不妥再請麻煩版友告知了 m(_ _)m : 最近在研讀virtual memory相關知識,大致上了解paging的運作模式 : 但仍不太懂 stack 往下長的實際情況是如何運作? : stack就我的理解基本上是: : 程式在執行 function call 時,堆疊便會一直往下長 : [問題一] process 是在 loading 時才知道分配到的 stack 的起始位置嗎? 載入一個 執行檔時, 要做一些事情, 設定這個 process sp 暫存器這是其中一件事。 : [問題二] stack overflow 如何判定? 在此 stack 的大小是由誰決定的呢? 編譯器可以插入檢查碼, 請參考 http://descent-incoming.blogspot.tw/2013/05/gcc-fstack-protector.html 作業系統可以運用 page fault 來知道 process stack 爆了。 stack 大小由作業系統決定, 執行檔格式可能也可以帶這個資訊, 讓作業系統參考。 : [問題二] 如果有多個 process 同時運作,各自 stack 的起始位置又是如何分配呢? : (一直往下長不會撞到嗎@@) 在 process 切換時, sp 暫存器會被存起來, 作業系統會為每個 process 規劃好其 stack 使用大小, 在 context switch 時, 把 sp 指到分配好的那個 stack 區域。 看 os 設定, 可以設計成讓 process stack 相互蓋到, 也可以不要蓋到。你一定選那種不會蓋到的 os 吧 : (當某 process 需要的 stack 大小超過兩個 page 又是如何維護? : page 如果不連續怎麼辦?) 沒研究, 但應該要連續的 page 才可以。 : [問題三] 一個程式有code, text區段,是直接從 heap 下面開始剩餘記憶體 : 隨機取一page各自載入嗎?還是 memory 還有在更細分區塊? 看不懂這個問題。你是要問載入執行檔時, code, text segment 怎麼被分配的 嗎? : 還請各位前輩指教,或是指引我關鍵字QQ 我會去查資料 : 小弟目前正在研讀"程式設計師的自我修養-連結,載入,程式庫" : 這本書寫的很詳細,卻又引出更多疑問 orz 你有2個問題二 > -------------------------------------------------------------------------- < 作者: tinlans ( ) 看板: C_and_CPP 標題: Re: [問題] memory stack 的問題 時間: Mon Aug 29 13:36:39 2016 ※ 引述《kyuudonut (善良老百姓)》之銘言: : 最近在研讀virtual memory相關知識,大致上了解paging的運作模式 : [問題二] 如果有多個 process 同時運作,各自 stack 的起始位置又是如何分配呢? : (一直往下長不會撞到嗎@@) : (當某 process 需要的 stack 大小超過兩個 page 又是如何維護? : page 如果不連續怎麼辦?) 你既然是在讀 virtual memeory,應該知道每個 process 都有自己一塊虛擬位址空間。 以 32-bit 系統來說,就是每個 process 各自有 4GB 的定址空間。 這 4GB 的定址空間,再細一點的分法是再區分成 user space 跟 kernel space。 預設的狀況下,Windows 是 2GB/2GB,Linux 則是 3GB/1GB。 有些人在 32-bit 的 XP 插了很大記憶體的顯示卡,結果記憶體剩下 2.xx GB, 原因就是這樣來的,因為 kernel space 要劃一塊去映射,細節要問熟微軟系統的。 stack 和 heap 這些東西都在 user space,user space 是各 process 之間獨立的。 換句話說對每個 32-bit Linux process 而言,那 3GB 裡不會有其它 process 的資料。 所以沒有什麼撞到的問題,兩個平行世界的東西你要怎麼讓它們相撞? 如果要 programmer 去擔心這種事,那 virtual memory 存在的意義就沒有了。 你沒特別設定的話,同個編譯系統生出來的執行檔,在同個 OS 執行, 每個 process 的 stack 起始位址都是一模一樣的,當然這不會是實體位址。 stack 的 page 當然是連續的。 在每個 process 各自獨立的虛擬 3GB 定址空間裡,有什麼理由劃不出連續空間? 你 C 程式裡 pointer 看到的記憶體位址都是這些虛擬位址,並不是實體的。 至於這些 page 怎麼對應到實體記憶體的 frame,我想書上應該都寫得很清楚了。