ขนาดหน้าถูกกำหนดในพื้นที่ที่อยู่เสมือนอย่างไร


43

Linux ใช้ระบบหน่วยความจำเสมือนที่อยู่ทั้งหมดเป็นที่อยู่เสมือนไม่ใช่ที่อยู่จริง ที่อยู่เสมือนเหล่านี้จะถูกแปลงเป็นที่อยู่จริงโดยโปรเซสเซอร์

เพื่อให้การแปลนี้ง่ายขึ้นหน่วยความจำเสมือนและกายภาพจะถูกแบ่งออกเป็นหน้า ๆ แต่ละหน้าเหล่านี้จะได้รับหมายเลขที่ไม่ซ้ำกัน; หมายเลขเฟรมหน้า

ขนาดหน้าบางขนาดอาจเป็น 2 KB, 4 KB เป็นต้น แต่จะมีการกำหนดหมายเลขขนาดหน้านี้อย่างไร มันได้รับอิทธิพลจากขนาดของสถาปัตยกรรมหรือไม่? ตัวอย่างเช่นบัส 32 บิตจะมีพื้นที่ที่อยู่ 4 GB

คำตอบ:


56

คุณสามารถค้นหาขนาดหน้าเริ่มต้นของระบบได้โดยการสอบถามการกำหนดค่าผ่านทางgetconfคำสั่ง:

$ getconf PAGE_SIZE
4096

หรือ

$ getconf PAGESIZE
4096

หมายเหตุ:หน่วยข้างต้นโดยทั่วไปแล้วเป็นไบต์ดังนั้น 4096 จึงเท่ากับ 4096 ไบต์หรือ 4kB

นี่คือการเดินสายในแหล่งเคอร์เนลของ Linux ที่นี่:

ตัวอย่าง

$ more /usr/src/kernels/3.13.9-100.fc19.x86_64/include/asm-generic/page.h
...
...
/* PAGE_SHIFT determines the page size */

#define PAGE_SHIFT  12
#ifdef __ASSEMBLY__
#define PAGE_SIZE   (1 << PAGE_SHIFT)
#else
#define PAGE_SIZE   (1UL << PAGE_SHIFT)
#endif
#define PAGE_MASK   (~(PAGE_SIZE-1))

การเปลี่ยนให้คุณ 4096 เป็นอย่างไร?

เมื่อคุณเลื่อนบิตคุณกำลังทำการคูณแบบไบนารีด้วย 2 ดังนั้นการเปลี่ยนบิตไปทางซ้าย ( 1 << PAGE_SHIFT) จะทำการคูณ 2 ^ 12 = 4096

$ echo "2^12" | bc
4096

2
ฮาร์ดแวร์ที่ทันสมัยรองรับ 2MB และ 1GB บางหน้า สามารถตั้งค่า "PAGE_SHIFT" เป็น 21 สำหรับเพจขนาด 2MB เป็นค่าเริ่มต้นสำหรับการสร้างเคอร์เนลได้หรือไม่
ReverseFlow

2
@ReverseFlow เพื่อให้ได้คำตอบแบบนี้ฉันจะถามคำถามแยกต่างหาก
คิริลล์ Bulygin

@sim สงสัยว่าทำไมจะใช้การจัดการบิตที่นี่ ฉันอ่านคอมไพเลอร์ที่มักจะแปลงการคูณเป็นบิตการจัดการดังนั้นจึงให้ประสิทธิภาพเดียวกัน
InAFlash

17

ฮาร์ดแวร์ (โดยเฉพาะMMUซึ่งเป็นส่วนหนึ่งของ CPU) กำหนดขนาดหน้ากระดาษที่เป็นไปได้ ไม่มีความสัมพันธ์กับขนาดการลงทะเบียนของโปรเซสเซอร์และมีความสัมพันธ์ทางอ้อมกับขนาดพื้นที่ที่อยู่ (ในที่ MMU กำหนดทั้งสอง)

สถาปัตยกรรมเกือบทั้งหมดรองรับขนาดหน้ากระดาษ 4kB สถาปัตยกรรมบางแห่งรองรับหน้าเว็บที่ใหญ่ขึ้น (และอีกไม่กี่เพจก็สนับสนุนเพจขนาดเล็กกว่า) แต่ 4kB เป็นค่าเริ่มต้นที่แพร่หลายมาก

Linux รองรับสองขนาดหน้า:

  • หน้าขนาดปกติซึ่งผมเชื่อว่าเป็น 4KB โดยเริ่มต้นในสถาปัตยกรรมทั้งหมดแม้ว่าสถาปัตยกรรมบางอนุญาตให้มีค่าอื่น ๆ เช่น 16kb ในARM64หรือ 8KB, 16KB หรือ 64kB ในIA64 สิ่งเหล่านี้สอดคล้องกับระดับที่ลึกที่สุดของคำอธิบายบน MMU (สิ่งที่ Linux เรียกPTE )
  • หน้าเว็บขนาดใหญ่หากรวบรวมไว้ ( CONFIG_HUGETLB_PAGEจำเป็นและCONFIG_HUGETLBFSรวมถึงการใช้งานส่วนใหญ่ด้วย) สิ่งนี้สอดคล้องกับตัวบอก MMU ระดับลึกที่สุดอันดับสอง (สิ่งที่ Linux เรียกว่า PMD) (หรืออย่างน้อยก็มักจะทำฉันไม่รู้ว่าสิ่งนี้จะยึดตามสถาปัตยกรรมทั้งหมดหรือไม่)

ขนาดหน้ากระดาษมีการประนีประนอมระหว่างการใช้หน่วยความจำการใช้หน่วยความจำและความเร็ว

  • ขนาดหน้ากระดาษที่ใหญ่ขึ้นหมายถึงการสิ้นเปลืองมากขึ้นเมื่อมีการใช้งานหน้ากระดาษเพียงบางส่วน
  • ระดับตัวบ่งชี้ MMU ที่ลึกกว่าหมายถึงหน่วยความจำเคอร์เนลเพิ่มเติมสำหรับตารางหน้า
  • ระดับตัวบ่งชี้ MMU ที่ลึกกว่าหมายถึงเวลาที่ใช้ในการสำรวจเส้นทางตารางหน้ามากขึ้น

กำไรที่เพิ่มขึ้นจากขนาดหน้ากระดาษที่เล็กมากสำหรับแอปพลิเคชั่นส่วนใหญ่ในขณะที่ต้นทุนนั้นสูง นี่คือเหตุผลที่ระบบส่วนใหญ่ใช้หน้าขนาดปกติเท่านั้น

ท่านสามารถสอบถาม (ปกติ) ขนาดหน้าในระบบของคุณกับยูทิลิตี้หรือฟังก์ชั่นซีgetconfsysconf

$ getconf PAGE_SIZE
4096

การใช้เพจขนาดใหญ่จำเป็นต้องติดตั้งhugetlbfsระบบไฟล์และmmapไฟล์ ping ที่นั่น


FYI: การใช้หน้าเว็บขนาดใหญ่ไม่จำเป็นต้องติดตั้ง hugetlbfs เนื่องจากเคอร์เนลเอกสารบันทึกที่ด้านล่างคุณยังสามารถใช้การเรียกหน่วยความจำที่ใช้ร่วมกันหรือการตั้งค่าสถานะ mmap นอกจากนี้ที่น่าสนใจกว่าคือคุณสามารถเปิดใช้งานหน้าเว็บขนาดใหญ่ที่โปร่งใสแล้วเคอร์เนลจะแปลงหน้าปกติเป็นหน้าขนาดใหญ่โดยอัตโนมัติเมื่อเป็นไปได้ในทุกแอป
derobert

นี่คือคำตอบพื้นฐานอย่างแท้จริง Linux ได้รับการออกแบบมาเพื่อใช้งานฮาร์ดแวร์เพจจิ้งอย่างดี รายละเอียดเพิ่มเติมเกี่ยวกับการเพจ: stackoverflow.com/questions/18431261/how-does-x86-paging-work
Ciro Santilli 新疆改造中心中心法轮功六四事件

0

ขนาดหน้าขึ้นอยู่กับสถาปัตยกรรมของโปรเซสเซอร์เป็นส่วนใหญ่ บน x86 จากเวลาของตัวประมวลผล 386 ซึ่งแนะนำโหมดการป้องกันขนาดหน้าเป็น 4 kB

ในโหมด x64 อาจมีเพจขนาดใหญ่ซึ่งมีขนาด 2 MB อย่างไรก็ตามการใช้สิ่งเหล่านี้ค่อนข้างซับซ้อน

คุณสามารถค้นหาข้อมูลเพิ่มเติมเกี่ยวกับขนาดหน้าในบทความ Wikipedia


0

โปรเซสเซอร์กำหนดขนาดหน้ากระดาษที่มีอยู่ เพื่อวัตถุประสงค์ส่วนใหญ่ฮาร์ดแวร์ที่ใช้งานขนาดหน้าในโปรเซสเซอร์ x86 และ x86_64 คือ 4kb อย่างไรก็ตามระบบปฏิบัติการสามารถจัดสรรได้มากกว่าหนึ่งหน้าในเวลาเดียวกันถ้ามันต้องการและใช้งานได้อย่างมีประสิทธิภาพ 8kb, 16kb หรือ 32kb ในซอฟต์แวร์

โปรเซสเซอร์ x86 และ x86_64 สามารถตามลำดับสามารถผสมหน้า 4mb และ 2mb พร้อมกับหน้า 4kb มาตรฐาน หากความสามารถนั้นถูกนำมาใช้ส่วนใหญ่จะใช้เพื่อจัดสรรพื้นที่เคอร์เนล

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