চলমান উদাহরণ
প্রযুক্তিগতভাবে, একটি প্রোগ্রাম যা ওএস ছাড়াই চলে, একটি ওএস। সুতরাং আসুন দেখুন কীভাবে কিছু বিয়োগী হ্যালো ওয়ার্ল্ড ওএস তৈরি এবং পরিচালনা করতে হয়।
নীচের সমস্ত উদাহরণের কোডটি এই গিটহাব রেপোতে উপস্থিত রয়েছে ।
বুট সেক্টর
X86-এ, আপনি যে সহজ এবং নিম্নতম স্তরের কাজটি করতে পারেন তা হ'ল মাস্টার বুট সেক্টর (এমবিআর) তৈরি করা , যা এক ধরণের বুট সেক্টর , এবং তারপরে এটিকে একটি ডিস্কে ইনস্টল করা।
এখানে আমরা একটি printf
কল দিয়ে একটি তৈরি করি :
printf '\364%509s\125\252' > main.img
sudo apt-get install qemu-system-x86
qemu-system-x86_64 -hda main.img
ফলাফল:
উবুন্টু 18.04, কিউএমইউ 2.11.1 এ পরীক্ষিত।
main.img
নিম্নলিখিত রয়েছে:
\364
অক্টাল == 0xf4
হেক্সে: একটি hlt
নির্দেশিকার জন্য এনকোডিং , যা সিপিইউকে কাজ বন্ধ করতে বলে।
অতএব আমাদের প্রোগ্রামটি কিছু করবে না: কেবল শুরু করুন এবং বন্ধ করুন।
আমরা অষ্টাল ব্যবহার করি কারণ \x
হেক্স নম্বরগুলি পসিক্স দ্বারা নির্দিষ্ট করা হয়নি।
আমরা সহজেই এই এনকোডিংটি পেতে পারি:
echo hlt > a.asm
nasm -f bin a.asm
hd a
তবে 0xf4
এনকোডিং অবশ্যই ইন্টেল ম্যানুয়ালটিতে নথিভুক্ত করা হয়।
%509s
509 স্পেস উত্পাদন। 510 বাইট না হওয়া পর্যন্ত ফাইলটি পূরণ করা দরকার।
\125\252
ইন অষ্টাল == এর 0x55
পরে 0xaa
: হার্ডওয়্যার দ্বারা প্রয়োজনীয় ম্যাজিক বাইট। সেগুলি অবশ্যই 511 এবং 512 বাইট হতে হবে।
উপস্থিত না থাকলে, হার্ডওয়্যার এটি বুটযোগ্য ডিস্ক হিসাবে বিবেচনা করবে না।
মনে রাখবেন যে কিছু না করেও কিছু চরিত্র ইতিমধ্যে পর্দায় মুদ্রিত হয়েছে। এগুলি ফার্মওয়্যার দ্বারা মুদ্রিত হয় এবং সিস্টেমটি সনাক্ত করতে পরিবেশন করে।
আসল হার্ডওয়্যার চালান
অনুকরণকারী মজাদার, তবে হার্ডওয়্যারই আসল চুক্তি।
তবে খেয়াল করুন যে এটি বিপজ্জনক, এবং আপনি ভুলক্রমে আপনার ডিস্কটি মুছতে পারেন: কেবল পুরানো মেশিনে এটি করুন যাতে সমালোচনামূলক ডেটা থাকে না! বা আরও ভাল, রাস্পবেরি পাই এর মতো ডেবোর্ডগুলি নীচে আর্ম উদাহরণ দেখুন see
সাধারণ ল্যাপটপের জন্য আপনাকে এমন কিছু করতে হবে:
ছবিটি একটি ইউএসবি স্টিকে পোড়াও (আপনার ডেটা ধ্বংস করবে!):
sudo dd if=main.img of=/dev/sdX
একটি কম্পিউটারে ইউএসবি প্লাগ করুন
এটি চালু কর
এটি ইউএসবি থেকে বুট করতে বলুন।
এর অর্থ হার্ডডিস্কের আগে ফার্মওয়্যারটিকে ইউএসবি বাছাই করা।
যদি এটি আপনার মেশিনের ডিফল্ট আচরণ না হয় তবে পাওয়ার-অনের পরে এন্টার, এফ 12, ইএসসি বা এ জাতীয় অন্যান্য অদ্ভুত কীগুলি চাপুন যতক্ষণ না আপনি ইউএসবি থেকে বুট করার জন্য বেছে নিতে পারেন এমন কোনও বুট মেনু পাওয়া যায়।
প্রায়শই এই মেনুগুলিতে অনুসন্ধানের অর্ডারটি কনফিগার করা সম্ভব।
উদাহরণস্বরূপ, আমার পুরানো লেনোভো থিংকপ্যাড টি 430, ইউইএফআই বিআইওএস 1.16 এ, আমি দেখতে পাচ্ছি:
ওহে বিশ্ব
এখন যেহেতু আমরা একটি ন্যূনতম প্রোগ্রাম তৈরি করেছি, আসুন হ্যালো ওয়ার্ল্ডে চলে আসি।
সুস্পষ্ট প্রশ্ন হ'ল আইও কিভাবে করবেন? কয়েকটি বিকল্প:
- ফার্মওয়্যার, যেমন BIOS বা UEFI কে আমাদের জন্য এটি করতে বলুন
- ভিজিএ: বিশেষ মেমরি অঞ্চল যা লিখিত হলে পর্দায় মুদ্রিত হয়। সুরক্ষিত মোডে ব্যবহার করা যেতে পারে।
- ড্রাইভার লিখুন এবং সরাসরি ডিসপ্লে হার্ডওয়্যারের সাথে কথা বলুন। এটি করার জন্য এটি "যথাযথ" উপায়: আরও শক্তিশালী, তবে আরও জটিল।
সিরিয়াল পোর্ট । এটি একটি খুব সাধারণ মানকযুক্ত প্রোটোকল যা কোনও হোস্ট টার্মিনাল থেকে অক্ষর প্রেরণ করে এবং পুনরুদ্ধার করে।
উত্স ।
দুর্ভাগ্যক্রমে এটি বেশিরভাগ আধুনিক ল্যাপটপে প্রকাশিত হয় নি, তবে উন্নয়ন বোর্ডে যাওয়ার সাধারণ উপায়, নীচের এআরএম উদাহরণগুলি দেখুন।
এটি সত্যিই লজ্জাজনক, যেহেতু যেমন ইন্টারফেসগুলি উদাহরণস্বরূপ লিনাক্স কার্নেলটি ডিবাগ করতে সত্যিই দরকারী ।
চিপগুলির ডিবাগ বৈশিষ্ট্যগুলি ব্যবহার করুন। এআরএম উদাহরণস্বরূপ তাদের আধা-হোস্টিং বলে । সত্যিকারের হার্ডওয়্যারগুলিতে এর জন্য কিছু অতিরিক্ত হার্ডওয়্যার এবং সফ্টওয়্যার সমর্থন প্রয়োজন, তবে অনুকরণকারীদের ক্ষেত্রে এটি একটি বিনামূল্যে সুবিধাজনক বিকল্প হতে পারে। উদাহরণ ।
X86 এ এটি সহজ হওয়ায় এখানে আমরা একটি বায়োএস উদাহরণ করব। তবে মনে রাখবেন যে এটি সবচেয়ে শক্তিশালী পদ্ধতি নয়।
main.S
.code16
mov $msg, %si
mov $0x0e, %ah
loop:
lodsb
or %al, %al
jz halt
int $0x10
jmp loop
halt:
hlt
msg:
.asciz "hello world"
link.ld
SECTIONS
{
. = 0x7c00;
.text :
{
__start = .;
*(.text)
. = 0x1FE;
SHORT(0xAA55)
}
}
জমা দিন এবং এর সাথে লিঙ্ক করুন:
gcc -c -g -o main.o main.S
ld --oformat binary -o main.img -T linker.ld main.o
ফলাফল:
পরীক্ষিত: লেনোভো থিঙ্কপ্যাড টি 430, ইউইএফআই বিআইওএস 1.16। একটি উবুন্টু 18.04 হোস্টে ডিস্ক উত্পন্ন।
স্ট্যান্ডার্ড ইউজারল্যান্ড অ্যাসেমব্লিং নির্দেশাবলী ছাড়াও আমাদের রয়েছে:
.code16
: জিএএসকে 16-বিট কোড আউটপুট করতে বলে
cli
: সফ্টওয়্যার বাধা অক্ষম করুন। এগুলি প্রসেসরের পরে আবার চালানো শুরু করতে পারেhlt
int $0x10
: একটি বায়োএস কল করে। একে একে একে অক্ষর মুদ্রণ করে।
গুরুত্বপূর্ণ লিঙ্ক পতাকাগুলি হল:
--oformat binary
: আউটপুট কাঁচা বাইনারি সমাবেশ কোড, কোনও ELF ফাইলের মধ্যে এটি মোটা করবেন না যেমন নিয়মিত ইউজারল্যান্ড এক্সিকিউটেবলের ক্ষেত্রে হয়।
সমাবেশের পরিবর্তে সি ব্যবহার করুন
যেহেতু সি সমাবেশে কম্পাইল করে, প্রমিত লাইব্রেরি ছাড়া সি ব্যবহার করা বেশ সহজ, আপনার মূলত প্রয়োজন:
- জিনিসগুলিকে সঠিক জায়গায় রাখার জন্য একটি লিঙ্কার স্ক্রিপ্ট
- পতাকাগুলি যা জিসিসিকে স্ট্যান্ডার্ড লাইব্রেরি ব্যবহার না করতে বলে tell
- একটি ক্ষুদ্র সমাবেশে প্রবেশের বিন্দু যা প্রয়োজনীয় সি রাজ্যের জন্য নির্দিষ্ট
main
করে:
টোডো: লিট করুন তাই গিটহাবের কিছু x86 উদাহরণ। আমি তৈরি করেছি এমন একটি আর্ম এখানে ।
আপনি যদি স্ট্যান্ডার্ড লাইব্রেরিটি ব্যবহার করতে চান তবে বিষয়গুলি আরও মজাদার হয়, যেহেতু আমাদের কাছে লিনাক্স কার্নেল নেই, যা পসিক্সের মাধ্যমে সি স্ট্যান্ডার্ড লাইব্রেরি কার্যকারিতা অনেকটাই প্রয়োগ করে ।
লিনাক্সের মতো একটি পূর্ণ বর্ধিত ওএসে না গিয়ে কয়েকটি সম্ভাবনার মধ্যে রয়েছে:
Newlib
বিস্তারিত উদাহরণ এখানে: https : // elect इलेक्ट्रॉनिक्स. stackexchange.com/questions/223929/c-standard-libraries-on-bare-metal/223931
নিউলিবে আপনাকে নিজেরাই সিস্কলগুলি প্রয়োগ করতে হবে তবে আপনি একটি খুব ন্যূনতম সিস্টেম পেয়েছেন এবং সেগুলি কার্যকর করা খুব সহজ।
উদাহরণস্বরূপ, আপনি printf
ইউআরটি বা এআরএম সিস্টেমে পুনর্নির্দেশ করতে পারেন , বা সেমিহোস্টিংয়ের মাধ্যমে প্রয়োগ exit()
করতে পারেন ।
এম্বেড করা অপারেটিং সিস্টেমগুলি যেমন ফ্রিআরটিওএস এবং জেফির ।
এই ধরনের অপারেটিং সিস্টেমগুলি সাধারণত আপনাকে প্রাক-অভিজাত সময়সূচী বন্ধ করতে দেয়, সুতরাং আপনাকে প্রোগ্রামের রানটাইমের উপরে পুরো নিয়ন্ত্রণ দেয়।
এগুলি প্রাক-বাস্তবায়িত নিউলিবের এক ধরণের হিসাবে দেখা যেতে পারে।
এআরএম
এআরএম-এ, সাধারণ ধারণাগুলি একই রকম are আমি আপলোড করেছি:
রাস্পবেরি পাই এর জন্য, https://github.com/dwelch67/raspberrypi আজ উপলব্ধ সর্বাধিক জনপ্রিয় টিউটোরিয়াল বলে মনে হচ্ছে।
X86 থেকে কিছু পার্থক্য অন্তর্ভুক্ত:
আই সরাসরি যাদু ঠিকানায় লিখে সম্পন্ন করা হয়, কোন in
এবং out
নির্দেশাবলী।
একে মেমরি ম্যাপযুক্ত আইও বলে ।
রাস্পবেরি পাই এর মতো কিছু বাস্তব হার্ডওয়্যারের জন্য, আপনি নিজেরাই ডিস্কের চিত্রটিতে ফার্মওয়্যার (বিআইওএস) যুক্ত করতে পারেন।
এটি একটি ভাল জিনিস, কারণ এটি ফার্মওয়্যার আপডেট করা আরও স্বচ্ছ করে তোলে।
ফার্মওয়্যার
সত্যিকার অর্থে, আপনার বুট সেক্টরটি প্রথম সফ্টওয়্যার নয় যা সিস্টেমের সিপিইউতে চলে।
আসলে যা প্রথমে চলে তা হ'ল তথাকথিত ফার্মওয়্যার , যা একটি সফ্টওয়্যার:
- হার্ডওয়্যার নির্মাতারা তৈরি
- সাধারণত বন্ধ উত্স তবে সম্ভবত সি-ভিত্তিক
- কেবল পঠনযোগ্য মেমরির মধ্যে সঞ্চিত এবং তাই বিক্রেতার সম্মতি ছাড়াই সংশোধন করা শক্ত / অসম্ভব।
সুপরিচিত ফার্মওয়্যারগুলির মধ্যে রয়েছে:
- BIOS : পুরানো সমস্ত-বর্তমান x86 ফার্মওয়্যার। সিবিআইওএস হল কিউইএমইউ দ্বারা ব্যবহৃত ডিফল্ট ওপেন সোর্স বাস্তবায়ন।
- ইউইএফআই : বিআইওএস উত্তরসূরি, আরও উন্নতমানের, তবে আরও সক্ষম, এবং অবিশ্বাস্যরূপে ফুলে গেছে।
- কোরবুট : মহৎ ক্রস খিলান উন্মুক্ত উত্স প্রচেষ্টা
ফার্মওয়্যার এর মতো কাজ করে:
প্রতিটি হার্ড ডিস্ক, ইউএসবি, নেটওয়ার্ক ইত্যাদি লুপ করুন যতক্ষণ না আপনি বুটযোগ্য কিছু খুঁজে পান something
যখন আমরা কিউইইএমইউ পরিচালনা করি তখন -hda
বলে যে main.img
এটি একটি হার্ডডিস্কটি হার্ডওয়ারের সাথে যুক্ত এবং
hda
প্রথম চেষ্টা করা হয় এবং এটি ব্যবহার করা হয়।
প্রথম 512 বাইটটি র্যামের মেমরি ঠিকানায় লোড করুন 0x7c00
, সিপিইউর আরআইপি রাখুন, এবং এটি চালিয়ে দিন
ডিসপ্লেতে বুট মেনু বা BIOS মুদ্রণ কলগুলির মতো জিনিসগুলি দেখান
ফার্মওয়্যার ওএস-এর মতো কার্যকারিতা দেয় যা বেশিরভাগ ওএস-এস নির্ভর করে। উদাহরণস্বরূপ, পাইথন সাবসেটটি BIOS / UEFI- তে চালিত করার জন্য পোর্ট করা হয়েছে: https://www.youtube.com/watch?v=bYQ_lq5dcvM
এটি যুক্তিযুক্ত হতে পারে যে ফার্মওয়্যারগুলি ওএস থেকে পৃথকযোগ্য, এবং সেই ফার্মওয়্যারই কেবল "সত্য" বেয়ার মেটাল প্রোগ্রামিং যা করতে পারে।
এই CoreOS দেব হিসাবে এটি রাখে :
শক্ত অংশ
আপনি যখন কোনও পিসি শক্তি চালিত করেন, তখন যে চিপস চিপসেট তৈরি করে (উত্তরব্রিজ, সাউথব্রিজ এবং সুপারআইও) এখনও সঠিকভাবে আরম্ভ করা হয়নি। যদিও বিআইওএস রমটি সিপিইউ থেকে যতটা সম্ভব মুছে ফেলা হয়েছে, এটি সিপিইউ দ্বারা অ্যাক্সেসযোগ্য, কারণ এটি হ'ল, অন্যথায় সিপিইউ কার্যকর করার কোনও নির্দেশনা রাখত না। এর অর্থ এই নয় যে BIOS ROM পুরোপুরি ম্যাপ করা থাকে, সাধারণত হয় না। তবে বুট প্রক্রিয়াটি চালানোর জন্য যথেষ্ট পরিমাণে ম্যাপ করা হয়েছে। অন্য কোনও ডিভাইস, কেবল এটি ভুলে যান।
আপনি যখন কিউইএমইউ-র অধীনে কোরবুট পরিচালনা করেন, আপনি কোরিবুটের উচ্চ স্তরগুলি এবং পে-লোড দিয়ে পরীক্ষা করতে পারেন, তবে কিউইএমইউ নিম্ন স্তরের স্টার্টআপ কোডটি নিয়ে পরীক্ষার খুব কম সুযোগ দেয়। একটি জিনিসের জন্য, র্যাম শুরু থেকেই ঠিক কাজ করে।
বিআইওএসের প্রাথমিক অবস্থা পোস্ট করুন
হার্ডওয়ারের অনেকগুলি জিনিসের মতো, প্রমিতকরণ দুর্বল, এবং আপনার কোডটি যখন বায়োস-এর পরে চলতে শুরু করে তখন আপনি যে বিষয়গুলির উপর নির্ভর করবেন না তার মধ্যে একটি হল প্রাথমিক অবস্থা reg
সুতরাং নিজের পক্ষে একটি সুবিধা করুন এবং নীচের মত কিছু সূচনা কোড ব্যবহার করুন: https://stackoverflow.com/a/32509555/895245
নিবন্ধগুলি গুরুত্বপূর্ণ পার্শ্ব প্রতিক্রিয়াগুলি পছন্দ করে %ds
এবং %es
সেগুলিও রয়েছে, তাই আপনি এগুলি স্পষ্টভাবে ব্যবহার না করেও আপনার এগুলি শূন্য করা উচিত।
মনে রাখবেন যে কিছু ইমুলেটরগুলি সত্যিকারের হার্ডওয়্যার থেকে ভাল, এবং আপনাকে একটি দুর্দান্ত প্রাথমিক অবস্থা দেয়। তারপরে আপনি যখন সত্যিকারের হার্ডওয়্যারটিতে চলে যান, তখন সমস্ত কিছু ব্রেক হয়ে যায়।
GNU GRUB মাল্টি বুট oot
বুট সেক্টরগুলি সহজ, তবে সেগুলি খুব সুবিধাজনক নয়:
- আপনার প্রতি ডিস্কে একটি ওএস থাকতে পারে
- লোড কোডটি সত্যই ছোট হতে হবে এবং 512 বাইটে ফিট করতে হবে। এটি 0x13 বিআইওএস কল দিয়ে সমাধান করা যেতে পারে ।
- সুরক্ষিত মোডে যাওয়ার মতো আপনাকে নিজেকে প্রচুর স্টার্টআপ করতে হবে
এই কারণগুলির জন্যই জিএনইউ গ্রুব মাল্টি বুট নামে একটি আরও সুবিধাজনক ফাইল ফর্ম্যাট তৈরি করেছে।
সর্বনিম্ন কাজের উদাহরণ: https://github.com/cirosantilli/x86-bare-metal-example/tree/d217b180be4220a0b4a453f31275d38e697a99e0/multboot/hello-world
আমি এটি আমার গিটহাবের উদাহরণগুলিতেও ব্যবহার করে ইউএসবি এক মিলিয়ন বার না বার করে রিয়েল হার্ডওয়ারে সমস্ত উদাহরণ সহজেই চালাতে সক্ষম হতে পারি। কিউইএমইউতে এটি দেখতে এটির মতো দেখাচ্ছে:
আপনি যদি ওএসটিকে মাল্টি বুট ফাইল হিসাবে প্রস্তুত করেন, তবে GRUB এটি একটি নিয়মিত ফাইল সিস্টেমের মধ্যে এটি সন্ধান করতে সক্ষম হয়।
এটি বেশিরভাগ ডিস্ট্রোজই করে যা ওএস চিত্রগুলি নীচে রাখে /boot
।
মাল্টিবুট ফাইলগুলি মূলত একটি বিশেষ শিরোনামযুক্ত একটি ELF ফাইল। এগুলি GRUB দ্বারা এখানে নির্দিষ্ট করা হয়েছে: https://www.gnu.org/software/grub/manual/multboot/m Multiboot.html
আপনি একটি মাল্টি বুট ফাইল বুটযোগ্য ডিস্কে রূপান্তর করতে পারেন grub-mkrescue
।
এল টরিটো
ফর্ম্যাট যা সিডিতে পোড়া যায়: https://en.wikedia.org/wiki/El_Torito_%28CD-ROM_standard%29
আইএসও বা ইউএসবি উভয় ক্ষেত্রেই কাজ করে এমন একটি হাইব্রিড চিত্র তৈরি করা সম্ভব। এটি grub-mkrescue
( উদাহরণস্বরূপ ) দিয়ে করা যায় এবং লিনাক্স কার্নেল make isoimage
ব্যবহার করেও এটি করা যায় isohybrid
।
সম্পদ