หน่วยความจำที่เก็บโค้ดคำสั่งและตัวแปรต่างๆ ของโปรแกรมที่ผ่านการคอมไฟล์แล้วจะได้รับการแบ่งออกเป็น 5 เซกเมนต์ ได้แก่ Text, Data, Bss, Heap และ Stack โดยคำว่าเซกเมนต์นั้นถือได้ว่าเป็นคำที่ใช้เรียกพื้นที่หน่วยความจำ ที่ถูกจัดสรรไว้เพื่อจุดประสงค์เฉพาะบางอย่าง
เซกเมนต์ที่เป็น เท็กซ์ (Text Segment) นั้นบางครั้งถูกเรียกว่าเป็น Code Segment ด้วยเซกเมนต์นี้ทำหน้าที่เก็บโค้ดคำสั่งภาษาเครื่องที่ได้มาจากการคอมไพล์โปรแกรม การเอ็กซีคิวโค้ดคำสั่งต่างๆ ภายใต้เซกเมนต์นี้อาจไม่จำเป็นต้องเรียงลำดับไปเรื่อยๆ เนื่องด้วยโครงสร้างการควบคุมและคำสั่งต่างๆ ซึ่งเมื่อผ่านการคอมไพล์แล้ว ก็จะถูกแบ่งเป็นการแยกไปทำตามคำสั่ง(branch)การกระโดดไปแล้วการเรียกใช้คำสั่งอื่นๆขณะที่โปรแกรมเอ็กซีคิวต์ EIP ได้ถูกเซตให้ชี้ไปยังคำสั่งแรกในเท็กซ์เซกเมนต์ จากนั้นโปรเซสเซอร์จะเอ็กซีคิวต์โค้ดคำสั่งต่างๆ เป็นวงรอบซ้ำๆไปเรื่อยๆตามขั้นตอนต่อไปนี้
- อ่านคำสั่งที่รีจิสเตอร์ EIP กำลังชี้ไป
- เช็คดูว่าคำสั่งนั้นใช้พื้นที่ขนาดที่ไบต์ ก็ให้บวกค่าไบต์นั้นไปใช้ในรีจิสเตอร์ EIP
- เอ็กซีคิวต์คำสั่งที่อ่านได้จากตำแหน่งแอดเดรสหน่วยความจำที่รีจิสเตอร์ EIP ชี้ไปซึ่งได้จากขั้นตอนที่ 1
- กลับไปยังขั้นตอนที่ 1
บางครั้ง คำสั่งอาจเป็นคำสั่ง jump หรือ call ซึี่งส่งผลให้มีการเปลี่ยนแปลงรีจิสเตอร์ EIP ไปยังตำแหน่งแอดเดรสใหม่ในหน่วยความจำ โปรเซสเซอร์เองก็จะไม่ได้กังวลอะไรกับการเปลี่ยนแปลงนี้เพราะมันคาดหวังอยู่แล้วว่า การเอ็กซีคิวต์โค้ดคำสั่งอาจไม่เป็นไปตามลำดับก็ได้ถ้ารีจิสเตอร์ EIP ถูกแก้ไขในข้อ 3 โปรเซสเซอร์จะย้อนกลับไปยังขั้นที่ 1 และอ่านโค้ดคำสั่งที่พบในแอดเดรสหน่วยความจำตามตำแหน่งใดก็แล้วแต่ที่รีจิสเตอร์ EIP ถูกแก้ไขให้ชี้ไป
สิทธิ็ในการเขียนได้ถูก disable ไว้ในเท็กเซกเมนต์ เนื่องจากมันไม่ได้ถูกใช้เพื่อการเก็บตัวแปร มันเก็บเฉพาะโค้ดคำสั่งเท่านั้น ทั้งนี้เพื่อป้องกันไม่ให้ใครก็ตามมาแก้ไขโค้ดของโปรแกรมได้ ความพยายามที่จะแก้ไขเซกเมนต์ส่วนนี้ จะทำให้โปรแกรมต้องแจ้งเตือนให้กับผู้ใช้ได้ทราบว่ามีบางสิ่งไม่ได้กำลังเกิดขึ้น และโปรแกรมจะต้องถูกหยุดการทำงาน ประโยชน์อีกข้อหนึ่งของการที่เท็กซ์เซกเมนต์นี้เป็นแบบอ่านได้อ่ย่างเดียวเท่านี้นก็คือ มันสามารถถูกแชร์กันระหว่างหลายๆโปรแกรมได้ เพื่อเปิดโอกาสให้มีการเอ็กซีคิวต์หลายโปรแกรมได้ในขณะเดียวกันโดยปราศจากปัญหาใดๆ เรายังควรสังเกตไว้ด้วยว่าเท็กซ์เซกเมนต์นี้มีขนาดที่คงที่
ดาต้าเซกเมนต์ (Data Segment) และบีเอสเอสเซกเมนต์ (Bss Segment) ถูกใช้เพื่อเก็บตัวแปรแบบโกลบอลและแบบสแตติก โดยดาต้าเซกเมนต์จะเก็บตัวแปรแบบโกลบอลและสแตติกที่ผ่านการเซตค่าเริ่มต้น(initialize)แล้ว ในขณะที่บีเอสเอสเซกเมนต์จะเก็บตัวแปรอื่นๆที่เหลือที่ยังไม่ได้ผ่านการเซตค่าเริ่มต้นถึงแม้เซกเมนต์เหล่านี้จะไม่สามารถถูกเขียนได้แต่มันก็มีขนาดที่คงที่ ให้จำไว้ว่าตัวแปรแบบโกลบอลและสแตติกนั้นจะถาวรตลอด ไม่ว่าอยู่ภายใต้ขอบเขตของฟังก์ชั่นไหนก็ตาม เพราะพวกมันถูกเก็บในพื้นที่หน่วยความจะเฉพาะตน
ฮีปเซกเมนต์ (Heap Segment) นั้นเป็นเซกเมนต์ของหน่วยความจำที่โปรแกรมเมอร์สามารถควบคุมได้โดยตรง สามารถถูกจัดสรรและถูกเพื่อใช้เพื่อการใดๆก็ได้ที่โปรแกรมเมอร์ต้องการ หนึ่งในจุดเด่นข้อฮีปเซกเมนต์ก็คือ มันมีขนาดไม่คงที่ เพื่อที่จะได้สามารถขยายขนาดขึ้น หรือลดขนาดลงได้ตามความจำเป็น โปรแกรมเมอร์ที่ใช้ฟังก์ชั้นในการจัดสรรฮีปสามารถจอง และยกเลิกหน่วยความจำว่างๆ ได้ขณะการทำงานจริง พื้นที่ของฮีปเซกเมนต์จะเพิ่มขยายขึ้นจากแอดเดรสหน่วยความจำต่ำ ไปยังแอดเดรสหน่วยความจำที่สูงขึ้นเรื่อยๆ
สแต็กเซกเมนต์ (Stack Segment) นั้นมีขนาดที่แปรเปลียนได้ และถูกใช้เป็นพื้นที่ชั่วคราวสำหรับจำเก็บตัวแปรแบบโลคอลของฟังก์ชั่นนั้นๆ และในระหว่างการเรียกใช้ฟังก์ชั้นอื่นๆ นี่คือสิ่งที่คำสั่ง backtrace ของ GDB เข้าไปสำรวจได้ เมื่อโปรแกรมเรียกฟังก์ชั่น ฟังก์ชั่นนั้นๆก็จะมีเซตของตัวแปรที่ถูกส่งผ่านมาจากโปรแกรมเป็นของตนเอง และโค้ดคำสั่งฟังก์ชั่นนั้นจะอยู่ในตำแหน่งหน่วยความจำที่แตกต่างกัน ในพื้นที่ของเท็กซ์เซกเมนต์ เนื่องจากขอบเขตของการรันโค้ดและรีจิสเตอร์ EIP จำเป็นต้องถูกเปลี่ยนไปเมื่อมีการเรียกใช้ฟังก์ชั่นเกิดขึ้น สแต็กจะเข้ามาช่วยในการจำค่าของตัวแปรที่ถูกส่งผ่านเข้ามา ส่วนข้อมูลที่เก็บอยู่ในรีจิสเตอร์ EIP ก็จะเก็บแอดเดรสของหน่วยความจำล่าสุดที่หลังจากรันฟังก์ชั่นนั้นๆ เสร็จแล้ว โปรแกรมจะต้องหวนกลับมาเอ็กซีคิวที่แอดเดรสตำแหน่งดังกล่าวนี้ต่อไป ข้อมูลทั้งหมดที่ถูกเก็บไว้ในสแต็กในแต่ละครั้งของการไปเรียกใช้ฟังก์ชั่นอื่นนี้เรียกว่า stack frame โดยในพื้นที่สแต็กเซกเมนต์จะประกอบด้วยหลายๆ stack frame
Refference: segment_wiki