ขนาดหน้า 16 KB

ขนาดหน้าคือความละเอียดที่ระบบปฏิบัติการจัดการหน่วยความจํา ซีพียูส่วนใหญ่ในปัจจุบันรองรับขนาดหน้า 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 ขึ้นไป