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

পৃষ্ঠার আকার হল গ্রানুলারিটি যেখানে একটি OS মেমরি পরিচালনা করে। বেশিরভাগ CPU আজ 4 KB পৃষ্ঠার আকার সমর্থন করে এবং তাই Android OS এবং অ্যাপগুলি ঐতিহাসিকভাবে তৈরি করা হয়েছে এবং 4 KB পৃষ্ঠার আকারের সাথে চালানোর জন্য অপ্টিমাইজ করা হয়েছে। ARM CPU গুলি 16 KB পৃষ্ঠার আকারকে সমর্থন করে এবং Android 15 থেকে শুরু করে, AOSP 16 KB পৃষ্ঠা আকারের সাথে Android তৈরির জন্য সমর্থন করে। এই বিকল্পটি অতিরিক্ত মেমরি ব্যবহার করে কিন্তু সিস্টেমের কর্মক্ষমতা উন্নত করে। অ্যান্ড্রয়েড 15 হিসাবে, এই বিকল্পটি ডিফল্টরূপে সক্ষম নয়, তবে এটি ভবিষ্যতে সর্বত্র 16 KB মোডে স্যুইচ করার জন্য OEM এবং অ্যাপ বিকাশকারীদের জন্য একটি বিকাশকারী মোড বা বিকাশকারী বিকল্প হিসাবে উপলব্ধ।

Android 15 এবং উচ্চতর 16 KB ELF অ্যালাইনমেন্ট সহ Android তৈরির জন্য সমর্থন রয়েছে, যা 4 KB এবং 16 KB কার্নেলের সাথে কাজ করে। একটি 16 KB কার্নেলের সাথে ব্যবহার করা হলে, এই কনফিগারেশনটি অতিরিক্ত মেমরি ব্যবহার করে কিন্তু সিস্টেমের কর্মক্ষমতা উন্নত করে।

অ্যান্ড্রয়েড ইউজারস্পেস 16 KB এ সেট করুন

16 KB পৃষ্ঠাগুলি শুধুমাত্র arm64 টার্গেটে 16 KB কার্নেল সহ সমর্থিত। যাইহোক, কাটলফিশের জন্য x86_64 এ 16 KB ইউজারস্পেস সিমুলেট করার একটি বিকল্পও রয়েছে।

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

অ্যান্ড্রয়েড ইউজারস্পেসে 16 কেবি পৃষ্ঠার আকার সমর্থন সক্ষম করতে, আপনার পণ্যে নিম্নলিখিত বিল্ড বিকল্পগুলি সেট করুন:

  • PRODUCT_NO_BIONIC_PAGE_SIZE_MACRO := true PAGE_SIZE সংজ্ঞায়িত সরিয়ে দেয় এবং এটি রানটাইমে পৃষ্ঠার আকার নির্ধারণ করে।
  • PRODUCT_MAX_PAGE_SIZE_SUPPORTED := 16384 যা নিশ্চিত করে যে প্ল্যাটফর্ম ELF ফাইলগুলি 16 KB প্রান্তিককরণের সাথে তৈরি করা হয়েছে৷ প্রয়োজনের চেয়ে বড় এই আকারটি ভবিষ্যতের সামঞ্জস্যের জন্য। 16 KB ELF প্রান্তিককরণের সাথে, কার্নেল 4 KB/16 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 পরিবেশে পার্থক্যের কারণে রানটাইম সমস্যা হতে পারে।

16 KB পেজ সাইজ সিস্টেম প্রোগ্রামিং

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

আপনি যদি একটি 1 KB, 2 KB, বা 4 KB পর্যন্ত একটি 4 KB সিস্টেমে mmap কল করেন, তাহলে সিস্টেম এটি বাস্তবায়নের জন্য 4 KB সংরক্ষণ করে। অন্য কথায়, কার্নেল থেকে মেমরির অনুরোধ করার সময়, কার্নেলকে সবসময় অনুরোধ করা মেমরিটিকে নিকটতম পৃষ্ঠার আকারে রাউন্ড আপ করতে হবে। উদাহরণস্বরূপ, যদি আপনি একটি 4 KB অঞ্চলে 5 KB অঞ্চল বরাদ্দ করেন, কার্নেল 8 KB বরাদ্দ করে।

একটি 16 KB কার্নেলে, পৃষ্ঠাগুলির এই অতিরিক্ত "টেইল এন্ড" বড় হয়। উদাহরণস্বরূপ, 1 KB থেকে 5 KB পর্যন্ত এই সমস্ত বরাদ্দ 16 KB কার্নেলের সাথে ব্যবহার করা হলে 16 KB বরাদ্দ করা হবে। আপনি 17 KB অনুরোধ করলে, এটি 32 KB বরাদ্দ করে।

উদাহরণস্বরূপ, একটি 4 KB সিস্টেমে, দুটি 4 KB রিড-রাইট বেনামী অঞ্চল বরাদ্দ করা ঠিক আছে৷ যাইহোক, একটি 16 KB কার্নেলে, এর ফলে দুটি পৃষ্ঠা বা 32 KB বরাদ্দ করা হবে। একটি 16 KB কার্নেলে, যদি সম্ভব হয়, এই অঞ্চলগুলিকে একটি একক পঠিত বা লেখার যোগ্য পৃষ্ঠায় একত্রিত করা যেতে পারে যাতে শুধুমাত্র 16 KB ব্যবহার করা হয়, 4 KB কার্নেলের ক্ষেত্রে 8 KB নষ্ট হয়। আরও বেশি মেমরি ব্যবহার কমাতে, আরও পৃষ্ঠাগুলি একত্রিত করা যেতে পারে। প্রকৃতপক্ষে, একটি 16 KB সিস্টেমে যা সর্বাধিক অপ্টিমাইজ করা হয়, 16 KB পৃষ্ঠাগুলির জন্য 4 KB সিস্টেমের চেয়ে কম মেমরির প্রয়োজন হয় কারণ পৃষ্ঠা টেবিলটি একই মেমরির আকারের এক চতুর্থাংশ।

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

16 KB ELF প্রান্তিককরণের সাথে শেয়ার্ড লাইব্রেরি তৈরি করুন৷

শেয়ার্ড লাইব্রেরি তৈরি করতে যা অ্যান্ড্রয়েড প্রোজেক্টের অংশ, 16 কেবি পৃষ্ঠার আকার সক্ষম করার আগের সেটিংস যথেষ্ট:

  • PRODUCT_NO_BIONIC_PAGE_SIZE_MACRO := true
  • PRODUCT_MAX_PAGE_SIZE_SUPPORTED := 16384

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

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

16 KB ELF প্রান্তিককরণের জন্য বাইনারি এবং প্রিবিল্ট যাচাই করুন

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

  • Android W (AOSP পরীক্ষামূলক) থেকে শুরু করে, আপনি বিল্ড টাইমে PRODUCT_CHECK_PREBUILT_MAX_PAGE_SIZE := true সেট করতে পারেন। সাময়িকভাবে উপেক্ষা করতে ignore_max_page_size ব্যবহার করুন: Android.bpignore_max_page_size: true এবং LOCAL_IGNORE_MAX_PAGE_SIZE := true Android.mk এ সত্য। এই সেটিংসগুলি সমস্ত পূর্বনির্মাণগুলি যাচাই করে এবং আপনাকে সনাক্ত করার অনুমতি দেয় যখন একটি আপডেট করা হয় কিন্তু 16 KB সারিবদ্ধ নয়।

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