AVF আর্কিটেকচার

অ্যান্ড্রয়েড ভার্চুয়ালাইজেশন ফ্রেমওয়ার্ক বাস্তবায়নের জন্য প্রয়োজনীয় সমস্ত উপাদানের একটি রেফারেন্স বাস্তবায়ন অ্যান্ড্রয়েড প্রদান করে। বর্তমানে এই বাস্তবায়ন ARM64-এর মধ্যে সীমাবদ্ধ। এই পৃষ্ঠাটি ফ্রেমওয়ার্ক আর্কিটেকচার ব্যাখ্যা করে।

পটভূমি

আর্ম আর্কিটেকচার চারটি ব্যতিক্রম স্তর পর্যন্ত ব্যবহার করতে পারে, ব্যতিক্রম স্তর 0 (EL0) সবচেয়ে কম সুবিধাপ্রাপ্ত এবং ব্যতিক্রম স্তর 3 (EL3) সবচেয়ে বেশি। অ্যান্ড্রয়েড কোডবেসের (সমস্ত ইউজারস্পেস উপাদান) বৃহত্তম অংশ EL0 এ চলে। বাকি যাকে সাধারণত "অ্যান্ড্রয়েড" বলা হয় তা হল লিনাক্স কার্নেল, যা EL1 এ চলে।

EL2 স্তরটি একটি হাইপারভাইজার প্রবর্তনের অনুমতি দেয় যা EL1/EL0 এ পৃথক pVM-তে মেমরি এবং ডিভাইসগুলিকে বিচ্ছিন্ন করতে সক্ষম করে, দৃঢ় গোপনীয়তা এবং অখণ্ডতার গ্যারান্টি সহ।

হাইপারভাইজার

সুরক্ষিত কার্নেল-ভিত্তিক ভার্চুয়াল মেশিন (pKVM) Linux KVM হাইপারভাইজারের উপর ভিত্তি করে তৈরি, যা তৈরির সময় 'সুরক্ষিত' চিহ্নিত গেস্ট ভার্চুয়াল মেশিনগুলিতে চলমান পেলোডগুলিতে অ্যাক্সেস সীমাবদ্ধ করার ক্ষমতা সহ বর্ধিত করা হয়েছে।

KVM/arm64 নির্দিষ্ট CPU বৈশিষ্ট্যের প্রাপ্যতার উপর নির্ভর করে বিভিন্ন এক্সিকিউশন মোড সমর্থন করে, যেমন ভার্চুয়ালাইজেশন হোস্ট এক্সটেনশন (VHE) (ARMv8.1 এবং পরবর্তী)। এই মোডগুলির মধ্যে একটিতে, যা সাধারণত নন-VHE মোড নামে পরিচিত, হাইপারভাইজার কোড বুট করার সময় কার্নেল ইমেজ থেকে আলাদা করা হয় এবং EL2 এ ইনস্টল করা হয়, যেখানে কার্নেল নিজেই EL1 এ চলে। যদিও লিনাক্স কোডবেসের অংশ, KVM এর EL2 উপাদানটি একাধিক EL1 এর মধ্যে স্যুইচ করার দায়িত্বে থাকা একটি ছোট উপাদান। হাইপারভাইজার উপাদানটি লিনাক্সের সাথে সংকলিত, তবে vmlinux চিত্রের একটি পৃথক, ডেডিকেটেড মেমোরি বিভাগে থাকে। pKVM হাইপারভাইজার কোডকে নতুন বৈশিষ্ট্য সহ প্রসারিত করে এই নকশাটি ব্যবহার করে যা এটিকে অ্যান্ড্রয়েড হোস্ট কার্নেল এবং ব্যবহারকারীর স্থানের উপর বিধিনিষেধ আরোপ করার অনুমতি দেয় এবং অতিথি মেমোরি এবং হাইপারভাইজারে হোস্ট অ্যাক্সেস সীমিত করে।

pKVM বিক্রেতা মডিউল

একটি pKVM ভেন্ডর মডিউল হল একটি হার্ডওয়্যার-নির্দিষ্ট মডিউল যা ডিভাইস-নির্দিষ্ট কার্যকারিতা ধারণ করে, যেমন ইনপুট-আউটপুট মেমরি ম্যানেজমেন্ট ইউনিট (IOMMU) ড্রাইভার। এই মডিউলগুলি আপনাকে pKVM-এ ব্যতিক্রম স্তর 2 (EL2) অ্যাক্সেসের জন্য প্রয়োজনীয় সুরক্ষা বৈশিষ্ট্যগুলি পোর্ট করতে দেয়।

একটি pKVM বিক্রেতা মডিউল কীভাবে বাস্তবায়ন এবং লোড করতে হয় তা জানতে, একটি pKVM বিক্রেতা মডিউল বাস্তবায়ন দেখুন।

বুট পদ্ধতি

নিম্নলিখিত চিত্রটি pKVM বুট পদ্ধতিটি চিত্রিত করে:

pKVM বুট পদ্ধতি

চিত্র ১. pKVM বুট পদ্ধতি

  1. ইনিশিয়ালাইজেশন: বুটলোডার EL2-তে জেনেরিক কার্নেলে প্রবেশ করে। EL2 এবং EL1 উভয় ক্ষেত্রেই বিশ্বস্ত কার্নেল কোড তারপর pKVM এবং এর মডিউলগুলি ইনিশিয়ালাইজ করে। এই পর্যায়ে, EL2 EL1-কে বিশ্বস্ত করে, তাই কোনও অবিশ্বস্ত কোড কার্যকর করা হয় না।
  2. Deprivilege Kernel: জেনেরিক কার্নেল সনাক্ত করে যে এটি EL2 এ চলছে এবং নিজেকে EL1 এ ডিপ্রিভিলেজ করে। pKVM এবং এর মডিউলগুলি EL2 এ চলতে থাকে।
  3. রানটাইম : জেনেরিক কার্নেল স্বাভাবিকভাবে বুট হতে থাকে, ব্যবহারকারীর স্থান না পৌঁছানো পর্যন্ত সমস্ত প্রয়োজনীয় ডিভাইস ড্রাইভার লোড করে। এই মুহুর্তে, pKVM স্থানে থাকে এবং স্টেজ-২ পৃষ্ঠার টেবিলগুলি পরিচালনা করে।

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

অ্যান্ড্রয়েড কার্নেল এবং হাইপারভাইজার একই বাইনারি ইমেজে থাকার ফলে তাদের মধ্যে খুব শক্তভাবে সংযুক্ত যোগাযোগ ইন্টারফেস তৈরি হয়। এই টাইট কাপলিং দুটি উপাদানের পারমাণবিক আপডেটের নিশ্চয়তা দেয়, যা তাদের মধ্যে ইন্টারফেস স্থিতিশীল রাখার প্রয়োজনীয়তা এড়ায় এবং দীর্ঘমেয়াদী রক্ষণাবেক্ষণের সাথে আপস না করে প্রচুর নমনীয়তা প্রদান করে। টাইট কাপলিং যখন হাইপারভাইজার দ্বারা প্রদত্ত সুরক্ষা গ্যারান্টিগুলিকে প্রভাবিত না করে উভয় উপাদানই সহযোগিতা করতে পারে তখন পারফরম্যান্স অপ্টিমাইজেশনেরও অনুমতি দেয়।

তাছাড়া, অ্যান্ড্রয়েড ইকোসিস্টেমে GKI গ্রহণের ফলে pKVM হাইপারভাইজার স্বয়ংক্রিয়ভাবে কার্নেলের মতো একই বাইনারিতে অ্যান্ড্রয়েড ডিভাইসে স্থাপন করা সম্ভব হয়।

CPU মেমরি অ্যাক্সেস সুরক্ষা

আর্ম আর্কিটেকচারে দুটি স্বাধীন পর্যায়ে বিভক্ত একটি মেমোরি ম্যানেজমেন্ট ইউনিট (MMU) নির্দিষ্ট করা হয়েছে, যা উভয়ই মেমোরির বিভিন্ন অংশে ঠিকানা অনুবাদ এবং অ্যাক্সেস নিয়ন্ত্রণ বাস্তবায়নের জন্য ব্যবহার করা যেতে পারে। পর্যায় 1 MMU EL1 দ্বারা নিয়ন্ত্রিত হয় এবং ঠিকানা অনুবাদের প্রথম স্তরের অনুমতি দেয়। পর্যায় 1 MMU লিনাক্স দ্বারা প্রতিটি ব্যবহারকারীর স্থান প্রক্রিয়া এবং তার নিজস্ব ভার্চুয়াল ঠিকানা স্থানকে প্রদত্ত ভার্চুয়াল ঠিকানা স্থান পরিচালনা করার জন্য ব্যবহৃত হয়।

পর্যায় ২ MMU EL2 দ্বারা নিয়ন্ত্রিত হয় এবং পর্যায় ১ MMU এর আউটপুট ঠিকানায় দ্বিতীয় ঠিকানা অনুবাদের প্রয়োগ সক্ষম করে, যার ফলে একটি ভৌত ​​ঠিকানা (PA) তৈরি হয়। পর্যায় ২ অনুবাদটি হাইপারভাইজার দ্বারা সমস্ত অতিথি VM থেকে মেমরি অ্যাক্সেস নিয়ন্ত্রণ এবং অনুবাদ করতে ব্যবহার করা যেতে পারে। চিত্র ২-এ দেখানো হয়েছে, যখন অনুবাদের উভয় স্তর সক্রিয় থাকে, তখন পর্যায় ১ এর আউটপুট ঠিকানাকে একটি মধ্যবর্তী ভৌত ঠিকানা (IPA) বলা হয়। দ্রষ্টব্য: ভার্চুয়াল ঠিকানা (VA) একটি IPA এবং তারপর একটি PA-তে অনুবাদ করা হয়।

CPU মেমরি অ্যাক্সেস সুরক্ষা

চিত্র ২। সিপিইউ মেমরি অ্যাক্সেস সুরক্ষা

ঐতিহাসিকভাবে, KVM গেস্ট চালানোর সময় স্টেজ 2 ট্রান্সলেশন সক্ষম করে এবং হোস্ট লিনাক্স কার্নেল চালানোর সময় স্টেজ 2 অক্ষম করে চলে। এই আর্কিটেকচার হোস্ট স্টেজ 1 MMU থেকে মেমরি অ্যাক্সেসগুলিকে স্টেজ 2 MMU এর মধ্য দিয়ে যেতে দেয়, যার ফলে হোস্ট থেকে গেস্ট মেমরি পৃষ্ঠাগুলিতে অবাধ অ্যাক্সেসের অনুমতি দেয়। অন্যদিকে, pKVM হোস্ট প্রসঙ্গেও স্টেজ 2 সুরক্ষা সক্ষম করে এবং হোস্টের পরিবর্তে গেস্ট মেমরি পৃষ্ঠাগুলিকে সুরক্ষিত করার দায়িত্বে হাইপারভাইজারকে রাখে।

KVM গেস্ট সিস্টেমের জন্য জটিল IPA/PA ম্যাপিং বাস্তবায়নের জন্য স্টেজ 2-এ অ্যাড্রেস ট্রান্সলেশনের পূর্ণ ব্যবহার করে, যা ভৌত ফ্র্যাগমেন্টেশন সত্ত্বেও গেস্ট সিস্টেমের জন্য কনটিগুয়াস মেমোরির বিভ্রম তৈরি করে। তবে, হোস্ট সিস্টেমের জন্য স্টেজ 2 MMU-এর ব্যবহার শুধুমাত্র অ্যাক্সেস কন্ট্রোলের মধ্যেই সীমাবদ্ধ। হোস্ট সিস্টেমের স্টেজ 2 আইডেন্টিটি-ম্যাপ করা হয়েছে, যা নিশ্চিত করে যে হোস্ট সিস্টেমের কনটিগুয়াস মেমোরি PA স্পেসে কনটিগুয়াস থাকে। এই আর্কিটেকচার পেজ টেবিলে বৃহৎ ম্যাপিং ব্যবহারের অনুমতি দেয় এবং ফলস্বরূপ ট্রান্সলেশন লুকাসাইড বাফার (TLB) এর উপর চাপ কমায়। যেহেতু একটি আইডেন্টিটি ম্যাপিং PA দ্বারা সূচীবদ্ধ করা যেতে পারে, তাই হোস্ট সিস্টেমের স্টেজ 2 সরাসরি পেজ টেবিলে পৃষ্ঠার মালিকানা ট্র্যাক করতেও ব্যবহার করা হয়।

ডাইরেক্ট মেমোরি অ্যাক্সেস (DMA) সুরক্ষা

পূর্বে বর্ণিত হিসাবে, CPU পৃষ্ঠা টেবিলে Linux হোস্ট থেকে অতিথি পৃষ্ঠাগুলি আনম্যাপ করা অতিথি মেমরি রক্ষা করার জন্য একটি প্রয়োজনীয় কিন্তু অপর্যাপ্ত পদক্ষেপ। pKVM-কে হোস্ট কার্নেলের নিয়ন্ত্রণে থাকা DMA-সক্ষম ডিভাইসগুলির দ্বারা তৈরি মেমরি অ্যাক্সেস এবং একটি ক্ষতিকারক হোস্ট দ্বারা শুরু হওয়া DMA আক্রমণের সম্ভাবনা থেকেও রক্ষা করতে হবে। এই জাতীয় ডিভাইসকে অতিথি মেমরি অ্যাক্সেস করা থেকে বিরত রাখতে, pKVM-এর সিস্টেমের প্রতিটি DMA-সক্ষম ডিভাইসের জন্য ইনপুট-আউটপুট মেমরি ম্যানেজমেন্ট ইউনিট (IOMMU) হার্ডওয়্যার প্রয়োজন, যেমন চিত্র 3-এ দেখানো হয়েছে।

ডিএমএ মেমরি অ্যাক্সেস সুরক্ষা

চিত্র ৩. ডিএমএ মেমরি অ্যাক্সেস সুরক্ষা

কমপক্ষে, IOMMU হার্ডওয়্যার পৃষ্ঠা গ্র্যানুলারিটিতে একটি ডিভাইসের জন্য ফিজিক্যাল মেমোরিতে পঠন/লেখার অ্যাক্সেস প্রদান এবং প্রত্যাহার করার উপায় প্রদান করে। যাইহোক, এই IOMMU হার্ডওয়্যার pVM-এ ডিভাইসের ব্যবহার সীমিত করে কারণ তারা একটি পরিচয়-ম্যাপযুক্ত পর্যায় 2 ধরে নেয়।

ভার্চুয়াল মেশিনগুলির মধ্যে বিচ্ছিন্নতা নিশ্চিত করার জন্য, বিভিন্ন সত্তার পক্ষ থেকে তৈরি মেমরি লেনদেনগুলি IOMMU দ্বারা পৃথকযোগ্য হতে হবে যাতে অনুবাদের জন্য উপযুক্ত পৃষ্ঠা টেবিলের সেট ব্যবহার করা যেতে পারে।

এছাড়াও, EL2-তে SoC-নির্দিষ্ট কোডের পরিমাণ হ্রাস করা pKVM-এর সামগ্রিক বিশ্বস্ত কম্পিউটিং বেস (TCB) হ্রাস করার একটি মূল কৌশল এবং হাইপারভাইজারে IOMMU ড্রাইভার অন্তর্ভুক্তির বিপরীতে কাজ করে। এই সমস্যাটি কমাতে, EL1-এর হোস্ট সহায়ক IOMMU পরিচালনার কাজগুলির জন্য দায়ী, যেমন পাওয়ার ম্যানেজমেন্ট, ইনিশিয়ালাইজেশন এবং, যেখানে উপযুক্ত, হ্যান্ডলিং ব্যাহত করা।

তবে, ডিভাইসের অবস্থা হোস্টকে নিয়ন্ত্রণে রাখার ফলে IOMMU হার্ডওয়্যারের প্রোগ্রামিং ইন্টারফেসে অতিরিক্ত প্রয়োজনীয়তা আরোপ করা হয় যাতে অনুমতি পরীক্ষাগুলি অন্য কোনও উপায়ে, উদাহরণস্বরূপ, ডিভাইস রিসেট করার পরে, বাইপাস করা না যায়।

আর্ম ডিভাইসের জন্য একটি স্ট্যান্ডার্ড এবং সু-সমর্থিত IOMMU হল আর্ম সিস্টেম মেমোরি ম্যানেজমেন্ট ইউনিট (SMMU) আর্কিটেকচার যা আইসোলেশন এবং ডাইরেক্ট অ্যাসাইনমেন্ট উভয়কেই সম্ভব করে তোলে। এই আর্কিটেকচারটি সুপারিশকৃত রেফারেন্স সমাধান।

মেমোরির মালিকানা

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

হোস্ট এবং অতিথিদের মধ্যে যোগাযোগ নিয়ন্ত্রিত মেমোরি শেয়ারিংয়ের মাধ্যমে সম্ভব হয়। অতিথিরা হাইপারকল ব্যবহার করে তাদের কিছু পৃষ্ঠা হোস্টের সাথে শেয়ার করতে পারেন, যা হাইপারভাইজারকে হোস্ট স্টেজ 2 পেজ টেবিলে সেই পৃষ্ঠাগুলি পুনরায় ম্যাপ করার নির্দেশ দেয়। একইভাবে, ট্রাস্টজোনের সাথে হোস্টের যোগাযোগ মেমোরি শেয়ারিং এবং/অথবা ঋণদান কার্যক্রমের মাধ্যমে সম্ভব হয়, যার সবকটিই ফার্মওয়্যার ফ্রেমওয়ার্ক ফর আর্ম (FF-A) স্পেসিফিকেশন ব্যবহার করে pKVM দ্বারা নিবিড়ভাবে পর্যবেক্ষণ এবং নিয়ন্ত্রিত হয়।

যেহেতু একটি pVM-এর মেমরির প্রয়োজনীয়তা সময়ের সাথে সাথে পরিবর্তিত হতে পারে, তাই একটি হাইপারকল প্রদান করা হয় যা কলারের নির্দিষ্ট পৃষ্ঠাগুলির মালিকানা হোস্টের কাছে ফেরত দেওয়ার অনুমতি দেয়। বাস্তবে এই হাইপারকলটি virtio বেলুন প্রোটোকলের সাথে ব্যবহার করা হয় যাতে VMM pVM থেকে মেমরি ফেরত চাইতে পারে এবং pVM নিয়ন্ত্রিত পদ্ধতিতে VMM-কে পরিত্যক্ত পৃষ্ঠাগুলির বিষয়ে অবহিত করতে পারে।

হাইপারভাইজার সিস্টেমের সমস্ত মেমরি পৃষ্ঠাগুলির মালিকানা ট্র্যাক করার জন্য দায়ী এবং সেগুলি অন্য সত্তাকে ভাগ করা হচ্ছে নাকি ধার দেওয়া হচ্ছে। এই অবস্থা ট্র্যাকিংয়ের বেশিরভাগই হোস্ট এবং অতিথিদের স্টেজ 2 পৃষ্ঠা টেবিলের সাথে সংযুক্ত মেটাডেটা ব্যবহার করে করা হয়, পৃষ্ঠা টেবিল এন্ট্রি (PTEs) তে সংরক্ষিত বিট ব্যবহার করে যা তাদের নাম অনুসারে, সফ্টওয়্যার ব্যবহারের জন্য সংরক্ষিত।

হোস্টকে অবশ্যই নিশ্চিত করতে হবে যে হাইপারভাইজার দ্বারা অ্যাক্সেসযোগ্য করা পৃষ্ঠাগুলি অ্যাক্সেস করার চেষ্টা করা হচ্ছে না। একটি অবৈধ হোস্ট অ্যাক্সেসের ফলে হাইপারভাইজার দ্বারা হোস্টে একটি সিঙ্ক্রোনাস এক্সেপশন ইনজেক্ট করা হয়, যার ফলে হয় দায়ী ইউজারস্পেস টাস্ক একটি SEGV সিগন্যাল পেতে পারে, অথবা হোস্ট কার্নেল ক্র্যাশ হতে পারে। দুর্ঘটনাজনিত অ্যাক্সেস রোধ করার জন্য, অতিথিদের দান করা পৃষ্ঠাগুলিকে হোস্ট কার্নেল দ্বারা সোয়াপিং বা মার্জ করার জন্য অযোগ্য করে দেওয়া হয়।

ইন্টারাপ্ট হ্যান্ডলিং এবং টাইমার

একজন অতিথি ডিভাইসের সাথে এবং CPU গুলির মধ্যে যোগাযোগের জন্য ইন্টারাপ্ট একটি অপরিহার্য অংশ, যেখানে ইন্টারপ্রসেসর ইন্টারাপ্ট (IPI) হল প্রধান যোগাযোগ ব্যবস্থা। KVM মডেলটি হল EL1-এর হোস্টকে সমস্ত ভার্চুয়াল ইন্টারাপ্ট ব্যবস্থাপনা অর্পণ করা, যা সেই উদ্দেশ্যে হাইপারভাইজারের একটি অবিশ্বস্ত অংশ হিসাবে আচরণ করে।

pKVM বিদ্যমান KVM কোডের উপর ভিত্তি করে একটি সম্পূর্ণ জেনেরিক ইন্টারাপ্ট কন্ট্রোলার সংস্করণ 3 (GICv3) ইমুলেশন অফার করে। টাইমার এবং IPI গুলি এই অবিশ্বস্ত ইমুলেশন কোডের অংশ হিসাবে পরিচালিত হয়।

GICv3 সাপোর্ট

EL1 এবং EL2 এর মধ্যে ইন্টারফেসটি নিশ্চিত করবে যে সম্পূর্ণ ইন্টারাপ্ট অবস্থা EL1 হোস্টের কাছে দৃশ্যমান, যার মধ্যে ইন্টারাপ্ট সম্পর্কিত হাইপারভাইজার রেজিস্টারের কপিও রয়েছে। এই দৃশ্যমানতা সাধারণত শেয়ার্ড মেমোরি অঞ্চল ব্যবহার করে সম্পন্ন করা হয়, প্রতি ভার্চুয়াল CPU (vCPU) এর জন্য একটি।

সিস্টেম রেজিস্টার রানটাইম সাপোর্ট কোডটি কেবল সফটওয়্যার জেনারেটেড ইন্টারাপ্ট রেজিস্টার (SGIR) এবং ডিঅ্যাক্টিভেট ইন্টারাপ্ট রেজিস্টার (DIR) রেজিস্টার ট্র্যাপিং সমর্থন করার জন্য সরলীকৃত করা যেতে পারে। আর্কিটেকচারের নির্দেশ অনুসারে এই রেজিস্টারগুলি সর্বদা EL2-তে ট্র্যাপ করা উচিত, অন্য ট্র্যাপগুলি এখনও পর্যন্ত কেবল ত্রুটি-বিচ্যুতি কমাতে কার্যকর হয়েছে। বাকি সবকিছু হার্ডওয়্যারে পরিচালনা করা হচ্ছে।

MMIO-এর দিক থেকে, KVM-এর বর্তমান অবকাঠামো পুনঃব্যবহার করে EL1-এ সবকিছু অনুকরণ করা হয়। অবশেষে, Wait for Interrupt (WFI) সর্বদা EL1-তে রিলে করা হয়, কারণ এটি KVM-এর ব্যবহৃত মৌলিক শিডিউলিং প্রিমিটিভগুলির মধ্যে একটি।

টাইমার সাপোর্ট

প্রতিটি ট্র্যাপিং WFI-তে ভার্চুয়াল টাইমারের তুলনামূলক মান EL1-এর সাথে উন্মুক্ত করতে হবে যাতে EL1 vCPU ব্লক থাকাকালীন টাইমার ইন্টারাপ্ট ইনজেক্ট করতে পারে। ফিজিক্যাল টাইমারটি সম্পূর্ণরূপে অনুকরণ করা হয় এবং সমস্ত ট্র্যাপ EL1-এর সাথে রিলে করা হয়।

MMIO হ্যান্ডলিং

ভার্চুয়াল মেশিন মনিটরের (VMM) সাথে যোগাযোগ করতে এবং GIC এমুলেশন সম্পাদন করতে, আরও ট্রাইএজিংয়ের জন্য MMIO ট্র্যাপগুলিকে EL1-এর হোস্টে ফিরিয়ে আনতে হবে। pKVM-এর নিম্নলিখিতগুলি প্রয়োজন:

  • IPA এবং অ্যাক্সেসের আকার
  • লেখার ক্ষেত্রে তথ্য
  • আটকে যাওয়ার সময় CPU-এর এন্ডিয়াননেস

অতিরিক্তভাবে, উৎস/গন্তব্য হিসেবে একটি সাধারণ উদ্দেশ্য নিবন্ধন (GPR) সহ ফাঁদগুলি একটি বিমূর্ত স্থানান্তর ছদ্ম-নিবন্ধক ব্যবহার করে রিলে করা হয়।

অতিথি ইন্টারফেস

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

জেনেরিক হাইপারকল

  • PSCI গেস্ট সিস্টেমের জন্য তার vCPU গুলির জীবনচক্র নিয়ন্ত্রণের জন্য একটি স্ট্যান্ডার্ড প্রক্রিয়া প্রদান করে, যার মধ্যে রয়েছে অনলাইনিং, অফলাইনিং এবং সিস্টেম শাটডাউন।
  • TRNG অতিথিদের pKVM থেকে এনট্রপি অনুরোধ করার জন্য একটি স্ট্যান্ডার্ড প্রক্রিয়া প্রদান করে যা কলটি EL3 তে রিলে করে। এই প্রক্রিয়াটি বিশেষভাবে কার্যকর যেখানে হোস্টকে হার্ডওয়্যার র‍্যান্ডম নম্বর জেনারেটর (RNG) ভার্চুয়ালাইজ করার জন্য বিশ্বাস করা যায় না।

pKVM হাইপারকল

  • হোস্টের সাথে মেমোরি শেয়ারিং। প্রাথমিকভাবে হোস্টের কাছে সমস্ত অতিথি মেমোরি অ্যাক্সেসযোগ্য নয়, তবে শেয়ার্ড-মেমোরি যোগাযোগের জন্য এবং শেয়ার্ড বাফারের উপর নির্ভরশীল প্যারাভার্চুয়ালাইজড ডিভাইসগুলির জন্য হোস্ট অ্যাক্সেস প্রয়োজন। হোস্টের সাথে পৃষ্ঠাগুলি শেয়ার এবং আনশেয়ার করার জন্য হাইপারকলগুলি অতিথিকে হ্যান্ডশেকের প্রয়োজন ছাড়াই বাকি অ্যান্ড্রয়েডে মেমোরির কোন অংশগুলি অ্যাক্সেসযোগ্য করা হবে তা ঠিক করতে দেয়।
  • হোস্টের কাছে মেমোরি রিলিজমেন্ট। সমস্ত গেস্ট মেমোরি সাধারণত গেস্টের কাছে থাকে যতক্ষণ না এটি ধ্বংস হয়ে যায়। এই অবস্থা দীর্ঘস্থায়ী ভিএম-এর জন্য অপর্যাপ্ত হতে পারে যার মেমোরির প্রয়োজনীয়তা সময়ের সাথে সাথে পরিবর্তিত হয়। relinquish হাইপারকল একজন গেস্টকে গেস্ট টার্মিনেশনের প্রয়োজন ছাড়াই পৃষ্ঠাগুলির মালিকানা স্পষ্টভাবে হোস্টের কাছে ফেরত পাঠাতে দেয়।
  • হোস্টে মেমোরি অ্যাক্সেস ট্র্যাপিং। ঐতিহ্যগতভাবে, যদি কোনও KVM গেস্ট এমন কোনও ঠিকানা অ্যাক্সেস করে যা একটি বৈধ মেমোরি অঞ্চলের সাথে সঙ্গতিপূর্ণ নয়, তাহলে vCPU থ্রেড হোস্টে প্রস্থান করে এবং অ্যাক্সেসটি সাধারণত MMIO-এর জন্য ব্যবহৃত হয় এবং ব্যবহারকারীর স্থানে VMM দ্বারা অনুকরণ করা হয়। এই হ্যান্ডলিংটি সহজতর করার জন্য, pKVM-কে ফল্টিং নির্দেশ সম্পর্কে বিশদ বিবরণ যেমন এর ঠিকানা, রেজিস্টার প্যারামিটার এবং সম্ভাব্যভাবে তাদের বিষয়বস্তু হোস্টে ফেরত পাঠানোর প্রয়োজন হয়, যা ট্র্যাপটি প্রত্যাশিত না হলে অনিচ্ছাকৃতভাবে একটি সুরক্ষিত অতিথির সংবেদনশীল ডেটা প্রকাশ করতে পারে। pKVM এই ত্রুটিগুলিকে মারাত্মক হিসাবে বিবেচনা করে এই সমস্যার সমাধান করে যদি না অতিথি পূর্বে ফল্টিং IPA পরিসর সনাক্ত করার জন্য একটি হাইপারকল জারি করে যার জন্য অ্যাক্সেসগুলি হোস্টে ফেরত ট্র্যাপ করার অনুমতি পায়। এই সমাধানটিকে MMIO গার্ড হিসাবে উল্লেখ করা হয়।

ভার্চুয়াল I/O ডিভাইস (virtio)

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

Virtio ডিভাইসগুলি সাধারণত হোস্টের ব্যবহারকারীর স্থানে VMM দ্বারা প্রয়োগ করা হয়, যা গেস্ট থেকে virtio ডিভাইসের MMIO ইন্টারফেসে আটকে থাকা মেমরি অ্যাক্সেসগুলিকে আটকে রাখে এবং প্রত্যাশিত আচরণ অনুকরণ করে। MMIO অ্যাক্সেস তুলনামূলকভাবে ব্যয়বহুল কারণ ডিভাইসে প্রতিটি অ্যাক্সেসের জন্য VMM এবং পিছনে একটি রাউন্ড-ট্রিপ প্রয়োজন, তাই ডিভাইস এবং গেস্টের মধ্যে বেশিরভাগ প্রকৃত ডেটা স্থানান্তর মেমরিতে থাকা virtqueues এর একটি সেট ব্যবহার করে ঘটে। virtio এর একটি মূল ধারণা হল যে হোস্ট ইচ্ছামত অতিথি মেমরি অ্যাক্সেস করতে পারে। এই ধারণাটি virtqueue এর নকশায় স্পষ্ট, যার মধ্যে অতিথির বাফারগুলির দিকে নির্দেশক থাকতে পারে যা ডিভাইস এমুলেশন সরাসরি অ্যাক্সেস করার উদ্দেশ্যে তৈরি।

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

ভার্চুয়াল ডিভাইস

চিত্র ৪. ভার্টিও ডিভাইস

TrustZone এর সাথে মিথস্ক্রিয়া

যদিও অতিথিরা TrustZone-এর সাথে সরাসরি যোগাযোগ করতে সক্ষম নন, তবুও হোস্টকে নিরাপদ জগতে SMC কল ইস্যু করতে সক্ষম হতে হবে। এই কলগুলি শারীরিকভাবে সম্বোধিত মেমরি বাফারগুলিকে নির্দিষ্ট করতে পারে যা হোস্টের কাছে অ্যাক্সেসযোগ্য নয়। যেহেতু সুরক্ষিত সফ্টওয়্যার সাধারণত বাফারের অ্যাক্সেসযোগ্যতা সম্পর্কে অবগত থাকে না, তাই একটি ক্ষতিকারক হোস্ট এই বাফারটি ব্যবহার করে একটি বিভ্রান্তিকর ডেপুটি আক্রমণ (DMA আক্রমণের অনুরূপ) সম্পাদন করতে পারে। এই ধরনের আক্রমণ প্রতিরোধ করার জন্য, pKVM সমস্ত হোস্ট SMC কলগুলিকে EL2-তে আটকে রাখে এবং EL3-তে হোস্ট এবং সুরক্ষিত মনিটরের মধ্যে একটি প্রক্সি হিসাবে কাজ করে।

হোস্ট থেকে আসা PSCI কলগুলি ন্যূনতম পরিবর্তন সহ EL3 ফার্মওয়্যারে ফরোয়ার্ড করা হয়। বিশেষ করে, CPU অনলাইনে আসার বা সাসপেন্ড থেকে পুনরায় শুরু করার জন্য এন্ট্রি পয়েন্টটি পুনরায় লেখা হয় যাতে স্টেজ 2 পৃষ্ঠার টেবিলটি EL2 এ ইনস্টল করা হয় এবং EL1 এ হোস্টে ফিরে আসে। বুট করার সময়, এই সুরক্ষা pKVM দ্বারা প্রয়োগ করা হয়।

এই আর্কিটেকচারটি PSCI সমর্থনকারী SoC-এর উপর নির্ভর করে, বিশেষ করে TF-A- এর একটি হালনাগাদ সংস্করণকে এর EL3 ফার্মওয়্যার হিসেবে ব্যবহারের মাধ্যমে।

ফার্মওয়্যার ফ্রেমওয়ার্ক ফর আর্ম (FF-A) স্বাভাবিক এবং সুরক্ষিত জগতের মধ্যে মিথস্ক্রিয়াকে মানসম্মত করে, বিশেষ করে একটি সুরক্ষিত হাইপারভাইজারের উপস্থিতিতে। স্পেসিফিকেশনের একটি বড় অংশ সুরক্ষিত জগতের সাথে মেমরি ভাগ করে নেওয়ার জন্য একটি প্রক্রিয়া সংজ্ঞায়িত করে, যা অন্তর্নিহিত পৃষ্ঠাগুলির জন্য একটি সাধারণ বার্তা বিন্যাস এবং একটি সু-সংজ্ঞায়িত অনুমতি মডেল উভয়ই ব্যবহার করে। pKVM FF-A বার্তাগুলিকে প্রক্সি করে যাতে নিশ্চিত করা যায় যে হোস্ট সেই সুরক্ষিত-পক্ষের সাথে মেমরি ভাগ করার চেষ্টা করছে না যার জন্য তার পর্যাপ্ত অনুমতি নেই।

এই স্থাপত্যটি মেমোরি অ্যাক্সেস মডেল প্রয়োগকারী সিকিউর ওয়ার্ল্ড সফ্টওয়্যারের উপর নির্ভর করে, যাতে নিশ্চিত করা যায় যে বিশ্বস্ত অ্যাপ এবং সিকিউর ওয়ার্ল্ডে চলমান অন্য যেকোনো সফ্টওয়্যার মেমোরি অ্যাক্সেস করতে পারে শুধুমাত্র যদি এটি একচেটিয়াভাবে সিকিউর ওয়ার্ল্ডের মালিকানাধীন হয় অথবা FF-A ব্যবহার করে স্পষ্টভাবে এর সাথে ভাগ করা হয়। S-EL2 সহ একটি সিস্টেমে, মেমোরি অ্যাক্সেস মডেল প্রয়োগ করা একটি সিকিউর পার্টিশন ম্যানেজার কোর (SPMC) দ্বারা করা উচিত, যেমন Hafnium , যা নিরাপদ ওয়ার্ল্ডের জন্য স্টেজ 2 পৃষ্ঠা টেবিল রক্ষণাবেক্ষণ করে। S-EL2 ছাড়া একটি সিস্টেমে, TEE তার স্টেজ 1 পৃষ্ঠা টেবিলের মাধ্যমে একটি মেমোরি অ্যাক্সেস মডেল প্রয়োগ করতে পারে।

যদি EL2-তে SMC কলটি PSCI কল বা FF-A সংজ্ঞায়িত বার্তা না হয়, তাহলে আনহ্যান্ডেলড SMC গুলি EL3-তে ফরোয়ার্ড করা হয়। ধারণা করা হচ্ছে যে (অপরিহার্যভাবে বিশ্বস্ত) সুরক্ষিত ফার্মওয়্যার আনহ্যান্ডেলড SMC গুলি নিরাপদে পরিচালনা করতে পারে কারণ ফার্মওয়্যার pVM আইসোলেশন বজায় রাখার জন্য প্রয়োজনীয় সতর্কতাগুলি বোঝে।

ভার্চুয়াল মেশিন মনিটর

crosvm হল একটি ভার্চুয়াল মেশিন মনিটর (VMM) যা লিনাক্সের KVM ইন্টারফেসের মাধ্যমে ভার্চুয়াল মেশিন চালায়। crosvm কে অনন্য করে তোলে কারণ এটি রাস্ট প্রোগ্রামিং ভাষা ব্যবহার করে সুরক্ষার উপর জোর দেয় এবং হোস্ট কার্নেলকে সুরক্ষিত রাখার জন্য ভার্চুয়াল ডিভাইসের চারপাশে একটি স্যান্ডবক্স তৈরি করে। crosvm সম্পর্কে আরও জানতে, এর অফিসিয়াল ডকুমেন্টেশন এখানে দেখুন।

ফাইল বর্ণনাকারী এবং ioctls

KVM /dev/kvm অক্ষর ডিভাইসটিকে ioctls ব্যবহার করে ইউজারস্পেসে এক্সপোজ করে যা KVM API তৈরি করে। ioctls নিম্নলিখিত বিভাগগুলির অন্তর্গত:

  • সিস্টেম ioctls কোয়েরি করে এবং সমগ্র KVM সাবসিস্টেমকে প্রভাবিত করে এমন গ্লোবাল অ্যাট্রিবিউট সেট করে এবং pVM তৈরি করে।
  • VM ioctls ভার্চুয়াল CPU (vCPU) এবং ডিভাইস তৈরি করে এমন বৈশিষ্ট্যগুলি অনুসন্ধান এবং সেট করে এবং একটি সম্পূর্ণ pVM-কে প্রভাবিত করে, যেমন মেমরি লেআউট এবং ভার্চুয়াল CPU (vCPU) এবং ডিভাইসের সংখ্যা অন্তর্ভুক্ত করা।
  • vCPU ioctls কোয়েরি করে এবং এমন বৈশিষ্ট্য সেট করে যা একটি একক ভার্চুয়াল CPU-এর কার্যকারিতা নিয়ন্ত্রণ করে।
  • ডিভাইস ioctls কোয়েরি করে এবং এমন বৈশিষ্ট্য সেট করে যা একটি একক ভার্চুয়াল ডিভাইসের ক্রিয়াকলাপ নিয়ন্ত্রণ করে।

প্রতিটি crosvm প্রক্রিয়া একটি ভার্চুয়াল মেশিনের ঠিক একটি উদাহরণ চালায়। এই প্রক্রিয়াটি KVM_CREATE_VM সিস্টেম ioctl ব্যবহার করে একটি VM ফাইল বর্ণনাকারী তৈরি করে যা pVM ioctls ইস্যু করতে ব্যবহার করা যেতে পারে। VM FD-তে একটি KVM_CREATE_VCPU বা KVM_CREATE_DEVICE ioctl একটি vCPU/ডিভাইস তৈরি করে এবং নতুন রিসোর্সের দিকে নির্দেশ করে একটি ফাইল বর্ণনাকারী ফেরত দেয়। vCPU বা ডিভাইস FD-তে ioctls VM FD-তে ioctl ব্যবহার করে তৈরি করা ডিভাইসটি নিয়ন্ত্রণ করতে ব্যবহার করা যেতে পারে। vCPU-গুলির জন্য, এর মধ্যে অতিথি কোড চালানোর গুরুত্বপূর্ণ কাজ অন্তর্ভুক্ত।

অভ্যন্তরীণভাবে, crosvm edge-triggered epoll ইন্টারফেস ব্যবহার করে কার্নেলের সাথে VM-এর ফাইল বর্ণনাকারী নিবন্ধন করে। এরপর যখনই কোনও ফাইল বর্ণনাকারীতে নতুন ইভেন্ট মুলতুবি থাকে তখন কার্নেল crosvm-কে অবহিত করে।

pKVM একটি নতুন ক্ষমতা যোগ করেছে, KVM_CAP_ARM_PROTECTED_VM , যা pVM পরিবেশ সম্পর্কে তথ্য পেতে এবং VM-এর জন্য সুরক্ষিত মোড সেট আপ করতে ব্যবহার করা যেতে পারে। --protected-vm ফ্ল্যাগ পাস করা হলে, pVM ফার্মওয়্যারের জন্য উপযুক্ত পরিমাণ মেমরি জিজ্ঞাসা এবং সংরক্ষণ করতে এবং তারপর সুরক্ষিত মোড সক্ষম করতে crosvm pVM তৈরির সময় এটি ব্যবহার করে।

মেমরি বরাদ্দকরণ

একটি VMM-এর প্রধান দায়িত্বগুলির মধ্যে একটি হল VM-এর মেমরি বরাদ্দ করা এবং এর মেমরি লেআউট পরিচালনা করা। crosvm একটি স্থির মেমরি লেআউট তৈরি করে যা নীচের টেবিলে আলগাভাবে বর্ণিত হয়েছে।

স্বাভাবিক মোডে FDT PHYS_MEMORY_END - 0x200000
খালি জায়গা ...
র‍্যামডিস্ক ALIGN_UP(KERNEL_END, 0x1000000)
কার্নেল 0x80080000
বুটলোডার 0x80200000
BIOS মোডে FDT 0x80000000
ভৌত স্মৃতির ভিত্তি 0x80000000
পিভিএম ফার্মওয়্যার 0x7FE00000
ডিভাইস মেমরি 0x10000 - 0x40000000

mmap দিয়ে ভৌত মেমোরি বরাদ্দ করা হয় এবং KVM_SET_USER_MEMORY_REGION ioctl দিয়ে মেমোরি অঞ্চলগুলিকে memslots নামে পূর্ণ করার জন্য VM-কে মেমোরি দান করা হয়। অতএব, সমস্ত গেস্ট pVM মেমোরি crosvm ইনস্ট্যান্সের সাথে সম্পর্কিত যা এটি পরিচালনা করে এবং হোস্টের ফ্রি মেমোরি শেষ হয়ে গেলে প্রক্রিয়াটি বন্ধ হয়ে যেতে পারে (VM বন্ধ করে দেওয়া হয়)। যখন একটি VM বন্ধ করা হয়, তখন হাইপারভাইজার দ্বারা মেমোরিটি স্বয়ংক্রিয়ভাবে মুছে যায় এবং হোস্ট কার্নেলে ফিরে আসে।

নিয়মিত KVM-এর অধীনে, VMM সমস্ত অতিথি মেমরিতে অ্যাক্সেস বজায় রাখে। pKVM-এর মাধ্যমে, অতিথি মেমরিটি অতিথিকে দান করার সময় হোস্ট ফিজিক্যাল অ্যাড্রেস স্পেস থেকে আনম্যাপ করা হয়। একমাত্র ব্যতিক্রম হল অতিথি দ্বারা স্পষ্টভাবে ভাগ করা মেমরি, যেমন virtio ডিভাইসের ক্ষেত্রে।

অতিথির ঠিকানা স্থানের MMIO অঞ্চলগুলি ম্যাপ না করেই রাখা হয়। অতিথির এই অঞ্চলগুলিতে অ্যাক্সেস আটকে যায় এবং VM FD-তে একটি I/O ইভেন্ট তৈরি হয়। এই প্রক্রিয়াটি ভার্চুয়াল ডিভাইসগুলি বাস্তবায়নের জন্য ব্যবহৃত হয়। সুরক্ষিত মোডে, অতিথিকে অবশ্যই স্বীকার করতে হবে যে তার ঠিকানা স্থানের একটি অঞ্চল হাইপারকল ব্যবহার করে MMIO-এর জন্য ব্যবহার করা হচ্ছে, যাতে দুর্ঘটনাজনিত তথ্য ফাঁসের ঝুঁকি কমানো যায়।

সময়সূচী

প্রতিটি ভার্চুয়াল CPU একটি POSIX থ্রেড দ্বারা প্রতিনিধিত্ব করা হয় এবং হোস্ট Linux শিডিউলার দ্বারা নির্ধারিত হয়। থ্রেডটি vCPU FD-তে KVM_RUN ioctl কল করে, যার ফলে হাইপারভাইজারটি গেস্ট vCPU প্রসঙ্গে স্যুইচ করে। হোস্ট শিডিউলারটি গেস্ট প্রসঙ্গে ব্যয় করা সময়কে সংশ্লিষ্ট vCPU থ্রেড দ্বারা ব্যবহৃত সময় হিসাবে হিসাব করে। KVM_RUN তখনই ফিরে আসে যখন VMM দ্বারা পরিচালিত কোনও ইভেন্ট থাকে, যেমন I/O, ইন্টারাপ্টের সমাপ্তি, অথবা vCPU স্থগিত। VMM ইভেন্টটি পরিচালনা করে এবং KVM_RUN আবার কল করে।

KVM_RUN চলাকালীন, থ্রেডটি হোস্ট শিডিউলার দ্বারা প্রি-এমপিটিবল থাকে, EL2 হাইপারভাইজার কোডের এক্সিকিউশন ব্যতীত, যা প্রি-এমপিটিবল নয়। গেস্ট pVM-এর নিজস্ব এই আচরণ নিয়ন্ত্রণ করার কোনও ব্যবস্থা নেই।

যেহেতু সমস্ত vCPU থ্রেড অন্যান্য ইউজারস্পেস টাস্কের মতোই নির্ধারিত, তাই এগুলি সমস্ত স্ট্যান্ডার্ড QoS মেকানিজমের অধীন। বিশেষ করে, প্রতিটি vCPU থ্রেড ফিজিক্যাল CPU-এর সাথে সংযুক্ত করা যেতে পারে, cpusets-এ স্থাপন করা যেতে পারে, ব্যবহার ক্ল্যাম্পিং ব্যবহার করে বুস্ট বা ক্যাপ করা যেতে পারে, তাদের অগ্রাধিকার/সময়সূচী নীতি পরিবর্তন করা যেতে পারে এবং আরও অনেক কিছু করা যেতে পারে।

ভার্চুয়াল ডিভাইস

crosvm বেশ কয়েকটি ডিভাইস সমর্থন করে, যার মধ্যে নিম্নলিখিতগুলি অন্তর্ভুক্ত রয়েছে:

  • কম্পোজিট ডিস্ক ইমেজের জন্য virtio-blk, শুধুমাত্র পঠনযোগ্য বা পঠনযোগ্য
  • হোস্টের সাথে যোগাযোগের জন্য vhost-vsock
  • virtio-pci কে virtio পরিবহন হিসেবে ব্যবহার করা হয়
  • pl030 রিয়েল টাইম ক্লক (RTC)
  • সিরিয়াল যোগাযোগের জন্য 16550a UART

পিভিএম ফার্মওয়্যার

pVM ফার্মওয়্যার (pvmfw) হল একটি pVM দ্বারা সম্পাদিত প্রথম কোড, যা একটি ফিজিক্যাল ডিভাইসের বুট ROM এর অনুরূপ। pvmfw এর প্রাথমিক লক্ষ্য হল নিরাপদ বুট বুটস্ট্র্যাপ করা এবং pVM এর অনন্য গোপনীয়তা অর্জন করা। pvmfw কোনও নির্দিষ্ট OS, যেমন Microdroid এর সাথে ব্যবহারের জন্য সীমাবদ্ধ নয়, যতক্ষণ না OS crosvm দ্বারা সমর্থিত এবং সঠিকভাবে স্বাক্ষরিত হয়।

pvmfw বাইনারিটি একই নামের একটি ফ্ল্যাশ পার্টিশনে সংরক্ষণ করা হয় এবং OTA ব্যবহার করে আপডেট করা হয়।

ডিভাইস বুট

একটি pKVM-সক্ষম ডিভাইসের বুট পদ্ধতিতে নিম্নলিখিত ধাপগুলির ক্রম যোগ করা হয়েছে:

  1. অ্যান্ড্রয়েড বুটলোডার (ABL) তার পার্টিশন থেকে pvmfw মেমরিতে লোড করে এবং ছবিটি যাচাই করে।
  2. ABL তার ডিভাইস আইডেন্টিফায়ার কম্পোজিশন ইঞ্জিন (DICE) গোপন তথ্য (কম্পাউন্ড ডিভাইস আইডেন্টিফায়ার (CDI) এবং DICE সার্টিফিকেট চেইন) একটি রুট অফ ট্রাস্ট থেকে সংগ্রহ করে।
  3. ABL pvmfw-এর জন্য প্রয়োজনীয় CDI গুলি সংগ্রহ করে এবং pvmfw বাইনারিতে যুক্ত করে।
  4. ABL DT-তে একটি linux,pkvm-guest-firmware-memory সংরক্ষিত মেমোরি রিজিওন নোড যোগ করে, যা pvmfw বাইনারিটির অবস্থান এবং আকার এবং পূর্ববর্তী ধাপে প্রাপ্ত গোপন তথ্য বর্ণনা করে।
  5. ABL নিয়ন্ত্রণ লিনাক্সের কাছে হস্তান্তর করে এবং লিনাক্স pKVM চালু করে।
  6. pKVM হোস্টের স্টেজ ২ পৃষ্ঠার টেবিল থেকে pvmfw মেমরি অঞ্চলকে আনম্যাপ করে এবং ডিভাইস আপটাইম জুড়ে হোস্ট (এবং অতিথিদের) থেকে এটিকে রক্ষা করে।

ডিভাইস বুট করার পরে, মাইক্রোড্রয়েড ডকুমেন্টের বুট সিকোয়েন্স বিভাগের ধাপগুলি অনুসারে মাইক্রোড্রয়েড বুট করা হয়।

পিভিএম বুট

একটি pVM তৈরি করার সময়, crosvm (অথবা অন্য VMM) কে হাইপারভাইজার দ্বারা pvmfw ইমেজ দিয়ে পূর্ণ করার জন্য যথেষ্ট বড় একটি memslot তৈরি করতে হবে। VMM সেইসব রেজিস্টারের তালিকায়ও সীমাবদ্ধ যার প্রাথমিক মান এটি সেট করতে পারে (প্রাথমিক vCPU-এর জন্য x0-x14, সেকেন্ডারি vCPU-এর জন্য কোনটিই নয়)। বাকি রেজিস্টারগুলি সংরক্ষিত এবং হাইপারভাইজার-pvmfw ABI-এর অংশ।

যখন pVM চালানো হয়, তখন হাইপারভাইজার প্রথমে প্রাথমিক vCPU-এর নিয়ন্ত্রণ pvmfw-এর কাছে হস্তান্তর করে। ফার্মওয়্যারটি আশা করে যে crosvm একটি AVB-স্বাক্ষরিত কার্নেল লোড করেছে, যা একটি বুটলোডার বা অন্য কোনও চিত্র হতে পারে, এবং পরিচিত অফসেটে মেমোরিতে একটি স্বাক্ষরবিহীন FDT লোড করেছে। pvmfw AVB স্বাক্ষর যাচাই করে এবং সফল হলে, প্রাপ্ত FDT থেকে একটি বিশ্বস্ত ডিভাইস ট্রি তৈরি করে, মেমোরি থেকে এর গোপনীয়তা মুছে ফেলে এবং পেলোডের প্রবেশ বিন্দুতে শাখা তৈরি করে। যদি যাচাইকরণের কোনও একটি পদক্ষেপ ব্যর্থ হয়, তাহলে ফার্মওয়্যার একটি PSCI SYSTEM_RESET হাইপারকল ইস্যু করে।

বুট করার সময়, pVM ইনস্ট্যান্স সম্পর্কে তথ্য একটি পার্টিশনে (virtio-blk ডিভাইস) সংরক্ষণ করা হয় এবং pvmfw এর গোপনীয়তা দিয়ে এনক্রিপ্ট করা হয় যাতে নিশ্চিত করা যায় যে, রিবুট করার পরে, গোপনীয়তাটি সঠিক ইনস্ট্যান্সে সরবরাহ করা হচ্ছে।