ขนาดหน่วยความจำสำหรับการดำเนินการเคอร์เนล mmap


9

ฉันสนใจในวิธีที่ไฟล์ Linux mmaps ในหน่วยความจำหลัก (ในบริบทของฉันมันสำหรับการดำเนินการ แต่ฉันคิดว่ากระบวนการ mmap นั้นเหมือนกันสำหรับการเขียนและการอ่านเช่นกัน) และขนาดที่ใช้

ดังนั้นฉันรู้ว่าลินุกซ์ใช้เพจจิ้งโดยปกติ 4kB Pagesize (ที่เคอร์เนลฉันสามารถหาขนาดนี้ได้ที่ไหน) แต่สิ่งนี้มีความหมายอย่างไรสำหรับหน่วยความจำที่จัดสรรไว้: สมมติว่าคุณมีขนาดไบนารี่ขนาดไม่กี่ไบต์นับได้ว่าเพียง 5812B และคุณรันมัน จะเกิดอะไรขึ้นในเคอร์เนล: มันจัดสรร 2 * 4kB แล้วคัดลอก 5812B ลงในพื้นที่นี้เสียเปล่า> 3KB ของหน่วยความจำหลักในหน้า 2 หรือไม่?

มันจะดีถ้าใครรู้ว่าไฟล์ในเคอร์เนลแหล่งที่มีการกำหนดขนาดหน้า

คำถามที่สองของฉันก็ง่ายมากฉันเดาว่าฉันถือว่า 5812B เป็นขนาดไฟล์ ถูกต้องขนาดนี้ถูกนำมาจากไอโหนดหรือไม่?

คำตอบ:


6

ไม่มีความสัมพันธ์โดยตรงระหว่างขนาดของปฏิบัติการและขนาดในหน่วยความจำ ต่อไปนี้เป็นภาพรวมโดยย่อของสิ่งที่เกิดขึ้นเมื่อมีการดำเนินการไบนารี:

  1. เคอร์เนลแยกวิเคราะห์ไฟล์และแบ่งเป็นส่วน บางส่วนถูกโหลดเข้าสู่หน่วยความจำโดยตรงในหน้าแยก บางส่วนไม่ได้โหลดเลย (เช่นสัญลักษณ์การดีบัก)
  2. หากความสามารถในการเรียกทำงานนั้นเชื่อมโยงกันแบบไดนามิกเคอร์เนลจะเรียกตัวโหลดเดอร์แบบไดนามิกและโหลดไลบรารีที่แบ่งใช้ที่จำเป็นและดำเนินการลิงก์ตามที่ต้องการ
  3. โปรแกรมเริ่มต้นรันโค้ดของมันและโดยปกติแล้วมันจะร้องขอหน่วยความจำเพิ่มเติมเพื่อเก็บข้อมูล

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับรูปแบบการปฏิบัติการเชื่อมโยงและการโหลดปฏิบัติการคุณสามารถอ่านLinkers และรถตักโดยจอห์นอาร์ Levine

ในปฏิบัติการขนาด 5kB เป็นไปได้ว่าทุกอย่างเป็นรหัสหรือข้อมูลที่ต้องโหลดลงในหน่วยความจำยกเว้นส่วนหัว โค้ดที่ปฏิบัติการได้จะมีอย่างน้อยหนึ่งหน้าอาจเป็นสองหน้าจากนั้นจะมีอย่างน้อยหนึ่งหน้าสำหรับสแต็กอาจเป็นหนึ่งหน้าหรือสำหรับฮีป (ข้อมูลอื่น) รวมถึงหน่วยความจำที่ใช้โดยไลบรารีที่แบ่งใช้

ภายใต้ Linux คุณสามารถตรวจสอบการแมปหน่วยความจำสำหรับการปฏิบัติการcat /proc/$pid/mapsได้ รูปแบบเอกสารในproc(5)man page; เห็นความเข้าใจ Linux /


0

ใช่: ในที่สุดคุณจะได้รับหน้าขนาด 4k สองหน้า ข้อมูลถูกโหลดตามต้องการดังนั้นหากไม่มีสิ่งใดที่อ้างถึงหน้าสองข้อมูลจะไม่ถูกโหลดลงในหน่วยความจำ

include/asm-i386/param.h:#define EXEC_PAGESIZE  4096
include/asm-i386/elf.h:#define ELF_EXEC_PAGESIZE        4096

อย่าเปลี่ยนค่าเหล่านี้และคาดหวังว่าทุกอย่างจะทำงาน

ใช่ขนาดไฟล์ถูกเก็บไว้ใน inode ใน ext2 / 3


0

สำหรับส่วนความหมายบนเคอร์เนล 2.6.38 ~ ish สำหรับสถาปัตยกรรม Intel:

ซุ้มประตู / x86 / รวม / asm / page_types.h:

/ * PAGE_SHIFT กำหนดขนาดหน้า * /

#define PAGE_SHIFT 12

#define PAGE_SIZE (_AC (1, UL) << PAGE_SHIFT)

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