আপনি কি কখনও ভেবে দেখেছেন যে আপনি আপনার কম্পিউটারে পাওয়ার বোতাম টিপলে কী ঘটে? সেই সংক্ষিপ্ত বিরতির পিছনে, আপনার স্ক্রিন আলোকিত হওয়ার আগে, প্রক্রিয়াগুলির একটি জটিল সিরিজ ঘটছে। এই নিবন্ধটি ফার্মওয়্যারের আকর্ষণীয় জগতে ডুব দেবে, বুট প্রক্রিয়ার সময় বিভিন্ন উপাদান কীভাবে ইন্টারঅ্যাক্ট করে তা অন্বেষণ করবে।
এই সংযোগগুলি বোঝার মাধ্যমে, আপনি মৌলিক উপাদানগুলির একটি পরিষ্কার ছবি পাবেন যা আপনার সিস্টেমকে প্রাণবন্ত করে তোলে। আমাদের প্রাথমিক ফোকাস হবে Intel x86 আর্কিটেকচারের উপর, কিন্তু অনেক নীতি অন্যান্য আর্কিটেকচারেও প্রযোজ্য।
আপনি যদি আমাদের সিরিজের প্রথম অংশ মিস করেন, ধরতে এখানে ক্লিক করুন । এখন, ফার্মওয়্যারের পিছনের রহস্য উন্মোচন করা যাক।
ফার্মওয়্যারের উপাদানগুলি কীভাবে ইন্টারঅ্যাক্ট করে তা বোঝার জন্য, আমরা এর সমস্ত সংযুক্ত অংশগুলির সাথে পুরো আর্কিটেকচারটি অন্বেষণ করব। এক্সিকিউশন ফ্লো, নীচের চিত্রে দেখানো হয়েছে, রিসেট ভেক্টর থেকে শুরু হয়, যা প্রথম-পর্যায়ের বুটলোডারের অংশ। সেখান থেকে, এটি বিভিন্ন ফার্মওয়্যার পর্যায়ে অগ্রসর হয়:
ফার্মওয়্যার বা BIOS কে সাধারণত দুটি প্রধান অংশে ভাগ করা যেতে পারে, তাদের মধ্যে সাধারণত একটি ন্যূনতম ইন্টারফেস থাকে:
প্ল্যাটফর্ম ফার্মওয়্যারের ডিজাইন হয় একচেটিয়া হতে পারে, হার্ডওয়্যার প্রারম্ভিকতা এবং বুট কার্যকারিতা একত্রিত করে, অথবা এটি একটি মডুলার এবং স্টেজড বুট প্রবাহ অনুসরণ করতে পারে। ডিজাইনের পছন্দ সিস্টেমের প্রয়োজনীয়তার উপর নির্ভর করে এবং নির্দিষ্ট ডিভাইসের জন্য পছন্দনীয় হতে পারে।
নিম্নলিখিত চিত্রটি ব্যাখ্যা করে যে কীভাবে বিভিন্ন ফার্মওয়্যার উপাদানগুলি ইন্টারঅ্যাক্ট করে এবং বুট প্রক্রিয়াকে সমর্থন করার জন্য একসাথে ব্যবহার করা যেতে পারে (তীরগুলি সম্পাদনের ক্রম নির্দেশ করে):
যদি এই ডায়াগ্রামগুলি এখন জটিল মনে হয়, চিন্তা করবেন না। এই নিবন্ধটি পড়ার পরে তাদের আবার পর্যালোচনা করুন, এবং তারা আরও পরিষ্কার হবে।
ফার্মওয়্যারের এই অংশটি কম্পিউটার এবং এমবেডেড সিস্টেমগুলিকে ন্যূনতম হার্ডওয়্যার প্রারম্ভিকতার উপর ফোকাস করার জন্য ডিজাইন করা হয়েছে: শুধুমাত্র যা প্রয়োজন তা করতে, তারপর অপারেটিং সিস্টেম বুট করার জন্য দ্বিতীয়-পর্যায়ের বুটলোডারে নিয়ন্ত্রণ পাস করুন। FSBL ফ্ল্যাশ চিপ ছাড়া স্টোরেজ মিডিয়া থেকে অপারেটিং সিস্টেম লোড করে না। যেহেতু এটি শুধুমাত্র অন্তর্নিহিত হার্ডওয়্যার শুরু করে এবং হার্ড ড্রাইভ, এসএসডি, বা ইউএসবি ফ্ল্যাশ ড্রাইভের মতো বুট মিডিয়া পরিচালনা করে না, তাই একটি অপারেটিং সিস্টেম বুট করার জন্য আরেকটি সফ্টওয়্যার প্রয়োজন।
FSBL এর মূল দায়িত্ব :
কম্পিউটিংয়ের প্রথম দিকে, ওপেন সোর্স সফ্টওয়্যার ব্যাপকভাবে জনপ্রিয় ছিল না এবং বেশিরভাগ BIOS বাস্তবায়ন ছিল মালিকানাধীন। BIOS পোস্ট সোর্স কোড প্রদান করে মাত্র কয়েকটি উপলব্ধ ওপেন সলিউশন আছে, যেমন Super PC/Turbo XT BIOS এবং GLaBIOS । এই প্রকল্পগুলি IBM 5150/5155/5160 সিস্টেম এবং বেশিরভাগ XT ক্লোনগুলিতে কাজ করার জন্য ডিজাইন করা হয়েছিল।
যাইহোক, ওপেন-সোর্স BIOS বাস্তবায়ন, যেমন OpenBIOS এবং SeaBIOS , হার্ডওয়্যার প্রারম্ভিকতা সঞ্চালন করে না কারণ তারা বেয়ার হার্ডওয়্যারে চালানোর উদ্দেশ্যে নয়। কিন্তু সেকেন্ড-স্টেজ বুটলোডার হিসেবে ব্যাপকভাবে ব্যবহৃত হয় এবং QEMU এবং Bochs-এর মতো ভার্চুয়াল পরিবেশে নেটিভভাবে চালানো হয়।
যাই হোক না কেন, আপনার এই প্রথম দিকের BIOS-এর সাথে সরাসরি কাজ করতে হবে বা তাদের সুনির্দিষ্ট বিষয়ে গভীরভাবে অনুসন্ধান করতে হবে এমন সম্ভাবনা কম। কিন্তু আপনি যদি অন্বেষণ করতে আগ্রহী হন তবে উল্লিখিত সংগ্রহস্থলগুলি একটি ভাল সূচনা পয়েন্ট।
বর্তমান উন্নয়নের প্রবণতা যতদূর যায়, মালিকানাধীন BIOS সমাধানগুলির কোন চলমান বিকাশ নেই বলে মনে হচ্ছে, এবং এই জাতীয় প্রকল্পগুলি আধুনিক বিকল্পগুলির মুখে অপ্রচলিত হয়ে পড়েছে।
বুট প্রক্রিয়া একটি পর্যায়ক্রমিক প্রবাহ অনুসরণ করে, বাম থেকে শুরু করে এবং পরবর্তী চিত্রে ডানদিকে চলে যায়। প্ল্যাটফর্ম বুট প্রক্রিয়ার সময়রেখা হলুদ বাক্স দ্বারা নির্দেশিত নিম্নলিখিত বাক্যাংশে বিভক্ত:
ExitBootServices()
কলের মাধ্যমে শেষ হয়।
এই প্রক্রিয়া এবং এর সম্পাদনের পর্যায়গুলি UEFI প্ল্যাটফর্ম ইনিশিয়ালাইজেশন (PI) স্পেসিফিকেশন দ্বারা আচ্ছাদিত। যাইহোক, UEFI ইন্টারফেসও রয়েছে (ছবিতে গাঢ় নীল রেখা দ্বারা নির্দেশিত), যা পূর্ববর্তী নথির অংশ নয় এবং UEFI স্পেসিফিকেশনে বর্ণিত হয়েছে। যদিও UEFI এর নাম এবং ঘন ঘন ব্যবহার বিভ্রান্তিকর হতে পারে, এই দুটি নথির আলাদা ফোকাস রয়েছে:
মূলত, উভয় স্পেসিফিকেশন ইন্টারফেস সম্পর্কে, কিন্তু বিভিন্ন স্তরে। বিস্তারিত তথ্যের জন্য, আপনি UEFI ফোরাম ওয়েবসাইটে উভয় স্পেসিফিকেশন অ্যাক্সেস করতে পারেন।
UEFI PI প্রাথমিকভাবে একটি ইউনিফাইড ফার্মওয়্যার সমাধান হিসাবে ডিজাইন করা হয়েছিল, প্রথম-পর্যায় এবং দ্বিতীয়-পর্যায়ের বুটলোডারগুলির মধ্যে পার্থক্য বিবেচনা না করে। যাইহোক, যখন আমরা UEFI কে প্রথম-পর্যায়ের বুটলোডার হিসাবে উল্লেখ করি, তখন এতে SEC , PEI , এবং প্রাথমিক DXE পর্যায়গুলি অন্তর্ভুক্ত থাকে। আমরা DXE কে প্রাথমিক এবং শেষ পর্যায়ে বিভক্ত করার কারণ হল প্রারম্ভিক প্রক্রিয়ায় তাদের বিভিন্ন ভূমিকার কারণে।
প্রাথমিক DXE পর্বে, ড্রাইভাররা সাধারণত প্রয়োজনীয় CPU/PCH/বোর্ড ইনিশিয়ালাইজেশন সঞ্চালন করে এবং এছাড়াও DXE আর্কিটেকচারাল প্রোটোকল (APs) তৈরি করে, যা প্ল্যাটফর্ম-নির্দিষ্ট হার্ডওয়্যার থেকে DXE ফেজকে আলাদা করতে সাহায্য করে। APs প্ল্যাটফর্মের নির্দিষ্ট বিশদগুলিকে এনক্যাপসুলেট করে, দেরী DXE ফেজকে হার্ডওয়্যার নির্দিষ্টকরণের থেকে স্বাধীনভাবে কাজ করার অনুমতি দেয়।
Coreboot কিভাবে কাজ করে তার বিস্তারিত নিবন্ধ শীঘ্রই আসছে। আমার সামাজিক মিডিয়া অনুসরণ করুন - তারা খুব শীঘ্রই প্রকাশিত হবে!
প্রাথমিক হার্ডওয়্যার সেটআপ সম্পন্ন হওয়ার পরে, দ্বিতীয় পর্যায়টি কার্যকর হয়। এর প্রাথমিক ভূমিকা হল অপারেটিং সিস্টেম এবং প্ল্যাটফর্ম ফার্মওয়্যারের মধ্যে একটি সফ্টওয়্যার ইন্টারফেস সেট আপ করা, নিশ্চিত করা যে OS সিস্টেম সংস্থানগুলি পরিচালনা করতে পারে এবং হার্ডওয়্যার উপাদানগুলির সাথে যোগাযোগ করতে পারে।
SSBL-এর লক্ষ্য যতটা সম্ভব হার্ডওয়্যার বৈচিত্র লুকানো , হার্ডওয়্যার-স্তরের ইন্টারফেসগুলির বেশিরভাগ পরিচালনার মাধ্যমে ওএস এবং অ্যাপ্লিকেশন বিকাশকে সহজ করা। এই বিমূর্ততা বিকাশকারীদের অন্তর্নিহিত হার্ডওয়্যার পার্থক্য সম্পর্কে চিন্তা না করে উচ্চ-স্তরের কার্যকারিতাগুলিতে ফোকাস করতে দেয়।
SSBL এর মূল দায়িত্ব :
প্ল্যাটফর্ম তথ্য পুনরুদ্ধার : মেমরি ম্যাপিং, এসএমবিআইওএস, এসিপিআই টেবিল, এসপিআই ফ্ল্যাশ ইত্যাদি সহ প্রথম-পর্যায়ের বুটলোডার থেকে প্ল্যাটফর্ম-নির্দিষ্ট তথ্য প্রাপ্ত করে।
প্ল্যাটফর্ম স্বাধীন ড্রাইভার চালান : SMM, SPI, PCI, SCSI/ATA/IDE/DISK, USB, ACPI, নেটওয়ার্ক ইন্টারফেস ইত্যাদির জন্য ড্রাইভার অন্তর্ভুক্ত করে।
পরিষেবা বাস্তবায়ন (ওরফে ইন্টারফেস) : পরিষেবাগুলির একটি সেট প্রদান করে যা অপারেটিং সিস্টেম এবং হার্ডওয়্যার উপাদানগুলির মধ্যে যোগাযোগ সহজতর করে৷
সেটআপ মেনু : সিস্টেম কনফিগারেশনের জন্য একটি সেটআপ মেনু অফার করে, যা ব্যবহারকারীদের বুট অর্ডার, হার্ডওয়্যার পছন্দ এবং অন্যান্য সিস্টেম প্যারামিটার সম্পর্কিত সেটিংস সামঞ্জস্য করতে দেয়।
বুট লজিক : উপলব্ধ বুট মিডিয়া থেকে পেলোড (সম্ভবত অপারেটিং সিস্টেম) সনাক্ত এবং লোড করার পদ্ধতি।
BIOS-এর ইন্টারফেসটি BIOS পরিষেবা/ফাংশন/ইন্টারপ্ট কল নামে পরিচিত। এই ফাংশনগুলি হার্ডওয়্যার অ্যাক্সেসের জন্য রুটিনের একটি সেট সরবরাহ করে, তবে সিস্টেমের নির্দিষ্ট হার্ডওয়্যারে কীভাবে সেগুলি কার্যকর করা হয় তার নির্দিষ্ট বিবরণ ব্যবহারকারীর কাছ থেকে লুকানো থাকে।
16-বিট রিয়েল মোডে , আইএনটি x86 অ্যাসেম্বলি ল্যাঙ্গুয়েজ ইনস্ট্রাকশনের মাধ্যমে একটি সফ্টওয়্যার বিঘ্নিত করার মাধ্যমে সেগুলি সহজেই অ্যাক্সেস করা যেতে পারে। 32-বিট সুরক্ষিত মোডে , প্রায় সমস্ত BIOS পরিষেবাগুলি অনুপলব্ধ কারণ সেগমেন্টের মানগুলি বিভিন্ন উপায়ে পরিচালনা করা হয়।
এই ইন্টারফেসটি কীভাবে ব্যবহার করা যেতে পারে তার উদাহরণ হিসেবে ধরা যাক ডিস্ক পরিষেবা ( INT 13h
), যেটি সিলিন্ডার-হেড-সেক্টর (CHS) অ্যাড্রেসিং ব্যবহার করে সেক্টর-ভিত্তিক হার্ড ডিস্ক এবং ফ্লপি ডিস্ক রিড এবং রাইটিং পরিষেবা সরবরাহ করে। ধরা যাক আমরা 2টি সেক্টর (1024 বাইট) পড়তে চাই এবং সেগুলিকে মেমরি ঠিকানা 0x9020 এ লোড করতে চাই, তারপর নিম্নলিখিত কোডটি কার্যকর করা যেতে পারে:
mov $0x02, %ah # Set BIOS read sector routine mov $0x00, %ch # Select cylinder 0 mov $0x00, %dh # Select head 0 [has a base of 0] mov $0x02, %cl # Select sector 2 (next after the # boot sector) [has a base of 1] mov $0x02, %al # Read 2 sectors mov $0x00, %bx # Set BX general register to 0 mov %bx, %es # Set ES segment register to 0 mov $0x9020, %bx # Load sectors to ES:BX (0:0x9020) int $0x13 # Start reading from drive jmp $0x9020 # Jump to loaded code
আপনি যদি SeaBios-এ এই পরিষেবাটি কীভাবে লেখা হয় সে সম্পর্কে আগ্রহী হন, src/disk.c এ দেখুন।
ডিভাইসগুলি থেকে প্রথম 512-বাইট সেক্টর (সেক্টর জিরো) পড়ে একটি বুটযোগ্য ডিভাইস (এটি একটি হার্ড ড্রাইভ, CD-ROM, ফ্লপি ডিস্ক ইত্যাদি হতে পারে) অনুসন্ধান করা শুরু করে৷
BIOS-এর বুটস্ট্র্যাপ সিকোয়েন্সটি প্রথম বৈধ মাস্টার বুট রেকর্ড (MBR) লোড করে যা এটি কম্পিউটারের শারীরিক মেমরিতে প্রকৃত ঠিকানা 0x7C00 (ইঙ্গিত: 0x0000:0x7c00 এবং 0x7c0:0x0000 একই শারীরিক ঠিকানা উল্লেখ করে) খুঁজে পায়।
BIOS পেলোডের প্রথম 512 বাইটে নিয়ন্ত্রণ স্থানান্তর করে। এই লোডেড সেক্টর , যা সম্পূর্ণ পেলোড কোড ধারণ করার জন্য খুব ছোট, বুটযোগ্য ডিভাইস থেকে বাকি পেলোড লোড করার উদ্দেশ্যে কাজ করে। এই সময়ে, পেলোড BIOS দ্বারা উন্মুক্ত ইন্টারফেস ব্যবহার করতে পারে।
এটি লক্ষণীয় যে BIOS স্পেসিফিকেশন প্রাথমিক দিনগুলিতে বিদ্যমান ছিল না । BIOS একটি ডি ফ্যাক্টো স্ট্যান্ডার্ড - এটি 1980 এর দশকে প্রকৃত আইবিএম পিসিতে যেভাবে কাজ করেছিল সেভাবে কাজ করে। বাকি নির্মাতারা কেবল বিপরীত-ইঞ্জিনিয়ারড এবং IBM-সামঞ্জস্যপূর্ণ BIOS তৈরি করেছে। ফলস্বরূপ, BIOS নির্মাতাদের নতুন BIOS ফাংশন উদ্ভাবন বা ওভারল্যাপিং কার্যকারিতাগুলি থেকে বিরত রাখার জন্য কোনও নিয়ম ছিল না।
যেমন আগে উল্লেখ করা হয়েছে, UEFI নিজেই একটি স্পেসিফিকেশন এবং অনেকগুলি বাস্তবায়ন রয়েছে। সবচেয়ে বহুল ব্যবহৃত একটি হল TianoCore EDK II , UEFI এবং PI স্পেসিফিকেশনের একটি ওপেন-সোর্স রেফারেন্স বাস্তবায়ন । যদিও EDKII সম্পূর্ণরূপে কার্যকরী বুট ফার্মওয়্যার তৈরি করতে যথেষ্ট নয়, এটি বেশিরভাগ বাণিজ্যিক সমাধানের জন্য একটি শক্ত ভিত্তি প্রদান করে।
বিভিন্ন প্রথম-পর্যায়ের বুটলোডার সমর্থন করতে এবং একটি UEFI ইন্টারফেস প্রদান করতে, UEFI পেলোড প্রকল্প ব্যবহার করা হয়। এটি UEFI পরিবেশের জন্য সিস্টেম প্রস্তুত করতে বুট ফার্মওয়্যার দ্বারা প্রদত্ত প্রাথমিক সেটআপ এবং প্ল্যাটফর্ম তথ্যের উপর নির্ভর করে।
UEFI পেলোড DXE এবং BDS পর্যায়গুলি ব্যবহার করে, যা প্ল্যাটফর্ম-স্বাধীন হতে ডিজাইন করা হয়েছে। এটি একটি জেনেরিক পেলোড অফার করে যা বিভিন্ন প্ল্যাটফর্মের সাথে মানিয়ে নিতে পারে। বেশিরভাগ ক্ষেত্রে, এটির জন্য কোনো কাস্টমাইজেশন বা প্ল্যাটফর্ম-নির্দিষ্ট সমন্বয়ের প্রয়োজন হয় না এবং প্রথম-পর্যায়ের বুটলোডার থেকে প্ল্যাটফর্মের তথ্য ব্যবহার করে ব্যবহার করা যেতে পারে।
UEFI পেলোডের ভেরিয়েন্ট :
লিগ্যাসি UEFI পেলোড : প্রয়োজনীয় বাস্তবায়ন-নির্দিষ্ট প্ল্যাটফর্ম তথ্য বের করার জন্য একটি পার্স লাইব্রেরি প্রয়োজন। যদি বুটলোডার তার API আপডেট করে, পেলোডটিও আপডেট করা আবশ্যক।
ইউনিভার্সাল ইউইএফআই পেলোড : ইউনিভার্সাল স্কেলেবল ফার্মওয়্যার (ইউএসএফ) স্পেসিফিকেশন অনুসরণ করে, এক্সিকিউটেবল এবং লিঙ্কেবল ফরম্যাট (ইএলএফ) বা ফ্ল্যাট ইমেজ ট্রি (এফআইটি) একটি সাধারণ চিত্র বিন্যাস হিসাবে ব্যবহার করে। সেগুলিকে পার্স করার পরিবর্তে, এটি পেলোড এন্ট্রিতে হ্যান্ড অফ ব্লক (HOBs) পাওয়ার আশা করে৷
যদিও লিগ্যাসি UEFI পেলোড ঠিকঠাক কাজ করে, EDK2 সম্প্রদায় শিল্পটিকে ইউনিভার্সাল UEFI পেলোডের দিকে নিয়ে যাওয়ার চেষ্টা করছে। পেলোডগুলির মধ্যে পছন্দ আপনার ফার্মওয়্যার উপাদানগুলির উপর নির্ভর করে। উদাহরণস্বরূপ, আমার প্যাচ ছাড়া স্লিম বুটলোডারে SMM সমর্থন সহ লিগ্যাসি পেলোড চালানো সম্ভব নয়। অন্যদিকে, কোরবুটের সাথে ইউনিভার্সাল পেলোড ব্যবহার করার জন্য কোরবুট টেবিলগুলিকে HOBs- এ অনুবাদ করার জন্য একটি শিম স্তরের প্রয়োজন, একটি বৈশিষ্ট্য শুধুমাত্র StarLabs EDK2 ফর্ক -এ উপলব্ধ।
প্রতিটি UEFI- অনুবর্তী সিস্টেম একটি সিস্টেম টেবিল প্রদান করে যা UEFI পরিবেশে চলমান প্রতিটি কোডে পাস করা হয় (ড্রাইভার, অ্যাপ্লিকেশন, ওএস লোডার)। এই ডাটা স্ট্রাকচারটি একটি UEFI এক্সিকিউটেবলকে সিস্টেম কনফিগারেশন টেবিল যেমন ACPI , SMBIOS, এবং UEFI পরিষেবার সংগ্রহ অ্যাক্সেস করতে দেয়।
টেবিলের গঠন MdePkg/Include/Uefi/UefiSpec.h- এ বর্ণনা করা হয়েছে:
typedef struct { EFI_TABLE_HEADER Hdr; CHAR16 *FirmwareVendor; UINT32 FirmwareRevision; EFI_HANDLE ConsoleInHandle; EFI_SIMPLE_TEXT_INPUT_PROTOCOL *ConIn; EFI_HANDLE ConsoleOutHandle; EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *ConOut; EFI_HANDLE StandardErrorHandle; EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *StdErr; // // A pointer to the EFI Runtime Services Table. // EFI_RUNTIME_SERVICES *RuntimeServices; // // A pointer to the EFI Boot Services Table. // EFI_BOOT_SERVICES *BootServices; UINTN NumberOfTableEntries; EFI_CONFIGURATION_TABLE *ConfigurationTable; } EFI_SYSTEM_TABLE;
পরিষেবাগুলির মধ্যে নিম্নলিখিত প্রকারগুলি অন্তর্ভুক্ত রয়েছে: বুট পরিষেবাগুলি , রানটাইম পরিষেবাগুলি , এবং প্রোটোকল দ্বারা প্রদত্ত পরিষেবাগুলি ৷
UEFI ইউইএফআই প্রোটোকল সেট আপ করে ডিভাইসে অ্যাক্সেসকে বিমূর্ত করে। এই প্রোটোকলগুলি হল ডেটা স্ট্রাকচার যাতে ফাংশন পয়েন্টার থাকে এবং একটি গ্লোবাললি ইউনিক আইডেন্টিফায়ার (GUID) দ্বারা চিহ্নিত করা হয় যা অন্যান্য মডিউলগুলিকে তাদের সনাক্ত করতে এবং ব্যবহার করতে দেয়। এগুলি বুট পরিষেবাগুলির মাধ্যমে আবিষ্কার করা যেতে পারে।
একটি UEFI ড্রাইভার এই প্রোটোকল তৈরি করে, এবং প্রকৃত ফাংশন (পয়েন্টার নয়!) ড্রাইভারের মধ্যেই থাকে। এই প্রক্রিয়াটি UEFI পরিবেশের মধ্যে বিভিন্ন উপাদানকে একে অপরের সাথে যোগাযোগ করার অনুমতি দেয় এবং নিশ্চিত করে যে OS তার নিজস্ব ড্রাইভার লোড করার আগে ডিভাইসগুলির সাথে যোগাযোগ করতে পারে।
যদিও কিছু প্রোটোকল পূর্বনির্ধারিত এবং UEFI স্পেসিফিকেশনে বর্ণনা করা হয়, ফার্মওয়্যার বিক্রেতারা একটি প্ল্যাটফর্মের কার্যকারিতা প্রসারিত করতে তাদের নিজস্ব কাস্টম প্রোটোকলও তৈরি করতে পারে।
বুট পরিষেবা
শুধুমাত্র বুট সময় ব্যবহার করা যেতে পারে যে ফাংশন প্রদান. EFI_BOOT_SERVICES.ExitBootServices()
ফাংশনটিকে ( MdeModulePkg/Core/Dxe/DxeMain/DxeMain.c ) বলা না হওয়া পর্যন্ত এই পরিষেবাগুলি উপলব্ধ থাকবে৷
সমস্ত বুট পরিষেবার পয়েন্টারগুলি বুট পরিষেবা সারণীতে সংরক্ষিত থাকে ( MdePkg/Include/Uefi/UefiSpec.h ):
typedef struct { EFI_TABLE_HEADER Hdr; ... EFI_GET_MEMORY_MAP GetMemoryMap; EFI_ALLOCATE_POOL AllocatePool; EFI_FREE_POOL FreePool; ... EFI_HANDLE_PROTOCOL HandleProtocol; ... EFI_EXIT_BOOT_SERVICES ExitBootServices; ... } EFI_BOOT_SERVICES;
রানটাইম পরিষেবা
অপারেটিং সিস্টেম চলাকালীন পরিষেবাগুলির একটি ন্যূনতম সেট এখনও অ্যাক্সেসযোগ্য। বুট পরিষেবাগুলির বিপরীতে, যে কোনও পেলোড (উদাহরণস্বরূপ, OS বুটলোডার) EFI_BOOT_SERVICES.ExitBootServices()
এ কলের মাধ্যমে প্ল্যাটফর্মের নিয়ন্ত্রণ নেওয়ার পরেও এই পরিষেবাগুলি বৈধ।
সমস্ত রানটাইম পরিষেবার পয়েন্টারগুলি রানটাইম পরিষেবা টেবিলে সংরক্ষিত থাকে ( MdePkg/Include/Uefi/UefiSpec.h ):
typedef struct { EFI_TABLE_HEADER Hdr; ... EFI_GET_TIME GetTime; EFI_SET_TIME SetTime; ... EFI_GET_VARIABLE GetVariable; EFI_GET_NEXT_VARIABLE_NAME GetNextVariableName; EFI_SET_VARIABLE SetVariable; ... EFI_GET_NEXT_HIGH_MONO_COUNT GetNextHighMonotonicCount; EFI_RESET_SYSTEM ResetSystem; ... } EFI_RUNTIME_SERVICES;
নীচের ছবিটি বুট এবং রানটাইম পরিষেবাগুলির জন্য টাইমলাইন দেখায়, যাতে আপনি দেখতে পারেন ঠিক কখন প্রতিটি সক্রিয় থাকে৷
UEFI স্পেক একটি বুট পলিসি ইঞ্জিনকে সংজ্ঞায়িত করে যাকে বলা হয় UEFI বুট ম্যানেজার । এটি একটি নির্দিষ্ট ক্রমে UEFI অ্যাপ্লিকেশন লোড করার চেষ্টা করবে। এই অর্ডার এবং অন্যান্য সেটিংস গ্লোবাল NVRAM (ননভোলাটাইল র্যান্ডম-অ্যাক্সেস মেমরি) ভেরিয়েবল পরিবর্তন করে কনফিগার করা যেতে পারে। আসুন তাদের মধ্যে সবচেয়ে গুরুত্বপূর্ণ আলোচনা করা যাক:
Boot####
( ####
একটি অনন্য হেক্স মান দ্বারা প্রতিস্থাপিত হয়) — একটি বুট/লোড বিকল্প।BootCurrent
— বর্তমানে চলমান সিস্টেম চালু করতে ব্যবহৃত বুট বিকল্প।BootNext
— শুধুমাত্র পরবর্তী বুটের জন্য বুট বিকল্প। এটি শুধুমাত্র একটি বুটের জন্য BootOrder
প্রতিস্থাপন করে এবং প্রথম ব্যবহারের পরে বুট ম্যানেজার দ্বারা মুছে ফেলা হয়। এটি আপনাকে BootOrder
পরিবর্তন না করে পরবর্তী বুট আচরণ পরিবর্তন করতে দেয়।BootOrder
— অর্ডারকৃত বুট বিকল্প লোড তালিকা। বুট ম্যানেজার এই তালিকার প্রথম সক্রিয় বিকল্পটি বুট করার চেষ্টা করে। ব্যর্থ হলে, এটি পরবর্তী বিকল্প চেষ্টা করে, এবং তাই।BootOptionSupport
— বুট ম্যানেজার দ্বারা সমর্থিত বুট বিকল্পের ধরন।Timeout
— BootNext
বা BootOrder
থেকে স্বয়ংক্রিয়ভাবে স্টার্টআপ মান বেছে নেওয়ার আগে ফার্মওয়্যারের বুট ম্যানেজারদের সময় শেষ হয়ে যায়।
এই ভেরিয়েবলগুলি সহজেই লিনাক্স থেকে efibootmgr(8) ব্যবহার করে পাওয়া যেতে পারে:
[root@localhost ~]# efibootmgr BootCurrent: 0000 Timeout: 5 seconds BootOrder: 0000,0001,2001,2002,2003 Boot0000* ARCHLINUX HD(5,GPT,d03ca3cf-1511-d94e-8400-c7a125866442,0x40164000,0x100000)/File(\EFI\ARCHLINUX\grubx64.efi) Boot0001* Windows Boot Manager HD(1,GPT,6f185443-09fc-4f15-afdf-01c523565e52,0x800,0x32000)/File(\EFI\Microsoft\Boot\bootmgfw.efi)57a94e544f5753000100000088900100780000004200430044039f0a42004a004500430054003d007b00390064006500610038003600320063002d1139006300640064002d0034006500370030102d0061006300630031002d006600330032006200330034003400640034003700390035007d00000033000300000710000000040000007fff0400 Boot0002* ARCHLINUX HD(5,GPT,d03ca3cf-1511-d94e-8400-c7a125866442,0x40164000,0x100000) Boot2001* EFI USB Device RC Boot2002* EFI DVD/CDROM RC Boot2003* EFI Network RC
আসুন উপরের কোড স্নিপেটের উপর নির্ভর করে বুটিংটি একবার দেখে নেওয়া যাক। UEFI BootOrder
তালিকার পুনরাবৃত্তি শুরু করবে। তালিকার প্রতিটি এন্ট্রির জন্য, এটি একটি অনুরূপ Boot####
ভেরিয়েবলের সন্ধান করে — 0000-এর জন্য Boot0000
, 2003-এর জন্য Boot2003
, এবং আরও অনেক কিছু। ভেরিয়েবলটি বিদ্যমান না থাকলে, এটি পরবর্তী এন্ট্রিতে চলতে থাকে। ভেরিয়েবল বিদ্যমান থাকলে, এটি ভেরিয়েবলের বিষয়বস্তু পড়ে। প্রতিটি বুট বিকল্প ভেরিয়েবলে একটি EFI_LOAD_OPTION
বর্ণনাকারী থাকে যা পরিবর্তনশীল দৈর্ঘ্যের ক্ষেত্রগুলির একটি বাইট-প্যাকড বাফার (এটি কেবলমাত্র ডেটা কাঠামো)।
ডেটা স্ট্রাকচার [MdePkg/Include/Uefi/UefiSpec.h][ https://github.com/tianocore/edk2/blob/edk2-stable202405/MdePkg/Include/Uefi/UefiSpec.h#L2122 ) এ বর্ণনা করা হয়েছে
typedef struct _EFI_LOAD_OPTION { /// The attributes for this load option entry. UINT32 Attributes; /// Length in bytes of the FilePathList. UINT16 FilePathListLength; /// The user readable description for the load option. /// Example: 'ARCHLINUX' / 'Windows Boot Manager' / `EFI USB Device` // CHAR16 Description[]; /// A packed array of UEFI device paths. /// Example: 'HD(5,GPT,d03ca3cf-1511-d94e-8400-c7a125866442,0x40164000,0x100000)/File(\EFI\ARCHLINUX\grubx64.efi)' // EFI_DEVICE_PATH_PROTOCOL FilePathList[]; /// The remaining bytes in the load option descriptor are a binary data buffer that is passed to the loaded image. /// Example: '57a9...0400' in Boot0001 variable // UINT8 OptionalData[]; } EFI_LOAD_OPTION;
এই মুহুর্তে, ফার্মওয়্যারটি একটি ডিভাইস পাথ পরীক্ষা করবে ( EFI_DEVICE_PATH_PROTOCOL )। বেশিরভাগ ক্ষেত্রে, আমাদের কম্পিউটার একটি স্টোরেজ ডিভাইস (হার্ড ড্রাইভ/SSD/NVMe/ইত্যাদি) থেকে বুট আপ করা হয়। সুতরাং, ডিভাইস পাথে HD(Partition Number, Type, Signature, Start sector, Size in sectors)
নোড থাকবে।
দ্রষ্টব্য : আপনি যদি অন্যান্য পাথগুলি অনুবাদ করতে আগ্রহী হন তবে UEFI স্পেসিফিকেশন v2.10, 10.6.1.6 পাঠ্য ডিভাইস নোড রেফারেন্স পড়ুন।
UEFI ডিস্কের দিকে তাকাবে এবং দেখবে যে এটিতে নোডের সাথে মেলে একটি পার্টিশন আছে কিনা। এটি বিদ্যমান থাকলে, এটিকে একটি নির্দিষ্ট গ্লোবাললি ইউনিক আইডেন্টিফায়ার (GUID) দিয়ে লেবেল করা উচিত যা এটিকে EFI সিস্টেম পার্টিশন (ESP) হিসাবে চিহ্নিত করে। এটি একটি ফাইল সিস্টেমের সাথে ফরম্যাট করা হয়েছে যার স্পেসিফিকেশন FAT ফাইল সিস্টেমের নির্দিষ্ট সংস্করণের উপর ভিত্তি করে এবং এর নাম EFI ফাইল সিস্টেম ; আসলে, এটি শুধুমাত্র একটি নিয়মিত FAT12/16/32 ।
File(\Path\To\The\File.efi)
ফাইলের একটি সুস্পষ্ট পথ থাকে, তাহলে UEFI সেই নির্দিষ্ট ফাইলটির সন্ধান করবে। উদাহরণস্বরূপ, Boot0000
অপশনটিতে File(\EFI\ARCHLINUX\grubx64.efi)
রয়েছে।\EFI\BOOT\BOOT{arch}.EFI
( BOOTx64.EFI
for amd64 বা i386 / IA32 এর জন্য BOOTia32.EFI
)। এই প্রক্রিয়াটি বুটযোগ্য অপসারণযোগ্য মিডিয়াকে (উদাহরণস্বরূপ, একটি USB ড্রাইভ) UEFI-তে কাজ করার অনুমতি দেয়; তারা শুধু একটি ফলব্যাক বুট পাথ ব্যবহার করে। উদাহরণস্বরূপ, Boot0002
বিকল্পটি এই প্রক্রিয়াটি ব্যবহার করবে।
দ্রষ্টব্য: উপরে উল্লিখিত সমস্ত Boot####
বিকল্পগুলি efibootmgr- এর উদাহরণ আউটপুটে প্রদর্শিত বুট বিকল্পগুলিকে নির্দেশ করে।
উভয় ক্ষেত্রেই, UEFI বুট ম্যানেজার UEFI অ্যাপ্লিকেশন (এটি OS বুটলোডার , UEFI শেল, ইউটিলিটি সফ্টওয়্যার, সিস্টেম সেটআপ এবং যাই হোক না কেন) মেমরিতে লোড করবে। এই মুহুর্তে, নিয়ন্ত্রণ তারপর UEFI অ্যাপ্লিকেশনের এন্ট্রি পয়েন্টে স্থানান্তরিত হয়। BIOS এর বিপরীতে, UEFI অ্যাপ্লিকেশন ফার্মওয়্যারে নিয়ন্ত্রণ ফিরিয়ে দিতে পারে (পরিস্থিতি ছাড়াও, যখন অ্যাপ্লিকেশনটি সিস্টেমের নিয়ন্ত্রণ নেয়)। যদি এটি ঘটে বা কিছু ভুল হয়ে যায়, বুট ম্যানেজার পরবর্তী Boot####
এন্ট্রিতে চলে যায় এবং ঠিক একই প্রক্রিয়া অনুসরণ করে।
স্পেসিফিকেশন উল্লেখ করে যে বুট ম্যানেজার স্বয়ংক্রিয়ভাবে ডাটাবেস ভেরিয়েবল বজায় রাখতে পারে। এর মধ্যে লোড বিকল্প ভেরিয়েবলগুলি সরানো রয়েছে যা উল্লেখ করা হয় না বা পার্স করা যায় না। উপরন্তু, এটি সংশ্লিষ্ট লোড বিকল্প ভেরিয়েবল ছাড়া যেকোনও লোড অপশন মুছে ফেলার জন্য যেকোন অর্ডার করা তালিকা পুনরায় লিখতে পারে।
উপরের টেক্সট UEFI বুটিং বর্ণনা করে। এছাড়াও, UEFI ফার্মওয়্যার সামঞ্জস্য সমর্থন মডিউল (CSM) মোডে চলতে পারে যা একটি BIOS অনুকরণ করে।
সফ্টওয়্যারের একটি অংশ যা ফার্মওয়্যার (সাধারণত সেকেন্ড-স্টেজ বুটলোডার ) দ্বারা শুরু হয় এবং OS কার্নেল লোড করতে এর ইন্টারফেস ব্যবহার করে। এটি একটি OS এর মতো জটিল হতে পারে, যেমন বৈশিষ্ট্যগুলি অফার করে:
এই প্রোগ্রামগুলির সাধারণ ডিজাইনগুলি এই নিবন্ধের সুযোগের বাইরে। জনপ্রিয় OS বুটলোডারগুলির বিশদ তুলনার জন্য, আপনি ArchLinux উইকি এবং উইকিপিডিয়া নিবন্ধটি উল্লেখ করতে পারেন।
উইন্ডোজ সিস্টেম তার মালিকানাধীন OS বুটলোডার ব্যবহার করে যা উইন্ডোজ বুট ম্যানেজার (BOOTMGR) নামে পরিচিত।
ফার্মওয়্যার এখন আর একটি ছোট, জটিল কোড নয়। এটি একটি বিশাল পরিমাণে জটিল কোডে পরিণত হয়েছে, এবং বর্তমান প্রবণতা শুধুমাত্র এতে অবদান রাখে। আমরা এটিতে ডুম , টুইটার এবং আরও অনেক আকর্ষণীয় অ্যাপ্লিকেশন চালাতে পারি।
সামগ্রিক স্থাপত্য বোঝা আপনার মনে এই উপাদানগুলি সংগঠিত করতে সাহায্য করে। বিদ্যমান ফার্মওয়্যারের নকশা পরীক্ষা করে, আপনি আকর্ষণীয় প্রক্রিয়ার অন্তর্দৃষ্টি অর্জন করেন যা প্রতিবার কম্পিউটার চালু করার সময় উন্মোচিত হয়। এই টপ-ডাউন দৃষ্টিকোণটি শুধুমাত্র প্রতিটি অংশের ভূমিকাকে স্পষ্ট করে না বরং আধুনিক ফার্মওয়্যার সিস্টেমের পরিশীলিত এবং বিকশিত প্রকৃতিকেও হাইলাইট করে।