ทำความเข้าใจกับ Linux / proc / id / maps


156

ฉันพยายามเข้าใจการใช้หน่วยความจำของแอปพลิเคชัน Linux ของฉัน /proc/pid/mapsยูทิลิตี้ / ไฟล์ดูเหมือนว่าจะเป็นทรัพยากรที่ดีสำหรับการมองเห็นรายละเอียด น่าเสียดายที่ฉันไม่เข้าใจคอลัมน์และรายการทั้งหมด

รายการ inode 0 ที่ไม่ระบุชื่อหมายความว่าอย่างไร ดูเหมือนว่าจะเป็นเซ็กเมนต์หน่วยความจำขนาดใหญ่กว่า


1
proc(5) mmap(2)"การทำความเข้าใจเคอร์เนล Linux" 9.3 ภูมิภาคหน่วยความจำ 16.2 การจับคู่หน่วยความจำ "การทำความเข้าใจกับตัวจัดการหน่วยความจำเสมือนของ Linux" 4.4 ส่วนของหน่วยความจำ
wRAR

คำตอบ:


264

แต่ละแถวใน/proc/$PID/mapsอธิบายถึงขอบเขตของหน่วยความจำเสมือนที่ต่อเนื่องกันในกระบวนการหรือเธรด แต่ละแถวมีฟิลด์ต่อไปนี้:

address           perms offset  dev   inode   pathname
08048000-08056000 r-xp 00000000 03:0c 64593   /usr/sbin/gpm
  • ที่อยู่ - นี่คือที่อยู่เริ่มต้นและที่สิ้นสุดของภูมิภาคในพื้นที่ที่อยู่ของกระบวนการ
  • การอนุญาต - ส่วนนี้อธิบายวิธีการเข้าถึงหน้าต่างๆในภูมิภาค มีการอนุญาตที่แตกต่างกันสี่แบบ: อ่านเขียนดำเนินการและแบ่งปัน ถ้าอ่าน / เขียน / ดำเนินการปิดการใช้งานที่-จะปรากฏขึ้นแทนr/ /w xหากพื้นที่ที่ไม่ได้ใช้ร่วมกันมันเป็นเรื่องส่วนตัวจึงจะปรากฏขึ้นแทนp sหากกระบวนการพยายามเข้าถึงหน่วยความจำในลักษณะที่ไม่ได้รับอนุญาตการแบ่งส่วนจะถูกสร้างขึ้น สิทธิ์สามารถเปลี่ยนแปลงได้โดยใช้การmprotectเรียกระบบ
  • ชดเชย - ถ้าภูมิภาคถูกแมปจากไฟล์ (โดยใช้mmap) นี่คือการชดเชยในไฟล์ที่เริ่มต้นการทำแผนที่ หากหน่วยความจำไม่ได้แม็พจากไฟล์แสดงว่าเป็นเพียง 0
  • อุปกรณ์ - หากพื้นที่ถูกแมปจากไฟล์นี่เป็นหมายเลขอุปกรณ์หลักและรอง (เป็นเลขฐานสิบหก) ที่ไฟล์นั้นใช้งาน
  • inode - หากพื้นที่ถูกแมปจากไฟล์นี่คือหมายเลขไฟล์
  • ชื่อพา ธ - หากพื้นที่ถูกแมปจากไฟล์นี่คือชื่อของไฟล์ ฟิลด์นี้ว่างสำหรับพื้นที่ที่แมปไม่ระบุชื่อ นอกจากนี้ยังมีภูมิภาคพิเศษที่มีชื่อเหมือน[heap], หรือ[stack] ย่อมาจากวัตถุที่ใช้ร่วมกันแบบไดนามิกเสมือน มันถูกใช้โดยการเรียกของระบบเพื่อเปลี่ยนเป็นโหมดเคอร์เนล นี่เป็นบทความที่ดีเกี่ยวกับเรื่องนี้: "linux-gate.so.1 คืออะไร"[vdso][vdso]

คุณอาจสังเกตเห็นพื้นที่ที่ไม่ระบุชื่อจำนวนมาก สิ่งเหล่านี้มักจะสร้างโดยmmapแต่ไม่ได้แนบกับไฟล์ใด ๆ พวกเขาจะใช้สำหรับสิ่งต่าง ๆ มากมายเช่นหน่วยความจำที่ใช้ร่วมกันหรือบัฟเฟอร์ที่ไม่ได้รับการจัดสรรในกอง ตัวอย่างเช่นฉันคิดว่าไลบรารี pthread ใช้ขอบเขตที่แม็พแบบไม่ระบุชื่อเป็นกองซ้อนสำหรับเธรดใหม่


4
ใช่ pthreads กำลังจัดสรรบล็อก 8Mb สำหรับสแต็กที่มีส่วนเล็กลงสำหรับการตรวจจับสแต็กล้น (ฉันคิดว่า) ดังนั้นแต่ละ pthread ที่สร้างขึ้นตามค่าเริ่มต้นจัดสรรพื้นที่หน่วยความจำ inode 0 เป็น 8Mb และพื้นที่ inode 0 เป็น 4Kb
simon

ดังนั้นในตัวอย่างของคุณgpmคือการแม็พไฟล์ไบนารีที่ที่อยู่เสมือนบางแห่งตั้งแต่ต้นโดยใช้ส่วนหัวของเอลฟ์เป็นต้น ตัวโหลดไม่ควรแยกส่วนหัว ELF และแมปส่วนแต่ละส่วนไม่ใช่ไฟล์ทั้งหมดหรือไม่
Dmitry Grigoryev

9

การแมปหน่วยความจำไม่เพียง แต่ใช้เพื่อแมปไฟล์ลงในหน่วยความจำ แต่ยังเป็นเครื่องมือในการขอ RAM จากเคอร์เนล เหล่านี้คือรายการ inode 0 - สแต็กฮีป bss เซกเมนต์และอื่น ๆ ของคุณ


5

กรุณาตรวจสอบ: http://man7.org/linux/man-pages/man5/proc.5.html

address           perms offset  dev   inode       pathname
00400000-00452000 r-xp 00000000 08:02 173521      /usr/bin/dbus-daemon

ฟิลด์ที่อยู่เป็นพื้นที่ที่อยู่ในกระบวนการที่การทำแผนที่ตรง

เขตข้อมูล perms เป็นชุดของการอนุญาต:

 r = read
 w = write
 x = execute
 s = shared
 p = private (copy on write)

เขตข้อมูลชดเชยคือการชดเชยลงในไฟล์ / อะไรก็ตาม;

dev เป็นอุปกรณ์ (ส่วนใหญ่: รายย่อย);

inode เป็น inode บน device.0 บ่งชี้ว่าไม่มี inode เชื่อมโยงกับ memoryregion ดังเช่นกรณีของ BSS (ข้อมูลที่ไม่ได้กำหนดค่าเริ่มต้น)

ฟิลด์ชื่อพา ธ มักจะเป็นไฟล์ที่สำรองข้อมูลการแมป สำหรับไฟล์เอลฟ์คุณสามารถประสานงานกับฟิลด์ออฟเซ็ตได้อย่างง่ายดายโดยดูที่ฟิลด์ออฟเซ็ตในส่วนหัวของโปรแกรม ELF (readelf -l)

ภายใต้ Linux 2.0 จะไม่มีฟิลด์กำหนดชื่อพา ธ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.