16 KB পৃষ্ঠার আকার

পেজ সাইজ হলো সেই সূক্ষ্মতা যার মাধ্যমে একটি অপারেটিং সিস্টেম মেমরি পরিচালনা করে। বর্তমানে বেশিরভাগ সিপিইউ ৪ কিলোবাইট (KB) পেজ সাইজ সমর্থন করে, এবং তাই অ্যান্ড্রয়েড অপারেটিং সিস্টেম ও অ্যাপগুলো ঐতিহাসিকভাবে ৪ কিলোবাইট পেজ সাইজে চলার জন্য তৈরি ও অপ্টিমাইজ করা হয়েছে। এআরএম (ARM) সিপিইউগুলো আরও বড় ১৬ কিলোবাইট পেজ সাইজ সমর্থন করে, এবং অ্যান্ড্রয়েড ১৫ থেকে এওএসপি (AOSP)-তেও ১৬ কিলোবাইট পেজ সাইজে অ্যান্ড্রয়েড বিল্ড করার সুবিধা রয়েছে। এই অপশনটি অতিরিক্ত মেমরি ব্যবহার করলেও সিস্টেমের পারফরম্যান্স উন্নত করে। অ্যান্ড্রয়েড ১৫ অনুযায়ী, এই অপশনটি ডিফল্টভাবে চালু থাকে না, তবে ভবিষ্যতে সব জায়গায় ১৬ কিলোবাইট মোডে পরিবর্তনের জন্য ওইএম (OEM) এবং অ্যাপ ডেভেলপারদের প্রস্তুত করতে এটি ডেভেলপার মোড বা ডেভেলপার অপশন হিসেবে উপলব্ধ রয়েছে।

অ্যান্ড্রয়েড ১৫ এবং এর পরবর্তী সংস্করণগুলোতে ১৬ কেবি ইএলএফ অ্যালাইনমেন্ট ব্যবহার করে অ্যান্ড্রয়েড বিল্ড করার সুবিধা রয়েছে, যা android14-6.1 থেকে শুরু করে ৪ কেবি এবং ১৬ কেবি কার্নেলের সাথে কাজ করে। ১৬ কেবি কার্নেলের সাথে ব্যবহার করা হলে, এই কনফিগারেশনটি অতিরিক্ত মেমরি ব্যবহার করে, কিন্তু সিস্টেমের পারফরম্যান্স উন্নত করে।

অ্যান্ড্রয়েড ১৬ কেবি-তে সেট করুন

১৬ কেবি পেজ শুধুমাত্র ১৬ কেবি কার্নেলযুক্ত arm64 টার্গেটেই সমর্থিত। তবে, Cuttlefish-এর জন্য x86_64 এ ১৬ কেবি ইউজারস্পেস সিমুলেট করার একটি বিকল্পও রয়েছে।

কার্নেল স্পেস

arm64 টার্গেটের ক্ষেত্রে, যদি আপনি Kleaf ব্যবহার করে আপনার কার্নেল বিল্ড করেন, তাহলে --page_size=16k বিকল্পটি কার্নেলকে ১৬ কিলোবাইট মোডে বিল্ড করে। যদি আপনি সরাসরি লিনাক্স কার্নেল কনফিগারেশন ব্যবহার করেন, তাহলে CONFIG_ARM64_4K_PAGES এর পরিবর্তে CONFIG_ARM64_16K_PAGES সেট করে ১৬ কিলোবাইট পেজ নির্বাচন করতে পারেন।

ব্যবহারকারীর স্থান

অ্যান্ড্রয়েড ইউজার স্পেসে ১৬ কেবি পেজ সাইজ সাপোর্ট চালু করতে, আপনার প্রোডাক্টে নিম্নলিখিত বিল্ড অপশনগুলো সেট করুন:

  • PRODUCT_NO_BIONIC_PAGE_SIZE_MACRO := true PAGE_SIZE ডিফাইনটি সরিয়ে দেয় এবং কম্পোনেন্টগুলোকে রানটাইমে পেজ সাইজ নির্ধারণ করতে দেয়।
  • PRODUCT_MAX_PAGE_SIZE_SUPPORTED := 16384 যা নিশ্চিত করে যে প্ল্যাটফর্ম ELF ফাইলগুলো ১৬ KB অ্যালাইনমেন্টে বিল্ড করা হবে। প্রয়োজনের চেয়ে এই বড় আকারটি ভবিষ্যতের সামঞ্জস্যতার জন্য রাখা হয়েছে। ১৬ KB ELF অ্যালাইনমেন্টের মাধ্যমে কার্নেল ৪ KB/১৬ KB পেজ সাইজ সমর্থন করতে পারে।

বিল্ড ফ্ল্যাগ যাচাই করুন

lunch টার্গেট নির্বাচন করার পর, পরিবেশে বিল্ড ফ্ল্যাগগুলো সঠিকভাবে সেট করা আছে কিনা তা যাচাই করুন:

$ 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

যদি পূর্ববর্তী দুটি কমান্ড যথাক্রমে 16384 এবং true রিটার্ন করে, তাহলে আপনার বিল্ড ফ্ল্যাগগুলো একটি 16 KB কার্নেলের সাথে কাজ করার জন্য সঠিকভাবে সেট করা আছে। তবে, বিল্ড সফল হলেও, 16 KB পরিবেশের ভিন্নতার কারণে রানটাইম সমস্যা দেখা দিতে পারে।

১৬ কেবি পেজ সাইজ সিস্টেম প্রোগ্রামিং

যেকোনো অ্যান্ড্রয়েড-চালিত ডিভাইসের কোডের সিংহভাগই সরাসরি পেজ সাইজ নিয়ে কাজ করে না। তবে, যে কোড পেজ নিয়ে কাজ করে, তার ক্ষেত্রে কার্নেলের মেমরি বরাদ্দের আচরণ পরিবর্তিত হয়। এমন কোড লেখার জন্য আপনাকে এই বিষয়টি মাথায় রাখতে হবে যা কেবল সামঞ্জস্যপূর্ণই নয়, বরং সর্বোচ্চ পারফরম্যান্স সম্পন্ন এবং সর্বনিম্ন রিসোর্স-নির্ভর।

যদি আপনি একটি ৪ কিলোবাইট সিস্টেমে ১ কিলোবাইট, ২ কিলোবাইট বা সর্বোচ্চ ৪ কিলোবাইট অঞ্চলের জন্য mmap কল করেন, তবে সিস্টেমটি এটি বাস্তবায়নের জন্য ৪ কিলোবাইট জায়গা সংরক্ষিত রাখে। অন্য কথায়, কার্নেলের কাছে মেমরি অনুরোধ করার সময়, কার্নেলকে অবশ্যই অনুরোধ করা মেমরিকে নিকটতম পেজ সাইজে রাউন্ড আপ করতে হয়। উদাহরণস্বরূপ, যদি আপনি একটি ৪ কিলোবাইট অঞ্চলে ৫ কিলোবাইটের একটি অঞ্চল বরাদ্দ করেন, তবে কার্নেল ৮ কিলোবাইট বরাদ্দ করে।

একটি ১৬ কেবি কার্নেলে, পেজগুলোর এই অতিরিক্ত "শেষাংশগুলো" আকারে বড় হয়। উদাহরণস্বরূপ, একটি ১৬ কেবি কার্নেলের সাথে ব্যবহার করা হলে, ১ কেবি থেকে ৫ কেবি পর্যন্ত এই সমস্ত অ্যালোকেশন ১৬ কেবি জায়গা বরাদ্দ করবে। যদি আপনি ১৭ কেবি অনুরোধ করেন, তবে এটি ৩২ কেবি জায়গা বরাদ্দ করবে।

উদাহরণস্বরূপ, একটি ৪ কিলোবাইট (KB) সিস্টেমে দুটি ৪ কিলোবাইট রিড-রাইট অ্যানোনিমাস রিজিয়ন বরাদ্দ করা যেতে পারে। তবে, একটি ১৬ কিলোবাইট কার্নেলে এর ফলে দুটি পেজ বা ৩২ কিলোবাইট জায়গা বরাদ্দ করতে হবে। একটি ১৬ কিলোবাইট কার্নেলে, সম্ভব হলে, এই রিজিয়নগুলোকে একটিমাত্র রিড বা রাইটেবল পেজে একত্রিত করা যেতে পারে, যাতে মাত্র ১৬ কিলোবাইট ব্যবহৃত হয় এবং ৪ কিলোবাইট কার্নেলের তুলনায় ৮ কিলোবাইট জায়গা নষ্ট হয়। মেমরির ব্যবহার আরও কমাতে, আরও বেশি পেজ একত্রিত করা যেতে পারে। প্রকৃতপক্ষে, সর্বোচ্চ অপ্টিমাইজ করা একটি ১৬ কিলোবাইট সিস্টেমে, ৪ কিলোবাইট সিস্টেমের তুলনায় ১৬ কিলোবাইট পেজের জন্য কম মেমরির প্রয়োজন হয়, কারণ একই মেমরির জন্য পেজ টেবিলের আকার এক-চতুর্থাংশ হয়।

mmap ব্যবহার করার সময়, আপনি যে সাইজটি অনুরোধ করছেন তা নিকটতম পেজ সাইজে রাউন্ড আপ করে নিন। এটি নিশ্চিত করে যে কার্নেল দ্বারা বরাদ্দ করা সম্পূর্ণ মেমরি রানটাইম ভ্যালুতে ইউজারস্পেসের কাছে সরাসরি দৃশ্যমান থাকে, এবং তা পরোক্ষভাবে অনুরোধ করা বা অনিচ্ছাকৃতভাবে অ্যাক্সেসযোগ্য না হয়।

১৬ কেবি ইএলএফ অ্যালাইনমেন্টে শেয়ার্ড লাইব্রেরি তৈরি করুন।

অ্যান্ড্রয়েড প্রজেক্টের অংশ এমন শেয়ার্ড লাইব্রেরিগুলো বিল্ড করার জন্য, ‘Enable 16 KB page size’- এর আগের সেটিংসগুলোই যথেষ্ট:

  • PRODUCT_NO_BIONIC_PAGE_SIZE_MACRO := true
  • PRODUCT_MAX_PAGE_SIZE_SUPPORTED := 16384

যেসব শেয়ার্ড লাইব্রেরি অ্যান্ড্রয়েড প্রজেক্টের অংশ নয়, সেগুলো বিল্ড করার জন্য আপনাকে এই লিঙ্কার ফ্ল্যাগটি পাস করতে হবে:

-Wl,-z,max-page-size=16384

বাইনারি এবং প্রি-বিল্ট ফাইলগুলোতে ১৬ কেবি ইএলএফ অ্যালাইনমেন্ট যাচাই করুন।

অ্যালাইনমেন্ট এবং রানটাইম আচরণ যাচাই করার সর্বোত্তম উপায় হলো একটি ১৬ কেবি কম্পাইল করা কার্নেলে পরীক্ষা ও চালানো। তবে, কিছু সমস্যা আগেভাগে ধরার জন্য:

  • অ্যান্ড্রয়েড ১৬ থেকে, আপনি বিল্ড করার সময় PRODUCT_CHECK_PREBUILT_MAX_PAGE_SIZE := true সেট করতে পারেন। এগুলিকে সাময়িকভাবে উপেক্ষা করার জন্য Android.bp তে ignore_max_page_size: true এবং Android.mk তে LOCAL_IGNORE_MAX_PAGE_SIZE := true ব্যবহার করুন। এই সেটিংস সমস্ত প্রি-বিল্ট যাচাই করে এবং কোনো একটি আপডেট করা হলেও তা ১৬ কেবি-তে অ্যালাইন করা না থাকলে, তা শনাক্ত করতে সাহায্য করে।

  • আপনি atest elf_alignment_test চালাতে পারেন, যা Android 15 এবং তার পরবর্তী সংস্করণ দিয়ে চালু হওয়া ডিভাইসগুলিতে অন-ডিভাইস ELF ফাইলগুলির অ্যালাইনমেন্ট যাচাই করে।