行程與行程抽象

文字(程式碼)區段(text segment)

當食譜正在被烹調時,印出來的步驟本身並不會隨著你煮而改變:你讀它們,但不會在步驟上塗改。行程的文字區段正是如此:位址空間中存放程式機器指令的部分,也就是 CPU 所執行的編譯後程式碼,放在記憶體中供讀取,但通常永遠不會被改寫。

當作業系統載入程式時,它把可執行檔的指令放進文字區段,通常位於位址空間的低端,並把那些頁標記為唯讀且可執行。CPU 的程式計數器指向這個區域,一條接一條地執行指令,並為迴圈與函式呼叫而跳轉。標記為唯讀是一項安全機制:當臭蟲或攻擊者試圖覆寫程式碼時,會觸發錯誤,而不是悄悄改變程式的行為。由於指令是唯讀的、而且對每個實例都相同,作業系統可以讓所有執行同一程式的行程共用一份實體的文字區段副本,藉此節省記憶體。

所以文字區段是行程穩定、可執行的核心。它對保護很重要(可寫但不可執行、可執行但不可寫,是抵禦程式碼注入的關鍵防線),也對效率很重要(共享的唯讀程式碼讓眾多行程都很輕量)。一個微妙之處:文字區段存放的是指令,而它們所操作、會變動的值則住在資料、堆積與堆疊裡——把不變的食譜與正在被轉化的食材分開。

把同一個編譯好的工具執行一百次;作業系統在實體記憶體中只保留一份它的唯讀文字區段,並映射到這一百個行程裡,而不是把程式碼複製一百份。

唯讀的程式碼可以安全地被所有執行它的行程共享。

唯讀是常態,但不是鐵律。某些系統允許自我修改的程式碼或即時編譯,這需要「可寫後可執行」的記憶體,並須格外謹慎地處理。

又稱
code segmenttext section程式碼區段code 段