Android ভার্চুয়ালাইজেশন ফ্রেমওয়ার্ক প্রয়োগ করার জন্য প্রয়োজনীয় সব কম্পোনেন্টের রেফারেন্স প্রয়োগ Android প্রদান করে। বর্তমানে এই প্রয়োগ ARM64-এ সীমিত। এই পৃষ্ঠায় ফ্রেমওয়ার্ক আর্কিটেকচার সম্পর্কে ব্যাখ্যা করা হয়েছে।
ব্যাকগ্রাউন্ড
Arm আর্কিটেকচার সর্বাধিক চারটি ব্যতিক্রম লেভেলের অনুমতি দেয়, যার মধ্যে ব্যতিক্রম লেভেল ০ (EL0) সবচেয়ে কম এবং ব্যতিক্রম লেভেল ৩ (EL3) সবচেয়ে বেশি সুবিধা পায়। Android কোডবেসের সবচেয়ে বড় অংশ (সমস্ত ইউজারস্পেস কম্পোনেন্ট) EL0-তে রান করে। সাধারণত "Android" বলতে যা বোঝায় তার বাকি অংশ হল Linux কার্নেল, যা EL1-এ রান করে।
EL2 লেয়ার হাইপারভাইজারকে ইন্ট্রোডিউস করার অনুমতি দেয় যা EL1/EL0-এ মেমরি ও ডিভাইসকে আলাদা pVM-এ আইসোলেট করতে সাহায্য করে। এর সাথে, এটি গোপনীয়তা ও ইন্টিগ্রিটির গ্যারান্টি দেয়।
হাইপারভাইজার
সুরক্ষিত কার্নেল-ভিত্তিক ভার্চুয়াল মেশিন (pKVM) Linux KVM হাইপারভাইজরের উপর ভিত্তি করে তৈরি করা হয়েছে, যা তৈরি করার সময় ‘সুরক্ষিত’ হিসেবে চিহ্নিত গেস্ট ভার্চুয়াল মেশিনে চলমান পেলোড অ্যাক্সেস সীমাবদ্ধ করার ক্ষমতা দিয়ে এক্সটেন্ড করা হয়েছে।
KVM/arm64-এ নির্দিষ্ট CPU ফিচারের উপলভ্যতার উপর নির্ভর করে বিভিন্ন এক্সিকিউশন মোড কাজ করে।
যেমন, ভার্চুয়ালাইজেশন হোস্ট এক্সটেনশন (VHE) (ARMv8.1
ও তার পরের যেকোনও ভার্সন)। এইসব মোডের মধ্যে একটি, যা সাধারণত নন-VHE মোড হিসেবে পরিচিত, এতে বুট করার সময়
হাইপারভাইজার কোড কার্নেল ইমেজ থেকে আলাদা করে EL2-তে
ইনস্টল করা হয়, যেখানে কার্নেলটি EL1-এ রান করে। Linux কোডবেসের অংশ হলেও, KVM-এর EL2 কম্পোনেন্ট হল একটি ছোট কম্পোনেন্ট যা একাধিক EL1-এর মধ্যে সুইচ করার দায়িত্বে থাকে। হাইপারভাইজর কম্পোনেন্ট Linux-এর সাথে কম্পাইল করা হয়, কিন্তু vmlinux ইমেজের আলাদা, নির্দিষ্ট মেমরি সেকশনে থাকে। pKVM এই ডিজাইনকে কাজে লাগায়। এটি হাইপারভাইজর কোডকে নতুন ফিচারের সাথে এক্সটেন্ড করে। এর ফলে এটি Android হোস্ট কার্নেল ও ইউজার স্পেসে বিধিনিষেধ আরোপ করতে পারে এবং গেস্ট মেমরি ও হাইপারভাইজরে হোস্ট অ্যাক্সেস সীমিত করতে পারে।
pKVM ভেন্ডর মডিউল
pKVM ভেন্ডর মডিউল হল হার্ডওয়্যার-নির্দিষ্ট মডিউল যাতে ইনপুট-আউটপুট মেমরি ম্যানেজমেন্ট ইউনিট (IOMMU) ড্রাইভারের মতো ডিভাইস-নির্দিষ্ট কার্যকারিতা থাকে। এইসব মডিউল আপনাকে pKVM-এ ব্যতিক্রম লেভেল ২ (EL2) অ্যাক্সেস প্রয়োজন এমন নিরাপত্তা ফিচার পোর্ট করতে দেয়।
pKVM ভেন্ডর মডিউল কীভাবে প্রয়োগ ও লোড করতে হয় তা জানতে, pKVM ভেন্ডর মডিউল প্রয়োগ করুন দেখুন।
বুট করার পদ্ধতি
নিচের ছবিতে pKVM বুট প্রসেডিওর দেখানো হয়েছে:
- ইনিশিয়ালাইজেশন: বুটলোডার EL2-তে জেনেরিক কার্নেলে প্রবেশ করে। EL2 এবং EL1-এ বিশ্বস্ত কার্নেল কোড pKVM এবং এর মডিউলগুলি শুরু করে। এই ফেজে, EL2, EL1-কে বিশ্বাস করে, তাই কোনও অবিশ্বস্ত কোড এক্সিকিউট করা হয় না।
- ডিপ্রিভিলেজ কার্নেল: জেনেরিক কার্নেল শনাক্ত করে যে এটি EL2-এ রান করছে এবং নিজেকে EL1-এ ডিপ্রিভিলেজ করে। pKVM ও এর মডিউল EL2-এ রান করা চালিয়ে যায়।
- রানটাইম: জেনেরিক কার্নেল স্বাভাবিকভাবে বুট করার প্রসেস চালিয়ে যায়, ব্যবহারকারীর স্পেসে না পৌঁছানো পর্যন্ত প্রয়োজনীয় সব ডিভাইস ড্রাইভার লোড করে। এই পর্যায়ে, pKVM চালু হয়ে যায় এবং স্টেজ-২ পেজ টেবিল ম্যানেজ করে।
বুট প্রসিডিউর, ইনিশিয়ালাইজেশন ফেজের জন্য কার্নেল ইমেজের ইন্টিগ্রিটি যাচাই ও বজায় রাখার জন্য বুটলোডারকে বিশ্বাস করে। কার্নেলকে বিশেষ সুবিধা থেকে বঞ্চিত করার পরে, হাইপারভাইজার এটিকে আর বিশ্বাসযোগ্য হিসেবে বিবেচনা করে না, তারপরে কার্নেল আপোস করা হলেও নিজেকে রক্ষা করার দায়িত্ব হাইপারভাইজারের।
একই বাইনারি ইমেজে Android কার্নেল ও হাইপারভাইজর থাকলে, তাদের মধ্যে খুব নিবিড়ভাবে যুক্ত কমিউনিকেশন ইন্টারফেসের সুবিধা পাওয়া যায়। এই নিবিড় কাপলিং দুটি কম্পোনেন্টের অ্যাটমিক আপডেট নিশ্চিত করে, যার ফলে তাদের মধ্যে ইন্টারফেস স্থিতিশীল রাখার প্রয়োজনীয়তা এড়ানো যায় এবং দীর্ঘমেয়াদী রক্ষণাবেক্ষণের সাথে আপস না করেই প্রচুর নমনীয়তা প্রদান করে। এছাড়াও, টাইট কাপলিং পারফর্ম্যান্স অপ্টিমাইজ করার অনুমতি দেয়, যখন উভয় কম্পোনেন্ট হাইপারভাইজারের দেওয়া নিরাপত্তা গ্যারান্টিকে প্রভাবিত না করেই সহযোগিতা করতে পারে।
এছাড়াও, Android ইকোসিস্টেমে GKI গ্রহণ করার ফলে, কার্নেলের মতো একই বাইনারিতে pKVM হাইপারভাইজরকে Android ডিভাইসে অটোমেটিক ডেপ্লয় করা যায়।
সিপিইউ মেমরি অ্যাক্সেস সুরক্ষা
Arm আর্কিটেকচার দুটি স্বতন্ত্র স্টেজে বিভক্ত মেমরি ম্যানেজমেন্ট ইউনিট (MMU) নির্দিষ্ট করে, যার দুটিই অ্যাড্রেস ট্রান্সলেশন এবং মেমরির বিভিন্ন অংশে অ্যাক্সেস কন্ট্রোল প্রয়োগ করতে ব্যবহার করা যেতে পারে। স্টেজ ১ MMU EL1 দ্বারা নিয়ন্ত্রিত হয় এবং এটি অ্যাড্রেস ট্রান্সলেশনের প্রথম লেভেলকে অনুমতি দেয়। স্টেজ ১ MMU, প্রতিটি ইউজারস্পেস প্রসেস ও নিজের ভার্চুয়াল অ্যাড্রেস স্পেসকে দেওয়া ভার্চুয়াল অ্যাড্রেস স্পেস ম্যানেজ করার জন্য Linux ব্যবহার করে।
স্টেজ ২ MMU, EL2 দ্বারা নিয়ন্ত্রিত হয় এবং স্টেজ ১ MMU-এর আউটপুট অ্যাড্রেসে দ্বিতীয় অ্যাড্রেস ট্রান্সলেশন প্রয়োগ করার সুবিধা চালু করে, যার ফলে আসল ঠিকানা (PA) পাওয়া যায়। হাইপারভাইজার, স্টেজ ২ অনুবাদ ব্যবহার করে সব গেস্ট VM থেকে মেমরি অ্যাক্সেস নিয়ন্ত্রণ ও অনুবাদ করতে পারে। ছবি ২-এ যেমন দেখানো হয়েছে, অনুবাদ করার দুটি ধাপই চালু করা থাকলে, ধাপ ১-এর আউটপুট অ্যাড্রেসকে ইন্টারমিডিয়েট ফিজিক্যাল অ্যাড্রেস (IPA) বলা হয় মনে রাখবেন: ভার্চুয়াল অ্যাড্রেস (VA) প্রথমে IPA এবং তারপরে PA-তে অনুবাদ করা হয়।
ঐতিহাসিকভাবে, গেস্ট চালানোর সময় KVM স্টেজ ২ ট্রান্সলেশন চালু রেখে চলে এবং হোস্ট Linux কার্নেল চালানোর সময় স্টেজ ২ বন্ধ রেখে চলে। এই আর্কিটেকচার, হোস্ট স্টেজ ১ MMU থেকে মেমরি অ্যাক্সেসকে স্টেজ ২ MMU-এর মধ্য দিয়ে যেতে দেয়, এর ফলে হোস্ট থেকে গেস্ট মেমরি পেজে আনরেস্ট্রিক্টেড অ্যাক্সেস পাওয়া যায়। অন্যদিকে, pKVM হোস্ট কনটেক্সটেও স্টেজ ২ সুরক্ষা চালু করে এবং হোস্টের পরিবর্তে হাইপারভাইজারকে গেস্ট মেমরি পৃষ্ঠা সুরক্ষার দায়িত্ব দেয়।
KVM, গেস্টের জন্য জটিল IPA/PA ম্যাপিং প্রয়োগ করতে, স্টেজ ২-এ অ্যাড্রেস ট্রান্সলেশনের সম্পূর্ণ ব্যবহার করে, যা ফিজিক্যাল ফ্র্যাগমেন্টেশন সত্ত্বেও গেস্টের জন্য কন্টিনিউয়াস মেমরির বিভ্রম তৈরি করে। তবে, হোস্টের জন্য স্টেজ ২ MMU-এর ব্যবহার শুধুমাত্র অ্যাক্সেস কন্ট্রোলের মধ্যে সীমাবদ্ধ। হোস্ট স্টেজ ২ হল আইডেন্টিটি-ম্যাপ করা, এটি নিশ্চিত করে যে হোস্ট IPA স্পেসের সংলগ্ন মেমরি PA স্পেসে সংলগ্ন। এই আর্কিটেকচার পেজ টেবিলে বড় ম্যাপিং ব্যবহার করার অনুমতি দেয় এবং এর ফলে ট্রান্সলেশন লুকাসাইড বাফার (TLB)-এর উপর চাপ কমে যায়। যেহেতু PA-এর মাধ্যমে কোনও পরিচয় ম্যাপিং ইন্ডেক্স করা যেতে পারে, তাই হোস্ট স্টেজ ২-ও সরাসরি পৃষ্ঠা টেবিলে পৃষ্ঠার মালিকানা ট্র্যাক করতে ব্যবহার করা হয়।
সরাসরি মেমরি অ্যাক্সেস (DMA) সুরক্ষা
আগে বর্ণনা করা হয়েছে, CPU পেজ টেবিল থেকে গেস্ট পেজ আনম্যাপ করা গেস্ট মেমরি সুরক্ষিত করার জন্য প্রয়োজনীয় হলেও যথেষ্ট নয়। এছাড়াও, pKVM-কে হোস্ট কার্নেলের নিয়ন্ত্রণে থাকা DMA-সক্ষম ডিভাইস দ্বারা মেমরি অ্যাক্সেস করা এবং কোনও ক্ষতিকর হোস্টের দ্বারা শুরু করা DMA অ্যাটাকের সম্ভাবনা থেকে রক্ষা করতে হবে। গেস্ট মেমরি অ্যাক্সেস করা থেকে এই ধরনের ডিভাইসকে প্রতিরোধ করতে, pKVM-এর ইনপুট-আউটপুট মেমরি ম্যানেজমেন্ট ইউনিট (IOMMU) হার্ডওয়্যার প্রয়োজন। এটি সিস্টেমের প্রতিটি DMA-সক্ষম ডিভাইসের জন্য প্রয়োজন, যেমনটি ৩ নম্বর ছবিতে দেখানো হয়েছে।
কমপক্ষে, IOMMU হার্ডওয়্যার পেজ গ্র্যানুলারিটিতে ফিজিক্যাল মেমরিতে ডিভাইসের জন্য রিড/রাইট অ্যাক্সেস প্রদান এবং প্রত্যাহার করার উপায় প্রদান করে। তবে, এই IOMMU হার্ডওয়্যার pVM-এ ডিভাইসের ব্যবহার সীমিত করে দেয় কারণ এটি ধরে নেয় যে আইডেন্টিটি-ম্যাপ করা স্টেজ ২ আছে।
ভার্চুয়াল মেশিনের মধ্যে আইসোলেশন নিশ্চিত করতে, আলাদা আলাদা এন্টিটির হয়ে তৈরি মেমরি ট্রানজ্যাকশনকে IOMMU-কে আলাদা করে চিনতে হবে, যাতে ট্রান্সলেশনের জন্য উপযুক্ত পেজ টেবিলের সেট ব্যবহার করা যায়।
এছাড়াও, EL2-তে SoC-নির্দিষ্ট কোডের পরিমাণ কমানো হল pKVM-এর সামগ্রিক বিশ্বস্ত কম্পিউটিং বেস (TCB) কমানোর একটি মূল কৌশল এবং এটি হাইপারভাইজরে IOMMU ড্রাইভার অন্তর্ভুক্ত করার বিরুদ্ধে কাজ করে। এই সমস্যা প্রশমিত করতে, EL1-এ হোস্ট, সহায়ক IOMMU ম্যানেজমেন্ট টাস্কের জন্য দায়ী, যেমন পাওয়ার ম্যানেজমেন্ট, ইনিশিয়ালাইজেশন এবং যেখানে উপযুক্ত, ইন্টারাপ্ট হ্যান্ডলিং।
তবে, হোস্টকে ডিভাইসের স্টেট কন্ট্রোল করার অনুমতি দিলে IOMMU হার্ডওয়্যারের প্রোগ্রামিং ইন্টারফেসে অতিরিক্ত প্রয়োজনীয়তা যোগ হয়। এটি নিশ্চিত করে যে অনুমতি চেকগুলি অন্য উপায়ে বাইপাস করা যাবে না, যেমন ডিভাইস রিসেট করার পরে।
Arm ডিভাইসের জন্য একটি স্ট্যান্ডার্ড এবং ভালভাবে সমর্থিত IOMMU যা আইসোলেশন এবং সরাসরি অ্যাসাইনমেন্ট উভয়ই সম্ভব করে তোলে তা হল Arm সিস্টেম মেমরি ম্যানেজমেন্ট ইউনিট (SMMU) আর্কিটেকচার। এই আর্কিটেকচার হল সাজেস্ট করা রেফারেন্স সমাধান।
মেমরির মালিকানা
বুট করার সময়, হাইপারভাইজার ছাড়া সব মেমরি হোস্টের মালিকানাধীন বলে ধরে নেওয়া হয় এবং হাইপারভাইজার সেগুলিকে সেইভাবেই ট্র্যাক করে। pVM তৈরি হলে, হোস্ট এটিকে বুট করার অনুমতি দেওয়ার জন্য মেমরি পৃষ্ঠা দান করে এবং হাইপারভাইজার সেই পৃষ্ঠাগুলির মালিকানা হোস্ট থেকে pVM-এ পরিবর্তন করে। তাই, হাইপারভাইজার হোস্টের স্টেজ ২ পেজ টেবিলে অ্যাক্সেস কন্ট্রোল সংক্রান্ত বিধিনিষেধ আরোপ করে যাতে এটি আবার পৃষ্ঠা অ্যাক্সেস করতে না পারে এবং এর ফলে গেস্টের গোপনীয়তা বজায় থাকে।
হোস্ট ও গেস্টের মধ্যে নিয়ন্ত্রিত মেমরি শেয়ারিংয়ের মাধ্যমে তাদের মধ্যে যোগাযোগ সম্ভব হয়। অতিথিদের হাইপারকল ব্যবহার করে হোস্টের সাথে তাদের কিছু পৃষ্ঠা শেয়ার করার অনুমতি দেওয়া হয়, যা হোস্টের স্টেজ ২ পেজ টেবিলে সেইসব পৃষ্ঠা রিম্যাপ করার জন্য হাইপারভাইজারকে নির্দেশ দেয়। একইভাবে, TrustZone-এর সাথে হোস্টের যোগাযোগ মেমরি শেয়ারিং এবং/অথবা লেন্ডিং অপারেশনের মাধ্যমে সম্ভব হয়, এইসব অপারেশন pKVM-এর মাধ্যমে Arm-এর জন্য ফার্মওয়্যার ফ্রেমওয়ার্ক (FF-A) স্পেসিফিকেশন ব্যবহার করে নিবিড়ভাবে মনিটর ও কন্ট্রোল করা হয়।
pVM-এর মেমরি সংক্রান্ত প্রয়োজনীয়তা সময়ের সাথে সাথে পরিবর্তিত হতে পারে বলে, একটি হাইপারকল প্রদান করা হয় যা কলকারীর মালিকানাধীন নির্দিষ্ট পৃষ্ঠাগুলিকে হোস্টের কাছে ফিরিয়ে দেওয়ার অনুমতি দেয়। বাস্তবে, এই হাইপারকলটি virtio বেলুন প্রোটোকলের সাথে ব্যবহার করা হয় যাতে VMM, pVM-এর থেকে মেমরি ফেরত নেওয়ার অনুরোধ করতে পারে এবং pVM, VMM-কে ছেড়ে দেওয়া পৃষ্ঠাগুলির বিষয়ে জানাতে পারে, তবে তা একটি নিয়ন্ত্রিত উপায়ে।
সিস্টেমের সব মেমরি পৃষ্ঠার মালিকানা ট্র্যাক করা এবং সেগুলি অন্য কোনও এন্টিটিকে শেয়ার করা বা ধার দেওয়া হচ্ছে কিনা তা দেখার দায়িত্ব হাইপারভাইজারের। হোস্ট ও অতিথিদের স্টেজ ২ পেজ টেবিলের সাথে অ্যাটাচ করা মেটাডেটা ব্যবহার করে এই স্টেট ট্র্যাকিংয়ের বেশিরভাগ কাজ করা হয়। এর জন্য পেজ টেবিল এন্ট্রি (PTE)-তে রিজার্ভ করা বিট ব্যবহার করা হয়। এগুলি নাম থেকেই বোঝা যায় যে, সফ্টওয়্যারের ব্যবহারের জন্য রিজার্ভ করা থাকে।
হোস্টকে অবশ্যই নিশ্চিত করতে হবে যে এটি হাইপারভাইজার দ্বারা অ্যাক্সেসযোগ্য নয় এমন পৃষ্ঠাগুলি অ্যাক্সেস করার চেষ্টা করবে না। অবৈধ হোস্ট অ্যাক্সেস হাইপারভাইজারের মাধ্যমে হোস্টের মধ্যে একটি সিঙ্ক্রোনাস ব্যতিক্রম ইনজেক্ট করে, যার ফলে দায়িত্বপ্রাপ্ত ইউজারস্পেস টাস্ক একটি SEGV সিগন্যাল পেতে পারে অথবা হোস্ট কার্নেল ক্র্যাশ করতে পারে। ভুলবশত অ্যাক্সেস আটকানোর জন্য, অতিথিদের দান করা পৃষ্ঠাগুলি হোস্ট কার্নেল দ্বারা অদলবদল বা মার্জ করার জন্য অনুপযুক্ত করা হয়।
ইন্টারাপ্ট হ্যান্ডেলিং ও টাইমার
ইন্টারাপ্ট হল গেস্টের ডিভাইসের সাথে ইন্টার্যাক্ট করার এবং CPU-এর মধ্যে যোগাযোগের একটি অপরিহার্য অংশ, যেখানে ইন্টারপ্রসেসর ইন্টারাপ্ট (IPI) হল প্রধান যোগাযোগের মেকানিজম। KVM মডেলের উদ্দেশ্য হল EL1-এ হোস্টকে সব ভার্চুয়াল ইন্টারাপ্ট ম্যানেজমেন্টের দায়িত্ব দেওয়া, এই উদ্দেশ্যে এটি হাইপারভাইজারের অবিশ্বস্ত অংশ হিসেবে কাজ করে।
pKVM, আগে থেকে থাকা KVM কোডের উপর ভিত্তি করে সম্পূর্ণ জেনেরিক ইন্টারাপ্ট কন্ট্রোলার ভার্সন ৩ (GICv3) এমুলেশন অফার করে। টাইমার ও IPI এই অবিশ্বস্ত এমুলেশন কোডের অংশ হিসেবে ম্যানেজ করা হয়।
GICv3 কাজ করে
EL1 ও EL2-এর মধ্যে ইন্টারফেসকে অবশ্যই নিশ্চিত করতে হবে যে সম্পূর্ণ ইন্টারাপ্ট স্টেট যেন EL1 হোস্টের কাছে দৃশ্যমান হয়, এর মধ্যে ইন্টারাপ্ট সম্পর্কিত হাইপারভাইজার রেজিস্টারের কপিও অন্তর্ভুক্ত। এই দৃশ্যমানতা সাধারণত শেয়ার করা মেমরি অঞ্চল ব্যবহার করে সম্পন্ন করা হয়, প্রতিটি ভার্চুয়াল সিপিইউ (vCPU) পিছু একটি করে।
সিস্টেম রেজিস্টার রানটাইম সাপোর্ট কোডকে আরও সহজ করে শুধুমাত্র সফ্টওয়্যার জেনারেটেড ইন্টারাপ্ট রেজিস্টার (SGIR) এবং ডিঅ্যাক্টিভেট ইন্টারাপ্ট রেজিস্টার (DIR) রেজিস্টার ট্র্যাপিং সাপোর্ট করার জন্য অপ্টিমাইজ করা যেতে পারে। আর্কিটেকচার অনুযায়ী এই রেজিস্টারগুলি সবসময় EL2-তে ট্র্যাপ করে, যেখানে অন্যান্য ট্র্যাপগুলি এখনও পর্যন্ত শুধুমাত্র ত্রুটি প্রশমিত করার জন্য উপযোগী। বাকি সবকিছু হার্ডওয়্যারে ম্যানেজ করা হচ্ছে।
MMIO-এর দিকে, EL1-এ সবকিছু এমুলেট করা হয়, KVM-এ বর্তমান ইনফ্রাস্ট্রাকচার আবার ব্যবহার করা হয়। সবশেষে, Wait for Interrupt (WFI) সবসময় EL1-এ রিলে করা হয়, কারণ এটি KVM-এর ব্যবহার করা অন্যতম বেসিক শিডিউলিং প্রিমিটিভ।
টাইমার সংক্রান্ত সহায়তা
প্রতিটি ট্র্যাপিং WFI-তে ভার্চুয়াল টাইমারের তুলনাকারী ভ্যালু EL1-এর কাছে প্রকাশ করতে হবে যাতে vCPU ব্লক থাকাকালীন EL1 টাইমার ইন্টারাপ্ট ইনজেক্ট করতে পারে। ফিজিক্যাল টাইমার সম্পূর্ণভাবে এমুলেট করা হয় এবং EL1-এ সমস্ত ট্র্যাপ রিলে করা হয়।
MMIO ম্যানেজ করা
ভার্চুয়াল মেশিন মনিটরের (VMM) সাথে যোগাযোগ করতে এবং GIC এমুলেশন পারফর্ম করতে, MMIO ট্র্যাপকে আরও ট্রায়াজ করার জন্য EL1-এ হোস্টের কাছে রিলে করতে হবে। pKVM-এর জন্য নিম্নলিখিত বিষয়গুলি প্রয়োজন:
- IPA ও অ্যাক্সেসের সাইজ
- রাইট করার ক্ষেত্রে ডেটা
- ট্র্যাপিংয়ের সময় সিপিইউ-এর এন্ডিয়ানেস
এছাড়াও, সোর্স/ডেস্টিনেশন হিসেবে জেনারেল পারপাস রেজিস্টার (GPR) সহ ট্র্যাপগুলি অ্যাবস্ট্রাক্ট ট্রান্সফার সিউডো-রেজিস্টার ব্যবহার করে রিলে করা হয়।
গেস্ট ইন্টারফেস
হাইপারকলের কম্বিনেশন এবং ট্র্যাপ করা অঞ্চলে মেমরি অ্যাক্সেস ব্যবহার করে, একজন গেস্ট সুরক্ষিত গেস্টের সাথে যোগাযোগ করতে পারেন। SMCCC স্ট্যান্ডার্ড অনুযায়ী হাইপারকল এক্সপোজ করা হয়, KVM-এর মাধ্যমে ভেন্ডর অ্যালোকেশনের জন্য রেঞ্জ রিজার্ভ করা থাকে। pKVM গেস্টের জন্য নিম্নলিখিত হাইপারকলগুলি বিশেষভাবে গুরুত্বপূর্ণ।
জেনেরিক হাইপারকল
- PSCI, গেস্টের জন্য এর vCPU-এর লাইফসাইকেল কন্ট্রোল করার একটি স্ট্যান্ডার্ড মেকানিজম প্রদান করে, যার মধ্যে অনলাইন, অফলাইন ও সিস্টেম শাটডাউন অন্তর্ভুক্ত।
- TRNG, pKVM থেকে এন্ট্রপি পাওয়ার জন্য অতিথির অনুরোধের একটি স্ট্যান্ডার্ড মেকানিজম প্রদান করে, যা EL3-তে কল রিলে করে। এই মেকানিজম বিশেষ করে সেইসব ক্ষেত্রে উপযোগী যেখানে হার্ডওয়্যার র্যান্ডম নম্বর জেনারেটর (RNG) ভার্চুয়ালাইজ করার জন্য হোস্টকে বিশ্বাস করা যায় না।
pKVM হাইপারকল
- হোস্টের সাথে স্মৃতি শেয়ার করা। গেস্ট মেমরি প্রাথমিকভাবে হোস্টের কাছে অ্যাক্সেসযোগ্য নয়, কিন্তু শেয়ার করা মেমরি কমিউনিকেশন এবং শেয়ার করা বাফারের উপর নির্ভর করে এমন প্যারাভার্চুয়ালাইজড ডিভাইসের জন্য হোস্ট অ্যাক্সেস প্রয়োজন। হোস্টের সাথে পৃষ্ঠা শেয়ার ও আনশেয়ার করার জন্য হাইপারকল অতিথিকে ঠিক কোন মেমরি বাকি Android-এর জন্য অ্যাক্সেসযোগ্য করা হবে তা নির্ধারণ করতে দেয়, এর জন্য হ্যান্ডশেকের প্রয়োজন হয় না।
- হোস্টকে মেমরি ছেড়ে দেওয়া। সাধারণত, সব অতিথি মেমরি ধ্বংস না হওয়া পর্যন্ত
অতিথিরই থাকে। এই অবস্থাটি দীর্ঘস্থায়ী VM-এর জন্য অপর্যাপ্ত হতে পারে
যার মেমরির প্রয়োজনীয়তা সময়ের সাথে পরিবর্তিত হয়।
relinquishহাইপারকল গেস্টকে স্পষ্টভাবে পৃষ্ঠার মালিকানা হোস্টকে ট্রান্সফার করার অনুমতি দেয়, এর জন্য গেস্টকে বন্ধ করার প্রয়োজন হয় না। - হোস্টের জন্য মেমরি অ্যাক্সেস ট্র্যাপিং। প্রথাগতভাবে, কোনও KVM গেস্ট যদি এমন কোনও অ্যাড্রেস অ্যাক্সেস করে যা কোনও বৈধ মেমরি অঞ্চলের সাথে সম্পর্কিত নয়, তাহলে vCPU থ্রেডটি হোস্ট থেকে বেরিয়ে আসে এবং অ্যাক্সেসটি সাধারণত MMIO-এর জন্য ব্যবহৃত হয় এবং VMM দ্বারা ব্যবহারকারী স্পেসে এমুলেট করা হয়। এই হ্যান্ডলিং সহজ করতে, pKVM-কে ত্রুটিপূর্ণ নির্দেশ সম্পর্কে বিশদ বিবরণ বিজ্ঞাপন করতে হবে যেমন এর ঠিকানা, রেজিস্টার প্যারামিটার এবং সম্ভাব্যভাবে তাদের কন্টেন্ট হোস্টের কাছে ফেরত পাঠাতে হবে, যা অনিচ্ছাকৃতভাবে একটি সুরক্ষিত গেস্ট থেকে সংবেদনশীল ডেটা প্রকাশ করতে পারে যদি ট্র্যাপটি প্রত্যাশিত না হয়। pKVM এই সমস্যাটি সমাধান করে এই ত্রুটিগুলিকে মারাত্মক হিসাবে বিবেচনা করে যতক্ষণ না গেস্ট আগে একটি হাইপারকল জারি করে ত্রুটিপূর্ণ IPA রেঞ্জকে এমন একটি হিসাবে চিহ্নিত করে যার জন্য অ্যাক্সেস হোস্টের কাছে ট্র্যাপ ব্যাক করার অনুমতি দেয়। এই সমাধানকে MMIO গার্ড বলা হয়।
ভার্চুয়াল I/O ডিভাইস (virtio)
প্যারাভার্চুয়ালাইজড ডিভাইস প্রয়োগ ও ইন্টার্যাক্ট করার জন্য Virtio হল একটি জনপ্রিয়, পোর্টেবল ও পরিপক্ক স্ট্যান্ডার্ড। সুরক্ষিত অতিথিদের জন্য উন্মুক্ত থাকা বেশিরভাগ ডিভাইস virtio ব্যবহার করে প্রয়োগ করা হয়। এছাড়াও, Virtio, সুরক্ষিত গেস্ট এবং Android-এর বাকি অংশের মধ্যে যোগাযোগের জন্য ব্যবহৃত vsock ইমপ্লিমেন্টেশনকে আন্ডারপিন করে।
Virtio ডিভাইস সাধারণত VMM-এর মাধ্যমে হোস্টের ব্যবহারকারীর স্পেসে প্রয়োগ করা হয়, যা virtio ডিভাইসের MMIO ইন্টারফেস থেকে গেস্টের ট্র্যাপ করা মেমরি অ্যাক্সেসকে ইন্টারসেপ্ট করে এবং প্রত্যাশিত আচরণকে এমুলেট করে। MMIO অ্যাক্সেস তুলনামূলকভাবে বেশি খরচসাপেক্ষ কারণ ডিভাইসে প্রতিটি অ্যাক্সেসের জন্য VMM-এ যাওয়া এবং ফিরে আসার প্রয়োজন হয়, তাই ডিভাইস এবং গেস্টের মধ্যে বেশিরভাগ আসল ডেটা ট্রান্সফার মেমরিতে ভার্চুয়াল কিউয়ের একটি সেট ব্যবহার করে ঘটে। virtio-এর একটি মূল অনুমান হল হোস্ট ইচ্ছামতো গেস্ট মেমরি অ্যাক্সেস করতে পারে। এই অনুমান virtqueue-এর ডিজাইনে স্পষ্ট, এতে গেস্টের বাফারগুলিতে পয়েন্টার থাকতে পারে যা ডিভাইস এমুলেশন সরাসরি অ্যাক্সেস করতে চায়।
যদিও আগে বর্ণিত মেমরি শেয়ারিং হাইপারকলগুলি গেস্ট থেকে হোস্টে virtio ডেটা বাফার শেয়ার করতে ব্যবহার করা যেতে পারে, এই শেয়ারিংটি অবশ্যই পৃষ্ঠা গ্রানুলারিটিতে করা হয় এবং বাফারের সাইজ পৃষ্ঠার চেয়ে কম হলে প্রয়োজনের চেয়ে বেশি ডেটা প্রকাশ করতে পারে। এর পরিবর্তে, গেস্ট শেয়ার করা মেমরির একটি নির্দিষ্ট উইন্ডো থেকে ভার্চুয়াল কিউ ও তার সংশ্লিষ্ট ডেটা বাফার বরাদ্দ করার জন্য কনফিগার করা হয়, যেখানে প্রয়োজন অনুযায়ী ডেটা উইন্ডোতে কপি (বাউন্স) করা হয় ও উইন্ডো থেকে কপি করা হয়।
TrustZone-এর সাথে ইন্টার্যাকশন
যদিও অতিথিরা TrustZone-এর সাথে সরাসরি ইন্টার্যাক্ট করতে পারেন না, তবুও হোস্টকে সুরক্ষিত জগতে SMC কল ইস্যু করতে হবে। এইসব কল, হোস্ট অ্যাক্সেস করতে পারে না এমন ফিজিক্যালি অ্যাড্রেস করা মেমরি বাফার নির্দিষ্ট করতে পারে। যেহেতু সুরক্ষিত সফ্টওয়্যার সাধারণত বাফারের অ্যাক্সেসিবিলিটি সম্পর্কে অবগত থাকে না, তাই একটি ক্ষতিকারক হোস্ট এই বাফারটি ব্যবহার করে কনফিউজড ডেপুটি অ্যাটাক করতে পারে (DMA অ্যাটাকের মতো)। এই ধরনের আক্রমণ প্রতিরোধ করতে, pKVM হোস্টের সমস্ত SMC কল EL2-তে ট্র্যাপ করে এবং EL3-তে হোস্ট ও সুরক্ষিত মনিটরের মধ্যে প্রক্সি হিসেবে কাজ করে।
হোস্টের থেকে PSCI কলগুলি ন্যূনতম পরিবর্তন সহ EL3 ফার্মওয়্যারে ফরওয়ার্ড করা হয়। বিশেষত, কোনও CPU অনলাইন হলে বা সাসপেন্ড অবস্থা থেকে আবার চালু হলে, তার এন্ট্রি পয়েন্ট আবার লেখা হয়, যাতে EL1-এ হোস্টের কাছে ফিরে আসার আগে EL2-তে স্টেজ ২ পেজ টেবিল ইনস্টল করা যায়। বুট করার সময়, pKVM-এর মাধ্যমে এই সুরক্ষা প্রয়োগ করা হয়।
এই আর্কিটেকচার PSCI-কে সাপোর্ট করে এমন SoC-এর উপর নির্ভর করে, বিশেষত TF-A-এর আপ-টু-ডেট ভার্সন EL3 ফার্মওয়্যার হিসেবে ব্যবহার করার মাধ্যমে।
Firmware Framework for Arm (FF-A) সাধারণ ও সুরক্ষিত জগতের মধ্যে ইন্টার্যাকশনকে স্ট্যান্ডার্ডাইজ করে, বিশেষ করে সুরক্ষিত হাইপারভাইজরের উপস্থিতিতে। স্পেসিফিকেশনের একটি প্রধান অংশ, সাধারণ মেসেজ ফর্ম্যাট এবং অন্তর্নিহিত পৃষ্ঠার জন্য ভালভাবে সংজ্ঞায়িত অনুমতি মডেল ব্যবহার করে, নিরাপদ বিশ্বের সাথে মেমরি শেয়ার করার একটি প্রক্রিয়াকে সংজ্ঞায়িত করে। pKVM, FF-A মেসেজ প্রক্সি করে যাতে হোস্ট নিরাপদ-সাইডের সাথে মেমরি শেয়ার করার চেষ্টা না করে যার জন্য এটির কাছে যথেষ্ট অনুমতি নেই।
এই আর্কিটেকচারটি মেমরি অ্যাক্সেস মডেল প্রয়োগকারী সুরক্ষিত ওয়ার্ল্ড সফ্টওয়্যারের উপর নির্ভর করে, যাতে এটি নিশ্চিত করা যায় যে সুরক্ষিত ওয়ার্ল্ডে চলমান বিশ্বস্ত অ্যাপ এবং অন্য যেকোনও সফ্টওয়্যার শুধুমাত্র তখনই মেমরি অ্যাক্সেস করতে পারবে যদি সেটি একমাত্র সুরক্ষিত ওয়ার্ল্ডের মালিকানাধীন হয় অথবা FF-A ব্যবহার করে স্পষ্টভাবে এর সাথে শেয়ার করা হয়। S-EL2 সহ সিস্টেমে, মেমরি অ্যাক্সেস মডেল প্রয়োগ করার কাজটি একটি সিকিওর পার্টিশন ম্যানেজার কোর (SPMC) দ্বারা করা উচিত, যেমন Hafnium, যা সিকিওর ওয়ার্ল্ডের জন্য স্টেজ ২ পেজ টেবিল বজায় রাখে। S-EL2 না থাকা সিস্টেমে, TEE তার স্টেজ ১ পেজ টেবিলের মাধ্যমে মেমরি অ্যাক্সেস মডেল এনফোর্স করতে পারে।
EL2-তে SMC কল PSCI কল বা FF-A নির্ধারিত মেসেজ না হলে, হ্যান্ডেল না করা SMC-কে EL3-তে ফরওয়ার্ড করা হয়। এটি ধরে নেওয়া হয় যে (অবশ্যই বিশ্বস্ত) সুরক্ষিত ফার্মওয়্যার হ্যান্ডেল না করা SMC নিরাপদে হ্যান্ডেল করতে পারে কারণ ফার্মওয়্যার pVM আইসোলেশন বজায় রাখার জন্য প্রয়োজনীয় সতর্কতা বোঝে।
ভার্চুয়াল মেশিন মনিটর
crosvm হল একটি ভার্চুয়াল মেশিন মনিটর (VMM) যা Linux-এর KVM ইন্টারফেসের মাধ্যমে ভার্চুয়াল মেশিন চালায়। crosvm-কে অনন্য করে তোলে এর ফোকাস যা হোস্ট কার্নেলকে সুরক্ষিত রাখতে Rust প্রোগ্রামিং ভাষা ও ভার্চুয়াল ডিভাইসের চারপাশে স্যান্ডবক্স ব্যবহার করে নিরাপত্তা নিশ্চিত করে। crosvm সম্পর্কে আরও জানতে, এর অফিসিয়াল ডকুমেন্টেশন এখানে দেখুন।
ফাইল ডেসক্রিপ্টর ও ioctl
KVM, ioctl-এর মাধ্যমে ব্যবহারকারীর স্পেসে /dev/kvm ক্যারেক্টার ডিভাইস এক্সপোজ করে যা KVM API তৈরি করে।
ioctls নিম্নলিখিত বিভাগের অন্তর্গত:
- সিস্টেম ioctls কোয়েরি করে এবং গ্লোবাল অ্যাট্রিবিউট সেট করে যা সম্পূর্ণ KVM সাবসিস্টেমকে প্রভাবিত করে এবং pVM তৈরি করে।
- VM ioctls কোয়েরি ও অ্যাট্রিবিউট সেট করে যা ভার্চুয়াল সিপিইউ (vCPUs) ও ডিভাইস তৈরি করে এবং মেমরি লেআউট ও ভার্চুয়াল সিপিইউ (vCPUs) ও ডিভাইসের সংখ্যার মতো সম্পূর্ণ pVM-কে প্রভাবিত করে।
- vCPU ioctls কোয়েরি ও অ্যাট্রিবিউট সেট করে যা একটি ভার্চুয়াল CPU-এর অপারেশন কন্ট্রোল করে।
- ডিভাইস ioctls কোয়েরি ও অ্যাট্রিবিউট সেট করে যা একটি ভার্চুয়াল ডিভাইসের অপারেশন কন্ট্রোল করে।
প্রতিটি crosvm প্রসেস ভার্চুয়াল মেশিনের ঠিক একটি ইনস্ট্যান্স রান করে। এই প্রসেস
VM ফাইল ডেসক্রিপ্টর তৈরি করতে KVM_CREATE_VM সিস্টেম ioctl ব্যবহার করে যা
pVM ioctl ইস্যু করতে ব্যবহার করা যেতে পারে। VM FD-তে KVM_CREATE_VCPU বা KVM_CREATE_DEVICE ioctl
একটি vCPU/ডিভাইস তৈরি করে এবং নতুন রিসোর্সের
দিকে পয়েন্ট করে এমন একটি ফাইল ডেসক্রিপ্টর রিটার্ন করে। vCPU বা ডিভাইস FD-তে ioctl ব্যবহার করে VM FD-তে ioctl ব্যবহার করে তৈরি করা ডিভাইসকে
কন্ট্রোল করা যেতে পারে। vCPU-এর ক্ষেত্রে, এর মধ্যে গেস্ট কোড চালানোর
গুরুত্বপূর্ণ টাস্ক অন্তর্ভুক্ত।
ইন্টার্নালি, crosvm, VM-এর ফাইল ডেসক্রিপ্টরকে কার্নেলের সাথে
এজ-ট্রিগার করা epoll ইন্টারফেস ব্যবহার করে রেজিস্টার করে। তারপরে, কোনও ফাইল ডেসক্রিপ্টরে
নতুন ইভেন্ট পেন্ডিং থাকলে, কার্নেল crosvm-কে বিজ্ঞপ্তি পাঠায়।
pKVM একটি নতুন ক্ষমতা যোগ করে, KVM_CAP_ARM_PROTECTED_VM, যা pVM এনভায়রনমেন্ট সম্পর্কে তথ্য পেতে এবং VM-এর জন্য সুরক্ষিত মোড সেট-আপ করতে ব্যবহার করা যেতে পারে।
crosvm এটি pVM তৈরির সময় ব্যবহার করে যদি --protected-vm ফ্ল্যাগ পাস করা হয়,
pVM ফার্মওয়্যারের জন্য উপযুক্ত পরিমাণ মেমরি কোয়েরি এবং রিজার্ভ করতে এবং তারপর সুরক্ষিত মোড চালু করতে।
মেমরি অ্যালোকেশন
VM-এর প্রধান দায়িত্বগুলির মধ্যে একটি হল VM-এর মেমরি বরাদ্দ করা এবং এর মেমরি লেআউট ম্যানেজ করা। crosvm নিচে দেওয়া টেবিলে মোটামুটিভাবে বর্ণনা করা একটি নির্দিষ্ট মেমরি লেআউট জেনারেট করে।
| নরমাল মোডে FDT | PHYS_MEMORY_END - 0x200000
|
| ফ্রি স্পেস | ...
|
| Ramdisk | ALIGN_UP(KERNEL_END, 0x1000000)
|
| কার্নেল | 0x80080000
|
| বুটলোডার | 0x80200000
|
| BIOS মোডে FDT | 0x80000000
|
| ফিজিক্যাল মেমরি বেস | 0x80000000
|
| pVM ফার্মওয়্যার | 0x7FE00000
|
| ডিভাইস মেমরি | 0x10000 - 0x40000000
|
mmap-এর সাথে ফিজিক্যাল মেমরি অ্যাসাইন করা হয় এবং VM-কে মেমরি দান করা হয় যাতে
KVM_SET_USER_MEMORY_REGION ioctl-এর মাধ্যমে memslots নামক মেমরি অঞ্চল পূরণ করা যায়। তাই সব গেস্ট pVM মেমরি crosvm ইনস্ট্যান্সের সাথে অ্যাট্রিবিউট করা হয় যা এটি ম্যানেজ করে এবং হোস্টের ফ্রি মেমরি শেষ হয়ে গেলে প্রসেস বন্ধ হয়ে যেতে পারে (VM বন্ধ করে)। VM বন্ধ করা হলে, হাইপারভাইজার অটোমেটিক মেমরি মুছে দেয় এবং
হোস্ট কার্নেলে ফিরিয়ে দেয়।
সাধারণ KVM-এর অধীনে, VMM সব গেস্ট মেমরি অ্যাক্সেস করতে পারে। pKVM-এর সাহায্যে, গেস্টকে দান করা হলে, গেস্ট মেমরি হোস্ট ফিজিক্যাল অ্যাড্রেস স্পেস থেকে আনম্যাপ করা হয়। এর একমাত্র ব্যতিক্রম হল, অতিথির দ্বারা স্পষ্টভাবে শেয়ার করা মেমরি, যেমন virtio ডিভাইসের জন্য।
অতিথির অ্যাড্রেস স্পেসে MMIO অঞ্চলগুলি আনম্যাপড থেকে যায়। অতিথির দ্বারা এইসব অঞ্চল অ্যাক্সেস করা আটকে যায় এবং এর ফলে VM FD-তে I/O ইভেন্ট হয়। ভার্চুয়াল ডিভাইস ইমপ্লিমেন্ট করতে এই পদ্ধতি ব্যবহার করা হয়। সুরক্ষিত মোডে, গেস্টকে অবশ্যই স্বীকার করতে হবে যে তার অ্যাড্রেস স্পেসের একটি অঞ্চল MMIO-এর জন্য হাইপারকল ব্যবহার করে ব্যবহার করা হচ্ছে, যাতে আকস্মিক তথ্য ফাঁসের ঝুঁকি কমানো যায়।
সমস্ত সম্পদ সার্চ
প্রতিটি ভার্চুয়াল CPU-কে POSIX থ্রেড হিসেবে দেখানো হয় এবং হোস্ট
Linux শিডিউলারের মাধ্যমে শিডিউল করা হয়। থ্রেডটি vCPU FD-তে KVM_RUN ioctl কল করে, যার ফলে
হাইপারভাইজর গেস্ট vCPU কনটেক্সটে সুইচ করে। হোস্ট শিডিউলার
গেস্ট কনটেক্সটে ব্যয় করা সময়কে সংশ্লিষ্ট
vCPU থ্রেড দ্বারা ব্যবহৃত সময় হিসেবে বিবেচনা করে। VMM-এর মাধ্যমে ম্যানেজ করতে হবে এমন কোনও ইভেন্ট থাকলে, KVM_RUN রিটার্ন করে, যেমন I/O, ইন্টারাপ্টের শেষ বা vCPU বন্ধ হয়ে যাওয়া। VMM ইভেন্টটি ম্যানেজ করে
এবং KVM_RUN-কে আবার কল করে।
KVM_RUN চলাকালীন, EL2 হাইপারভাইজার কোড ছাড়া, হোস্ট শিডিউলার থ্রেডকে প্রিএম্পট করতে পারে।
EL2 হাইপারভাইজার কোড প্রিএম্পট করা যায় না। গেস্ট
pVM-এর মধ্যে এই আচরণ নিয়ন্ত্রণ করার কোনও মেকানিজম নেই।
কারণ, সব vCPU থ্রেডকে অন্য যেকোনও ইউজারস্পেস টাস্কের মতো শিডিউল করা হয়, তাই সেগুলি সব স্ট্যান্ডার্ড QoS মেকানিজমের অধীনস্থ। বিশেষ করে, প্রতিটি vCPU থ্রেড ফিজিক্যাল CPU-এর সাথে অ্যাফাইন করা, cpuset-এ রাখা, ইউটিলাইজেশন ক্ল্যাম্পিং ব্যবহার করে বুস্ট বা ক্যাপ করা, তাদের অগ্রাধিকার/শিডিউলিং নীতি পরিবর্তন করা এবং আরও অনেক কিছু করা যেতে পারে।
ভার্চুয়াল ডিভাইস
crosvm নিম্নলিখিত সহ একাধিক ডিভাইসে কাজ করে:
- কম্পোজিট ডিস্ক ইমেজের জন্য virtio-blk, শুধু-পঠনযোগ্য বা পঠন-লিখনযোগ্য
- হোস্টের সাথে যোগাযোগের জন্য vhost-vsock
- virtio-pci as virtio transport
- pl030 রিয়েল টাইম ক্লক (RTC)
- সিরিয়াল কমিউনিকেশনের জন্য 16550a UART
pVM ফার্মওয়্যার
pVM ফার্মওয়্যার (pvmfw) হল pVM দ্বারা এক্সিকিউট করা প্রথম কোড, যা কোনও ফিজিক্যাল ডিভাইসের বুট ROM-এর মতো। pvmfw-এর প্রাথমিক লক্ষ্য হল নিরাপদ বুট বুটস্ট্র্যাপ করা এবং pVM-এর অনন্য সিক্রেট বের করা। pvmfw কোনও নির্দিষ্ট OS-এর সাথে ব্যবহারের মধ্যে সীমাবদ্ধ নয়, যেমন Microdroid, যতক্ষণ না OS crosvm দ্বারা সমর্থিত হয় এবং সঠিকভাবে সাইন করা হয়।
pvmfw বাইনারি একই নামের ফ্ল্যাশ পার্টিশনে স্টোর করা হয় এবং OTA ব্যবহার করে আপডেট করা হয়।
ডিভাইস বুট করা
pKVM-চালু থাকা ডিভাইসের বুট পদ্ধতিতে নিম্নলিখিত ধাপের ক্রম যোগ করা হয়:
- Android বুটলোডার (ABL) তার পার্টিশন থেকে মেমরিতে pvmfw লোড করে এবং ছবিটি যাচাই করে।
- ABL তার ডিভাইস আইডেন্টিফায়ার কম্পোজিশন ইঞ্জিন (DICE) সংক্রান্ত গোপনীয় তথ্য (কম্পাউন্ড ডিভাইস আইডেন্টিফায়ার (CDI) এবং DICE সার্টিফিকেট চেন) Root of Trust থেকে পায়।
- ABL, pvmfw-এর জন্য প্রয়োজনীয় CDI তৈরি করে এবং pvmfw বাইনারিতে সেগুলি যোগ করে।
- ABL, DT-তে একটি
linux,pkvm-guest-firmware-memoryরিজার্ভ করা মেমরি রিজিয়ন নোড যোগ করে, যা pvmfw বাইনারির লোকেশন ও সাইজ এবং আগের ধাপে এটি থেকে পাওয়া সিক্রেট বর্ণনা করে। - ABL, Linux-কে কন্ট্রোল দেয় এবং Linux, pKVM শুরু করে।
- pKVM, হোস্টের স্টেজ ২ পেজ টেবিল থেকে pvmfw মেমরি অঞ্চল আনম্যাপ করে এবং ডিভাইস আপটাইম জুড়ে হোস্ট (এবং অতিথি) থেকে এটি রক্ষা করে।
ডিভাইস বুট করার পরে, Microdroid ডকুমেন্টের বুট সিকোয়েন্স বিভাগে উল্লেখ করা ধাপ অনুযায়ী Microdroid বুট করা হয়।
pVM বুট
pVM তৈরি করার সময়, হাইপারভাইজরকে pvmfw ইমেজ দিয়ে পূরণ করার জন্য crosvm (বা অন্য কোনও VMM)-কে যথেষ্ট বড় মেমরি স্লট তৈরি করতে হবে। এছাড়াও, VMM রেজিস্টারের তালিকায় সীমাবদ্ধ থাকে যার প্রাথমিক ভ্যালু এটি সেট করতে পারে (প্রাইমারি vCPU-এর জন্য x0-x14, সেকেন্ডারি vCPU-এর জন্য কিছু নয়)। বাকি রেজিস্টারগুলি রিজার্ভ করা আছে এবং হাইপারভাইজর-pvmfw ABI-এর অংশ।
pVM রান করার সময়, হাইপারভাইজার প্রথমে pvmfw-কে প্রাথমিক vCPU-এর কন্ট্রোল
হস্তান্তর করে। ফার্মওয়্যার আশা করে যে crosvm একটি AVB-স্বাক্ষরিত কার্নেল লোড করেছে,
যা একটি বুটলোডার বা অন্য কোনও ছবি হতে পারে এবং পরিচিত অফসেটে মেমরিতে একটি স্বাক্ষরবিহীন FDT হতে পারে। pvmfw AVB স্বাক্ষর যাচাই করে এবং সফল হলে,
প্রাপ্ত FDT থেকে একটি বিশ্বস্ত ডিভাইস ট্রি তৈরি করে, মেমরি থেকে এর গোপনীয়তা মুছে দেয় এবং পেলোডের এন্ট্রি পয়েন্টে ব্রাঞ্চ করে। যাচাইকরণের
ধাপগুলির মধ্যে একটি সম্পূর্ণ না হলে, ফার্মওয়্যার একটি PSCI SYSTEM_RESET হাইপারকল ইস্যু করে।
বুট করার প্রসেস চলাকালীন, pVM ইনস্ট্যান্স সম্পর্কিত তথ্য একটি পার্টিশনে (virtio-blk ডিভাইস) স্টোর করা হয় এবং pvmfw-এর সিক্রেট দিয়ে এনক্রিপ্ট করা হয় যাতে, রিবুট করার পরে, সিক্রেটটি সঠিক ইনস্ট্যান্সে প্রোভিশন করা হয়।