網路城邦
上一篇 回創作列表 下一篇   字體:
C 程式的後續問題以及筆者的解答
2009/07/13 13:33:26瀏覽1789|回應0|推薦1
此篇為接續 < 一位讀者來信來電問 C 程式的問題 > 這篇文章該名讀者在看了筆者的解答之後,又問了下列的問題:

謝謝你的答案,不過當我把  buf[4096]
宣告成 local 變數時就會發生 segmentation fault ,why ? 
如果是stack 太小,那我要怎要從objdump 看出來呢?因物stack 在objdump 試看不出來得。

謝謝你



以下是筆者的解答:

Stack Frame 是一個程式在執行時、Operating System 幫它配置的虛擬記憶體空間,Stack Frame 不存在於 Object Executable 之中,當然無法由 objdump 看出來。


之前的變數宣告成 global 會沒事,是因為拷貝時所 write 到的記憶體資源恰巧都落在該 process 合法取得的記憶體空間之內;這回宣告成 local 會發生 segmentation fault,是因為拷貝時 write 到不屬於該 process 合法取得的記憶體空間。



打個比方說,官方配置一塊 240 坪的農地給你,你可以在這 240 坪內去種植你所喜歡蔬果,但是你不可以跑到別人的農地上或官方尚未配置的農地上去種植蔬果;如果你跑到別人的農地上或官方尚未配置的農地上去種植蔬果,便會遭到官方的懲罰 ── segmentation fault。此外,你原本在 240 坪的農地內做了若干規劃,例如切割成三個 80 坪的區域去種植不同的作物,第一種作物只吃肥料 A,第二種作物只吃肥料 B,第三種作物只吃肥料 C;有一天你喝酒喝得爛醉如泥,第二天早上醒來時宿醉得很嚴重,結果你在施灑肥料 A 於第一種作物之後,又繼續地將肥料 A 施灑在第二與第三種作物上,此舉會導致作物二與三的敗亡,但官方管不管你亂灑肥料 (就如同你在做拷貝時又蓋到自己一樣)?官方是不管的,它只管你有沒有跑到其它人的或尚未被配置的農地上去撒野。

 

Segmentation Fault 的意思是:該 process 欲存取某個記憶體資源,例如對某個 virtual address 進行讀取或寫入的運作,然而 Operating System 在解譯該筆存取指令時發現,這個記憶體資源不屬於該 process,於是它將一個叫做 SIGSEGV 的 signal 送往該 process,該 process 收到該 signal 之後呼叫處理該 signal 的 signal handler,而該 signal handler 所打印出來的訊息就是 segmentation fault。

segment、segmentation 與 page 是 O.S. virtual memory 主題中的術語。



不論你有沒有修過 Operating System 與 Compiler,建議你把課本拿出來,將與
virtual memory 有關的章節念個幾遍,好好地把觀念建立起來,再回來寫程式。
( 創作其他 )
推薦文章 列印 加入我的文摘
上一篇 回創作列表 下一篇

引用
引用網址:https://classic-blog.udn.com/article/trackback.jsp?uid=chungchia&aid=3128969