ขนาดหน้าคือความละเอียดที่ระบบปฏิบัติการจัดการหน่วยความจํา ซีพียูส่วนใหญ่ในปัจจุบันรองรับขนาดหน้า 4 KB ดังนั้นระบบปฏิบัติการและแอป Android จึงได้รับการสร้างขึ้นและเพิ่มประสิทธิภาพให้ทำงานด้วยขนาดหน้า 4 KB มาโดยตลอด CPU ของ ARM รองรับหน้าขนาด 16 KB ที่ใหญ่ขึ้น และตั้งแต่ Android 15 เป็นต้นไป AOSP รองรับการสร้าง Android ด้วยหน้าขนาด 16 KB ด้วย ตัวเลือกนี้จะใช้หน่วยความจําเพิ่มเติม แต่จะช่วยปรับปรุงประสิทธิภาพของระบบ ใน Android 15 ตัวเลือกนี้จะไม่เปิดใช้โดยค่าเริ่มต้น แต่จะใช้เป็นโหมดนักพัฒนาแอปหรือตัวเลือกสำหรับนักพัฒนาแอปเพื่อให้ OEM และนักพัฒนาแอปเตรียมพร้อมสำหรับการเปลี่ยนไปใช้โหมด 16 KB ในทุกที่ในอนาคต
Android 15 ขึ้นไปรองรับการสร้าง Android ด้วยการจัดแนว ELF ขนาด 16 KB ซึ่งใช้ได้กับเคอร์เนลขนาด 4 KB และ 16 KB ที่เริ่มต้นด้วย android14-6.1
เมื่อใช้กับเคอร์เนล 16 KB การกําหนดค่านี้จะใช้หน่วยความจําเพิ่มเติมแต่ปรับปรุงประสิทธิภาพของระบบ
ตั้งค่าพื้นที่ผู้ใช้ Android เป็น 16 KB
หน้าขนาด 16 KB ใช้ได้เฉพาะกับเป้าหมาย arm64
ที่มีเคอร์เนลขนาด 16 KB เท่านั้น
อย่างไรก็ตาม ยังมีตัวเลือกในการจำลองพื้นที่ผู้ใช้ 16 KB ใน x86_64
สำหรับ Cuttlefish ด้วย
สำหรับเป้าหมาย arm64
หากคุณใช้ Kleaf เพื่อสร้างเคอร์เนล --page_size=16k
จะสร้างเคอร์เนลในโหมด 16 KB
หากใช้การกำหนดค่าเคอร์เนล Linux โดยตรง คุณจะเลือกหน้าขนาด 16 KB ได้โดยการกําหนด CONFIG_ARM64_16K_PAGES
แทน CONFIG_ARM64_4K_PAGES
หากต้องการเปิดใช้การรองรับขนาดหน้า 16 KB ใน Userspace ของ Android ให้ตั้งค่าตัวเลือกการสร้างต่อไปนี้ในผลิตภัณฑ์
PRODUCT_NO_BIONIC_PAGE_SIZE_MACRO := true
จะนําการกําหนดPAGE_SIZE
ออก และทําให้คอมโพเนนต์กําหนดขนาดหน้าเว็บขณะรันไทม์PRODUCT_MAX_PAGE_SIZE_SUPPORTED := 16384
ซึ่งช่วยให้มั่นใจว่าไฟล์ ELF ของแพลตฟอร์มจะสร้างขึ้นด้วยการจัดแนว 16 KB ขนาดที่ใหญ่กว่าที่จำเป็นนี้เพื่อใช้ในอนาคต เมื่อใช้การจัดแนว ELF ขนาด 16 KB เคอร์เนลจะรองรับหน้าขนาด 4 KB/16 KB
ยืนยัน Flag การสร้าง
หลังจากเลือกเป้าหมาย lunch
แล้ว ให้ตรวจสอบว่าได้ตั้งค่า Flag การสร้างอย่างถูกต้องในสภาพแวดล้อมแล้ว โดยทำดังนี้
$ source build/envsetup.sh
$ lunch target
$ get_build_var TARGET_MAX_PAGE_SIZE_SUPPORTED
16384
$ get_build_var TARGET_NO_BIONIC_PAGE_SIZE_MACRO
true
หากคำสั่ง 2 รายการก่อนหน้าแสดงผลเป็น 16384
และ true
ตามลำดับ แสดงว่าการตั้งค่า Flag การสร้างของคุณถูกต้องแล้วสำหรับใช้กับเคอร์เนลขนาด 16 KB อย่างไรก็ตาม แม้ว่าบิลด์จะผ่าน แต่ก็ยังอาจมีปัญหาเกี่ยวกับรันไทม์เนื่องจากความแตกต่างในสภาพแวดล้อม 16 KB
การเขียนโปรแกรมระบบขนาดหน้าหน่วยความจำ 16 KB
โค้ดส่วนใหญ่ในอุปกรณ์ที่ทำงานด้วยระบบปฏิบัติการ Android ไม่ได้จัดการกับขนาดหน้าเว็บโดยตรง อย่างไรก็ตาม สําหรับโค้ดที่จัดการกับหน้าเว็บ ลักษณะการจัดสรรหน่วยความจําของเคิร์กัลจะเปลี่ยนแปลงไป และคุณต้องคํานึงถึงเรื่องนี้เมื่อเขียนโค้ดที่ไม่เพียงเข้ากันได้ แต่ยังมีประสิทธิภาพสูงสุดและใช้ทรัพยากรน้อยที่สุด
หากคุณเรียกใช้ mmap
ในภูมิภาคขนาด 1 KB, 2 KB หรือสูงสุด 4 KB ในระบบขนาด 4 KB ระบบจะจองพื้นที่ 4 KB เพื่อใช้กับการดำเนินการนี้ กล่าวคือ เมื่อขอหน่วยความจำจากเคอร์เนล เคอร์เนลจะต้องปัดเศษหน่วยความจำที่ขอขึ้นเป็นขนาดหน้าเว็บที่ใกล้ที่สุดเสมอ ตัวอย่างเช่น หากคุณจัดสรรภูมิภาคขนาด 5 KB ในภูมิภาคขนาด 4 KB เคอร์เนลจะจัดสรร 8 KB
ในเคอร์เนลขนาด 16 KB "ส่วนท้าย" เพิ่มเติมของหน้าเว็บจะมีขนาดใหญ่กว่า ตัวอย่างเช่น การจัดสรรทั้งหมดเหล่านี้ตั้งแต่ 1 KB ถึง 5 KB จะจัดสรร 16 KB เมื่อใช้กับเคอร์เนล 16 KB หากคุณขอ 17 KB ระบบจะจัดสรร 32 KB
ตัวอย่างเช่น ในระบบขนาด 4 KB คุณจัดสรรรีจินที่มีสิทธิ์อ่านและเขียนขนาด 4 KB ได้ 2 รายการ อย่างไรก็ตาม ในเคอร์เนลขนาด 16 KB การดำเนินการนี้จะส่งผลให้มีการจองหน้าหน่วยความจำ 2 หน้าหรือ 32 KB ในเคอร์เนลขนาด 16 KB ระบบจะรวมภูมิภาคเหล่านี้ไว้ในหน้าเดียวที่อ่านหรือเขียนได้หากเป็นไปได้ เพื่อใช้พื้นที่เพียง 16 KB ซึ่งจะสิ้นเปลืองพื้นที่ 8 KB เมื่อเทียบกับเคอร์เนลขนาด 4 KB คุณรวมหน้าเว็บได้มากขึ้นเพื่อลดการใช้หน่วยความจําได้ อันที่จริงแล้ว ในระบบขนาด 16 KB ที่เพิ่มประสิทธิภาพสูงสุด หน้าขนาด 16 KB จะใช้หน่วยความจำน้อยกว่าระบบขนาด 4 KB เนื่องจากตารางหน้ามีขนาดเล็กกว่า 1 ใน 4 สำหรับหน่วยความจำเดียวกัน
เมื่อใช้ mmap
โปรดตรวจสอบว่าคุณปัดเศษขนาดที่ขอเป็นจำนวนที่แสดงต่อหน้าใกล้เคียงที่สุด วิธีนี้ช่วยให้มั่นใจได้ว่าพื้นที่ผู้ใช้จะเห็นหน่วยความจำทั้งหมดที่เคอร์เนลจัดสรรโดยตรงในค่ารันไทม์ แทนที่จะขอโดยนัยและเข้าถึงโดยนัยหรือโดยไม่ตั้งใจ
สร้างคลังภาพที่แชร์ด้วยการจัดแนว ELF ขนาด 16 KB
หากต้องการสร้างไลบรารีที่ใช้ร่วมกันซึ่งเป็นส่วนหนึ่งของโปรเจ็กต์ Android การตั้งค่าก่อนหน้านี้ในเปิดใช้หน้าขนาด 16 KB ก็เพียงพอแล้ว
PRODUCT_NO_BIONIC_PAGE_SIZE_MACRO := true
PRODUCT_MAX_PAGE_SIZE_SUPPORTED := 16384
หากต้องการสร้างไลบรารีที่ใช้ร่วมกันซึ่งไม่ได้เป็นส่วนหนึ่งของโปรเจ็กต์ Android คุณจะต้องส่ง Flag Linker นี้
-Wl,-z,max-page-size=16384
ยืนยันไบนารีและไฟล์ที่สร้างไว้ล่วงหน้าสำหรับการจัดตำแหน่ง ELF ขนาด 16 KB
วิธีที่ดีที่สุดในการยืนยันการจัดแนวและลักษณะการทำงานรันไทม์คือการทดสอบและเรียกใช้บนเคอร์เนลที่คอมไพล์ขนาด 16 KB อย่างไรก็ตาม หากต้องการจับปัญหาบางอย่างได้เร็วขึ้น ให้ทำดังนี้
ตั้งแต่ Android 16 (AOSP เวอร์ชันทดลอง) เป็นต้นไป คุณจะตั้งค่า
PRODUCT_CHECK_PREBUILT_MAX_PAGE_SIZE := true
ได้ในเวลาที่คอมไพล์ ใช้ignore_max_page_size: true
ในAndroid.bp
และLOCAL_IGNORE_MAX_PAGE_SIZE := true
ในAndroid.mk
เพื่อละเว้นชั่วคราว การตั้งค่าเหล่านี้จะยืนยันรายการที่สร้างไว้ล่วงหน้าทั้งหมดและช่วยให้คุณตรวจจับได้เมื่อมีการอัปเดตรายการใดรายการหนึ่งแต่ไม่ได้จัดแนวเป็น 16 KBคุณสามารถเรียกใช้
atest elf_alignment_test
ซึ่งจะตรวจสอบการจัดแนวของไฟล์ ELF ในอุปกรณ์ในอุปกรณ์ที่เปิดตัวด้วย Android 15 ขึ้นไป