অপারেটিং সিস্টেমটি না চালিয়ে আপনি কীভাবে কোনও প্রোগ্রাম চালাবেন? আপনি কি এমন সংসদীয় প্রোগ্রাম তৈরি করতে পারেন যা কম্পিউটার শুরুতে লোড এবং চালাতে পারে, যেমন একটি ফ্ল্যাশ ড্রাইভ থেকে কম্পিউটার বুট করে এবং এটি সিপিইউতে থাকা প্রোগ্রামটি চালায়?
অপারেটিং সিস্টেমটি না চালিয়ে আপনি কীভাবে কোনও প্রোগ্রাম চালাবেন? আপনি কি এমন সংসদীয় প্রোগ্রাম তৈরি করতে পারেন যা কম্পিউটার শুরুতে লোড এবং চালাতে পারে, যেমন একটি ফ্ল্যাশ ড্রাইভ থেকে কম্পিউটার বুট করে এবং এটি সিপিইউতে থাকা প্রোগ্রামটি চালায়?
উত্তর:
অপারেটিং সিস্টেমটি না চালিয়ে আপনি কীভাবে কোনও প্রোগ্রাম চালাবেন?
আপনি আপনার বাইনারি কোডটি এমন জায়গায় রেখেছেন যেখানে প্রসেসর রিবুট করার পরে দেখায় (যেমন ঠিকানাটি এআরএম-তে 0)।
আপনি কি এমন সংসদীয় প্রোগ্রাম তৈরি করতে পারেন যা কম্পিউটার প্রারম্ভকালে লোড এবং চালাতে পারে (যেমন কোনও ফ্ল্যাশ ড্রাইভ থেকে কম্পিউটার বুট করে এবং এটি ড্রাইভে থাকা প্রোগ্রামটি চালায়)?
প্রশ্নের সাধারণ উত্তর: এটি করা যেতে পারে। এটি প্রায়শই "বেয়ার মেটাল প্রোগ্রামিং" হিসাবে পরিচিত। ফ্ল্যাশ ড্রাইভ থেকে পড়তে, আপনি ইউএসবি কী তা জানতে চান এবং এই ইউএসবি দিয়ে কোনও ড্রাইভার কাজ করতে চান। এই ড্রাইভের প্রোগ্রামটি কোনও নির্দিষ্ট ফাইল সিস্টেমেও কিছু নির্দিষ্ট ফর্ম্যাটে থাকতে হবে ... এটি এমন কিছু যা বুট লোডার সাধারণত করে থাকে তবে আপনার প্রোগ্রামটির নিজস্ব বুটলোডার অন্তর্ভুক্ত থাকতে পারে তাই এটি স্বয়ংসম্পূর্ণ, যদি ফার্মওয়্যার কেবলমাত্র কোডের একটি ছোট ব্লক লোড করুন।
অনেক এআরএম বোর্ড আপনাকে সেই কয়েকটি কাজ করতে দেয়। বেসিক সেটআপে আপনাকে সহায়তা করতে কারও কারও কাছে বুট লোডার রয়েছে।
এখানে আপনি কীভাবে রাস্পবেরি পাইতে বেসিক অপারেটিং সিস্টেম করবেন সে সম্পর্কে একটি দুর্দান্ত টিউটোরিয়াল পেতে পারেন।
সম্পাদনা করুন: এই নিবন্ধটি এবং পুরো wiki.osdev.org আপনার বেশিরভাগ প্রশ্নকে http://wiki.osdev.org/ পরিচয় দেবে
এছাড়াও, আপনি যদি হার্ডওয়্যারটিতে সরাসরি পরীক্ষা করতে না চান, আপনি এটি কেমু জাতীয় হাইপারভাইজার ব্যবহার করে ভার্চুয়াল মেশিন হিসাবে চালাতে পারেন। কিভাবে ভার্চুয়ালাইজ করা এআরএম হার্ডওয়্যারে "ওহে দুনিয়া" সরাসরি চালানোর জন্য দেখুন এখানে ।
চলমান উদাহরণ
আসুন কয়েকটি অপ্রয়োজনীয় বেয়ার মেটাল হ্যালো ওয়ার্ল্ড প্রোগ্রামগুলি তৈরি এবং পরিচালনা করি যা কোনও ওএস ছাড়াই চালু থাকে:
আমরা তাদের যথাসম্ভব কিউইএমইউ এমুলেটরটিতে চেষ্টা করে দেখব, কারণ এটি নিরাপদ এবং উন্নয়নের পক্ষে আরও সুবিধাজনক। কিউইএমইউ পরীক্ষাগুলি একটি উবুন্টু 18.04 হোস্টে প্রাক-প্যাকেজযুক্ত কিউইএমইউ 2.11.1 এর সাথে রয়েছে।
নীচে এবং আরও অনেক x86 উদাহরণের কোড এই গিটহাব রেপোতে উপস্থিত রয়েছে ।
X86 রিয়েল হার্ডওয়ারে উদাহরণগুলি কীভাবে চালানো যায়
মনে রাখবেন যে সত্যিকারের হার্ডওয়্যারটিতে চলমান উদাহরণগুলি বিপজ্জনক হতে পারে, উদাহরণস্বরূপ আপনি ভুলভাবে নিজের ডিস্কটি মুছে ফেলতে বা হার্ডওয়্যারটি ইট করতে পারেন: কেবল পুরানো মেশিনে এটি করুন যাতে সমালোচনামূলক ডেটা থাকে না! বা আরও ভাল, সস্তা রাস্পবেরি পাই হিসাবে আধা-নিষ্পত্তিযোগ্য ডেভবোর্ডগুলি ব্যবহার করুন, নীচের এআরএম উদাহরণ দেখুন example
একটি সাধারণ x86 ল্যাপটপের জন্য আপনাকে এমন কিছু করতে হবে:
ছবিটি একটি ইউএসবি স্টিকে পোড়াও (আপনার ডেটা ধ্বংস করবে!):
sudo dd if=main.img of=/dev/sdX
একটি কম্পিউটারে ইউএসবি প্লাগ করুন
এটি চালু কর
এটি ইউএসবি থেকে বুট করতে বলুন।
এর অর্থ হার্ডডিস্কের আগে ফার্মওয়্যারটিকে ইউএসবি বাছাই করা।
যদি এটি আপনার মেশিনের ডিফল্ট আচরণ না হয় তবে পাওয়ার-অনের পরে এন্টার, এফ 12, ইএসসি বা এ জাতীয় অন্যান্য অদ্ভুত কীগুলি চাপুন যতক্ষণ না আপনি কোনও বুট মেনু পান যেখানে আপনি ইউএসবি থেকে বুট করতে পারবেন।
প্রায়শই এই মেনুগুলিতে অনুসন্ধানের অর্ডারটি কনফিগার করা সম্ভব।
উদাহরণস্বরূপ, আমার T430 এ আমি নিম্নলিখিতটি দেখতে পাচ্ছি।
চালু করার পরে, বুট মেনুতে প্রবেশ করতে আমাকে এন্টার টিপতে হবে:
তারপরে, বুট ডিভাইস হিসাবে ইউএসবি নির্বাচন করতে আমাকে এফ 12 টিপতে হবে:
সেখান থেকে, আমি ইউএসবিটিকে বুট ডিভাইস হিসাবে এটি নির্বাচন করতে পারি:
বিকল্পভাবে, বুট অর্ডার পরিবর্তন করতে এবং ইউএসবিটিকে উচ্চতর প্রাধান্য পেতে বেছে নেওয়ার জন্য আমাকে প্রতিবার ম্যানুয়ালি এটি নির্বাচন করতে হবে না, আমি "স্টার্টআপ বিঘ্নিত মেনু" স্ক্রিনে এফ 1 টি চাপব এবং তারপরে নেভিগেট করব:
বুট সেক্টর
X86-এ, আপনি যে সাধারণ এবং নিম্নতম স্তরের কাজটি করতে পারেন তা হ'ল একটি ধরণের বুট সেক্টর যা একটি মাস্টার বুট সেক্টর (এমবিআর) তৈরি করা এবং তারপরে এটি একটি ডিস্কে ইনস্টল করা।
এখানে আমরা একটি printf
কল দিয়ে একটি তৈরি করি :
printf '\364%509s\125\252' > main.img
sudo apt-get install qemu-system-x86
qemu-system-x86_64 -hda main.img
ফলাফল:
মনে রাখবেন যে কিছু না করেও কিছু চরিত্র ইতিমধ্যে পর্দায় মুদ্রিত হয়েছে। এগুলি ফার্মওয়্যার দ্বারা মুদ্রিত হয় এবং সিস্টেমটি সনাক্ত করতে পরিবেশন করে।
এবং T430 এ আমরা কেবল একটি ঝলকানো কার্সর সহ একটি ফাঁকা স্ক্রিন পেয়েছি:
main.img
নিম্নলিখিত রয়েছে:
\364
অক্টাল == 0xf4
হেক্সে: একটি hlt
নির্দেশিকার জন্য এনকোডিং , যা সিপিইউকে কাজ বন্ধ করতে বলে।
অতএব আমাদের প্রোগ্রামটি কিছু করবে না: কেবল শুরু করুন এবং বন্ধ করুন।
আমরা অষ্টাল ব্যবহার করি কারণ \x
হেক্স নম্বরগুলি পসিক্স দ্বারা নির্দিষ্ট করা হয়নি।
আমরা সহজেই এই এনকোডিংটি পেতে পারি:
echo hlt > a.S
as -o a.o a.S
objdump -S a.o
কোন ফলাফল:
a.o: file format elf64-x86-64
Disassembly of section .text:
0000000000000000 <.text>:
0: f4 hlt
তবে এটি অবশ্যই ইন্টেল ম্যানুয়ালটিতে নথিভুক্ত করা হয়েছে।
%509s
509 স্পেস উত্পাদন। 510 বাইট না হওয়া পর্যন্ত ফাইলটি পূরণ করা দরকার।
\125\252
ইন অষ্টাল == এর 0x55
পরে 0xaa
।
এটি 2 প্রয়োজনীয় ম্যাজিক বাইট যা 511 এবং 512 বাইট হতে হবে।
BIOS আমাদের সমস্ত ডিস্কগুলি বুটযোগ্যযোগ্যগুলির জন্য অনুসন্ধান করে এবং এটি কেবলমাত্র সেই দুটি যাদু বাইটযুক্ত বুটযোগ্যকে বিবেচনা করে।
উপস্থিত না থাকলে, হার্ডওয়্যার এটি বুটযোগ্য ডিস্ক হিসাবে বিবেচনা করবে না।
আপনি যদি printf
মাস্টার না হন তবে এর লিখিত সামগ্রীগুলি নিশ্চিত করতে পারেন main.img
:
hd main.img
যা প্রত্যাশিত দেখায়:
00000000 f4 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 |. |
00000010 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 | |
*
000001f0 20 20 20 20 20 20 20 20 20 20 20 20 20 20 55 aa | U.|
00000200
যেখানে 20
ASCII তে একটি স্থান রয়েছে।
বিআইওএস ফার্মওয়্যার ডিস্ক থেকে এই 512 বাইটগুলি পড়ে, এগুলিকে মেমোরিতে রাখে এবং তাদের সম্পাদন শুরু করার জন্য পিসিকে প্রথম বাইটে সেট করে।
হ্যালো ওয়ার্ল্ড বুট সেক্টর
এখন যেহেতু আমরা একটি ন্যূনতম প্রোগ্রাম তৈরি করেছি, আসুন হ্যালো ওয়ার্ল্ডে চলে আসি।
সুস্পষ্ট প্রশ্ন হ'ল আইও কিভাবে করবেন? কয়েকটি বিকল্প:
ফার্মওয়্যার, যেমন 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
{
/* The BIOS loads the code from the disk to this location.
* We must tell that to the linker so that it can properly
* calculate the addresses of symbols we might jump to.
*/
. = 0x7c00;
.text :
{
__start = .;
*(.text)
/* Place the magic boot bytes at the end of the first 512 sector. */
. = 0x1FE;
SHORT(0xAA55)
}
}
জমা দিন এবং এর সাথে লিঙ্ক করুন:
as -g -o main.o main.S
ld --oformat binary -o main.img -T link.ld main.o
qemu-system-x86_64 -hda main.img
ফলাফল:
এবং T430 এ:
পরীক্ষিত: লেনোভো থিঙ্কপ্যাড টি 430, ইউইএফআই বিআইওএস 1.16। একটি উবুন্টু 18.04 হোস্টে ডিস্ক উত্পন্ন।
স্ট্যান্ডার্ড ইউজারল্যান্ড অ্যাসেমব্লিং নির্দেশাবলী ছাড়াও আমাদের রয়েছে:
.code16
: জিএএসকে 16-বিট কোড আউটপুট করতে বলে
cli
: সফ্টওয়্যার বিঘ্ন অক্ষম করুন। এগুলি প্রসেসরের পরে আবার চালানো শুরু করতে পারেhlt
int $0x10
: একটি বায়োএস কল করে। একে একে একে অক্ষর মুদ্রণ করে।
গুরুত্বপূর্ণ লিঙ্ক পতাকাগুলি হল:
--oformat binary
: আউটপুট কাঁচা বাইনারি সমাবেশ কোড, কোনও ELF ফাইলের মধ্যে এটি মোড়ানো করবেন না যেমন নিয়মিত ইউজারল্যান্ড এক্সিকিউটেবলের ক্ষেত্রে হয়।লিঙ্কার স্ক্রিপ্ট অংশটি আরও ভালভাবে বুঝতে, সংযোগের স্থানান্তরের পদক্ষেপের সাথে নিজেকে পরিচিত করুন: লিঙ্কাররা কী করে?
কুলার x86 খালি ধাতু প্রোগ্রাম
আমি অর্জন করেছি এমন আরও কয়েকটি জটিল খালি ধাতব সেটআপ রয়েছে:
সমাবেশের পরিবর্তে সি ব্যবহার করুন
সংক্ষিপ্তসার: GRUB মাল্টবুট ব্যবহার করুন, যা আপনার বিরক্তিকর সমস্যার সমাধান করবে you নীচের বিভাগটি দেখুন।
এক্স ৮86-এর প্রধান অসুবিধাটি হ'ল বিআইওএস কেবল ডিস্ক থেকে মেমোরিতে 512 বাইট লোড করে এবং সি ব্যবহার করার সময় আপনি সম্ভবত 512 বাইট উড়িয়ে দেবেন!
এটি সমাধান করার জন্য, আমরা একটি দ্বি-পর্যায়ে বুটলোডার ব্যবহার করতে পারি । এটি আরও বিআইওএস কলগুলি করে, যা ডিস্ক থেকে মেমরিতে আরও বাইট লোড করে। ইন্ট 0x13 বিআইওএস কলগুলি ব্যবহার করে স্ক্র্যাচ থেকে একটি ন্যূনতম পর্যায়ে 2 বিধানসভা উদাহরণ :
বিকল্পভাবে:
-kernel
বিকল্পটি ব্যবহার করুন , যা একটি সম্পূর্ণ ইএলএফ ফাইলকে মেমরিতে লোড করে। আমি সেই পদ্ধতিটি দিয়ে তৈরি করেছি এমন একটি আর্মের উদাহরণ এখানে ।kernel7.img
, অনেক মত ও QEMU -kernel
আছে।কেবলমাত্র শিক্ষামূলক উদ্দেশ্যে, এখানে একটি এক পর্যায়ে ন্যূনতম সি উদাহরণ রয়েছে :
main.c
void main(void) {
int i;
char s[] = {'h', 'e', 'l', 'l', 'o', ' ', 'w', 'o', 'r', 'l', 'd'};
for (i = 0; i < sizeof(s); ++i) {
__asm__ (
"int $0x10" : : "a" ((0x0e << 8) | s[i])
);
}
while (1) {
__asm__ ("hlt");
};
}
entry.S
.code16
.text
.global mystart
mystart:
ljmp $0, $.setcs
.setcs:
xor %ax, %ax
mov %ax, %ds
mov %ax, %es
mov %ax, %ss
mov $__stack_top, %esp
cld
call main
linker.ld
ENTRY(mystart)
SECTIONS
{
. = 0x7c00;
.text : {
entry.o(.text)
*(.text)
*(.data)
*(.rodata)
__bss_start = .;
/* COMMON vs BSS: /programming/16835716/bss-vs-common-what-goes-where */
*(.bss)
*(COMMON)
__bss_end = .;
}
/* /programming/53584666/why-does-gnu-ld-include-a-section-that-does-not-appear-in-the-linker-script */
.sig : AT(ADDR(.text) + 512 - 2)
{
SHORT(0xaa55);
}
/DISCARD/ : {
*(.eh_frame)
}
__stack_bottom = .;
. = . + 0x1000;
__stack_top = .;
}
চালান
set -eux
as -ggdb3 --32 -o entry.o entry.S
gcc -c -ggdb3 -m16 -ffreestanding -fno-PIE -nostartfiles -nostdlib -o main.o -std=c99 main.c
ld -m elf_i386 -o main.elf -T linker.ld entry.o main.o
objcopy -O binary main.elf main.img
qemu-system-x86_64 -drive file=main.img,format=raw
সি স্ট্যান্ডার্ড লাইব্রেরি
আপনি যদি সি স্ট্যান্ডার্ড লাইব্রেরিটি ব্যবহার করতে চান তবে বিষয়গুলি আরও মজাদার হয়, যেহেতু আমাদের কাছে লিনাক্স কার্নেল নেই, যা পসিক্সের মাধ্যমে সি স্ট্যান্ডার্ড লাইব্রেরি কার্যকারিতা অনেকটাই প্রয়োগ করে ।
লিনাক্সের মতো একটি সম্পূর্ণ বর্ধিত ওএসে না গিয়ে কয়েকটি সম্ভাবনার মধ্যে রয়েছে:
আপনার নিজের লিখুন। এটি শেষ পর্যন্ত কেবল একগুচ্ছ শিরোনাম এবং সি ফাইলগুলি, তাই না? রাইট ??
বিস্তারিত উদাহরণ এখানে: https : // elect इलेक्ट्रॉनिक्स. stackexchange.com/questions/223929/c-standard-libraries-on-bare-metal/223931
Newlib কার্যকরী আপনার জন্য সব বিরক্তিকর অ ওএস নির্দিষ্ট জিনিস, যেমন memcmp
, memcpy
ইত্যাদি
তারপরে, এটি আপনার নিজের প্রয়োজনীয় সাইককলগুলি বাস্তবায়নের জন্য কিছু স্টাব সরবরাহ করে।
উদাহরণস্বরূপ, আমরা exit()
এআরএমের সাথে সেমিহোস্টিংয়ের মাধ্যমে প্রয়োগ করতে পারি :
void _exit(int status) {
__asm__ __volatile__ ("mov r0, #0x18; ldr r1, =#0x20026; svc 0x00123456");
}
যেমন এই উদাহরণে দেখানো হয়েছে ।
উদাহরণস্বরূপ, আপনি ইউআআআরটিprintf
বা এআরএম সিস্টেমে পুনর্নির্দেশ করতে পারেন , বা সেমিহোস্টিংয়েরexit()
সাথে প্রয়োগ করতে পারেন ।
এম্বেড করা অপারেটিং সিস্টেমগুলি যেমন ফ্রিআরটিওএস এবং জেফির ।
এই ধরনের অপারেটিং সিস্টেমগুলি সাধারণত আপনাকে প্রাক-অভিজাত সময়সূচী বন্ধ করতে দেয়, সুতরাং আপনাকে প্রোগ্রামের রানটাইমের উপরে পুরো নিয়ন্ত্রণ দেয়।
এগুলি প্রাক-বাস্তবায়িত নিউলিবের এক ধরণের হিসাবে দেখা যেতে পারে।
জিএনইউ গ্রুব মাল্টি বুট
বুট সেক্টরগুলি সহজ, তবে সেগুলি খুব সুবিধাজনক নয়:
এই কারণগুলির জন্যই জিএনইউ গ্রুব মাল্টি বুট নামে একটি আরও সুবিধাজনক ফাইল ফর্ম্যাট তৈরি করেছে।
সর্বনিম্ন কাজের উদাহরণ: https://github.com/cirosantilli/x86-bare-metal-example/tree/d217b180be4220a0b4a453f31275d38e697a99e0/multboot/hello-world
আমি এটি আমার গিটহাবের উদাহরণগুলিতেও ব্যবহার করে ইউএসবি এক মিলিয়ন বার না বার করে রিয়েল হার্ডওয়ারে সমস্ত উদাহরণ সহজেই চালাতে সক্ষম হতে পারি।
কিউইএমইউ ফলাফল:
T430:
আপনি যদি ওএসটিকে মাল্টি বুট ফাইল হিসাবে প্রস্তুত করেন, তবে GRUB এটি নিয়মিত ফাইল সিস্টেমের মধ্যে এটি সন্ধান করতে সক্ষম হয়।
এটি বেশিরভাগ ডিস্ট্রোজই করে যা ওএস চিত্রগুলি নীচে রাখে /boot
।
মাল্টিবুট ফাইলগুলি মূলত একটি বিশেষ শিরোনামযুক্ত একটি ELF ফাইল। এগুলি GRUB দ্বারা এখানে নির্দিষ্ট করা হয়েছে: https://www.gnu.org/software/grub/manual/multboot/m Multiboot.html
আপনি একটি মাল্টি বুট ফাইল বুটযোগ্য ডিস্কে রূপান্তর করতে পারেন grub-mkrescue
।
ফার্মওয়্যার
সত্যিকার অর্থে, আপনার বুট সেক্টরটি প্রথম সফ্টওয়্যার নয় যা সিস্টেমের সিপিইউতে চলে।
আসলে যা প্রথমে চলে তা হ'ল তথাকথিত ফার্মওয়্যার যা একটি সফ্টওয়্যার:
সুপরিচিত ফার্মওয়্যারগুলির মধ্যে রয়েছে:
ফার্মওয়্যারগুলি এগুলি করে:
প্রতিটি হার্ড ডিস্ক, ইউএসবি, নেটওয়ার্ক ইত্যাদি লুপ করুন যতক্ষণ না আপনি বুটযোগ্য কিছু খুঁজে পান 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
সেগুলিও রয়েছে, সুতরাং আপনি এগুলি স্পষ্টভাবে ব্যবহার না করেও আপনার এগুলি শূন্য করা উচিত।
মনে রাখবেন যে কিছু ইমুলেটরগুলি সত্যিকারের হার্ডওয়্যার থেকে ভাল, এবং আপনাকে একটি দুর্দান্ত প্রাথমিক অবস্থা দেয়। তারপরে আপনি যখন সত্যিকারের হার্ডওয়্যারটিতে চলে যান, তখন সমস্ত কিছু ভেঙে যায়।
এল টরিটো
ফর্ম্যাট যা সিডিতে পোড়া যায়: https://en.wikedia.org/wiki/El_Torito_%28CD-ROM_standard%29
আইএসও বা ইউএসবি উভয় ক্ষেত্রেই কাজ করে এমন একটি হাইব্রিড চিত্র তৈরি করা সম্ভব। এটি grub-mkrescue
( উদাহরণস্বরূপ ) দিয়ে করা যায় এবং লিনাক্স কার্নেল make isoimage
ব্যবহার করেও এটি করা যায় isohybrid
।
এআরএম
এআরএম-এ, সাধারণ ধারণাগুলি একই রকম are
আইও-র জন্য আমাদের ব্যবহারের জন্য বিআইওএসের মতো কোনও বিস্তৃত অর্ধ-মানকৃত প্রাক-ইনস্টলড ফার্মওয়্যার নেই, সুতরাং দুটি সহজ ধরণের আইও যা আমরা করতে পারি তা হ'ল:
আমি আপলোড করেছি:
গিটহাবে এখানে কয়েকটি সাধারণ কিউইএমইউ সি + নিউলিব এবং কাঁচা সমাবেশগুলির উদাহরণ ।
Prompt.c উদাহরণ উদাহরণস্বরূপ আপনার হোস্ট টার্মিনাল থেকে ইনপুট নেয় এবং সব কৃত্রিম UART মাধ্যমে ফিরে আউটপুট দেয়:
enter a character
got: a
new alloc of 1 bytes at address 0x0x4000a1c0
enter a character
got: b
new alloc of 2 bytes at address 0x0x4000a1c0
enter a character
আরও দেখুন: খালি ধাতব এআরএম প্রোগ্রামগুলি কীভাবে তৈরি করা এবং কিউইএমইউতে সেগুলি চালানো যায়?
একটি সম্পূর্ণ স্বয়ংক্রিয়ভাবে রাস্পবেরি পাই ব্লিঙ্কার সেটআপ: https://github.com/cirosantilli/raspberry-pi-bare-metal-blinker
আরও দেখুন: রাস্পবেরি পাইতে কোনও ওএস ছাড়াই সি প্রোগ্রাম কীভাবে চালানো যায়?
কিউইএমইউতে এলইডিগুলি "দেখতে" আপনাকে ডিবাগ পতাকা সহ উত্স থেকে কিউইএমইউ সংকলন করতে হবে: /raspberrypi/56373/is-it-possible-to-get-the-state-of- -LED-এবং-gpios-ইন-এ-QEMU-এমুলেশন মত-T
এরপরে, আপনার একটি ইউআরটি হ্যালো ওয়ার্ল্ড চেষ্টা করা উচিত। আপনি ব্লিঙ্কার উদাহরণ থেকে শুরু করতে পারেন এবং এটির সাথে কার্নেলটি প্রতিস্থাপন করতে পারেন: https://github.com/dwelch67/raspberrypi/tree/bce377230c2cdd8ff1e40919fdedbc2533ef5a00/uart01
প্রথমে ইউআআআরটি রাস্পবিয়ানের সাথে কাজ করে নিন যেমনটি আমি এখানে ব্যাখ্যা করেছি: /raspberrypi/38/prepare-for-ssh-without-a-screen/54394#54394 এটি এর মতো দেখতে পাবেন:
ডান পিনগুলি ব্যবহার নিশ্চিত করে নিন, অন্যথায় আপনি আপনার ইউআরটি ইউএসবি রূপান্তরকারীতে পোড়াতে পারেন, আমি এটি ইতিমধ্যে দু'বার শর্ট সার্কিট গ্রাউন্ড এবং 5 ভি দিয়ে সম্পন্ন করেছি ...
অবশেষে এর সাথে হোস্ট থেকে সিরিয়ালের সাথে সংযুক্ত করুন:
screen /dev/ttyUSB0 115200
রাস্পবেরি পাইয়ের জন্য, আমরা আমাদের এক্সিকিউটেবল ধারণ করতে ইউএসবি স্টিকের পরিবর্তে একটি মাইক্রো এসডি কার্ড ব্যবহার করি, যার জন্য সাধারণত আপনার কম্পিউটারে সংযোগ করার জন্য আপনাকে সাধারণত অ্যাডাপ্টারের প্রয়োজন:
এখানে প্রদর্শিত হিসাবে এসডি অ্যাডাপ্টারটি আনলক করতে ভুলবেন না: /ubuntu/213889/microsd-card-is-set-to-read-only-state-how-can-i-write-data -on-এটা / 814585 # 814585
https://github.com/dwelch67/raspberrypi আজ উপলভ্য সর্বাধিক জনপ্রিয় বেয়ার মেটাল রাস্পবেরি পাই টিউটোরিয়ালের মতো দেখাচ্ছে।
X86 থেকে কিছু পার্থক্য অন্তর্ভুক্ত:
আই সরাসরি যাদু ঠিকানায় লিখে সম্পন্ন করা হয়, সেখানে নেই in
এবং out
নির্দেশাবলী।
এটাকে বলা হয় মেমরির আই ম্যাপ ।
রাস্পবেরি পাই এর মতো কিছু বাস্তব হার্ডওয়্যারের জন্য, আপনি নিজেরাই ডিস্কের ছবিতে ফার্মওয়্যার (বিআইওএস) যুক্ত করতে পারেন।
এটি একটি ভাল জিনিস, কারণ এটি ফার্মওয়্যার আপডেট করা আরও স্বচ্ছ করে তোলে।
সম্পদ
অপারেটিং সিস্টেম একটি প্রোগ্রাম , তাই আমরা কিছু করতে গোড়া থেকে তৈরি অথবা পরিবর্তন করে আমাদের নিজস্ব প্রোগ্রাম তৈরি (সীমিত বা যোগ) এক অতিরিক্ত বৈশিষ্ট্যগুলিও উপস্থিত রয়েছে ছোট অপারেটিং সিস্টেম , এবং তারপর বুট প্রক্রিয়ার সময় এটি চালানোর (একটি ব্যবহার ISO ইমেজ ) ।
উদাহরণস্বরূপ, এই পৃষ্ঠাটি একটি সূচনা পয়েন্ট হিসাবে ব্যবহার করা যেতে পারে:
কীভাবে একটি সাধারণ অপারেটিং সিস্টেম লিখবেন
এখানে, সম্পূর্ণ অপারেটিং সিস্টেমটি 512-বাইট বুট সেক্টরে ( এমবিআর ) পুরোপুরি ফিট করে !
এই জাতীয় বা অনুরূপ সাধারণ ওএস একটি সাধারণ কাঠামো তৈরি করতে ব্যবহার করা যেতে পারে যা আমাদের অনুমতি দেবে:
করতে র্যাম মধ্যে ডিস্কে বুট-লোডার লোড পরবর্তী সেক্টর, ও মৃত্যুদন্ড অব্যাহত রাখার জন্য যে বিন্দু ঝাঁপ । অথবা আপনি পারে FAT12, ফাইলসিস্টেম ফ্লপি ড্রাইভ ব্যবহার উপর পড়তে, এবং যে বাস্তবায়ন ।
তবে অনেকগুলি সম্ভাবনা রয়েছে। উদাহরণস্বরূপ একটি বৃহত্তর x86 অ্যাসেম্বলি ভাষার ওএস দেখতে আমরা মাইকিওএস , এক্স 86 অপারেটিং সিস্টেমটি অন্বেষণ করতে পারি যা ভাল 16-বিট, রিয়েল-মোড ওএসস কাজটি ভাল মন্তব্য করা কোড এবং বিস্তৃত ডকুমেন্টেশন সহ দেখানোর জন্য একটি শিখন সরঞ্জাম ।
অপারেটিং সিস্টেম ব্যতীত চালিত অন্যান্য সাধারণ ধরণের প্রোগ্রামগুলি হ'ল বুট লোডার । আমরা উদাহরণস্বরূপ এই সাইটটি ব্যবহার করে যেমন একটি ধারণা দ্বারা অনুপ্রাণিত একটি প্রোগ্রাম তৈরি করতে পারি:
আপনার নিজের বুট লোডার কীভাবে বিকাশ করবেন
উপরের নিবন্ধটি এই জাতীয় প্রোগ্রামের প্রাথমিক আর্কিটেকচারটিও উপস্থাপন করে :
- 0000: 7C00 ঠিকানার মাধ্যমে মেমোরিতে লোডিং সঠিক করুন।
- উচ্চ-স্তরের ভাষায় বিকাশযুক্ত বুটমেন ফাংশনটিকে কল করা হচ্ছে ।
- ডিসপ্লেতে "হ্যালো, ওয়ার্ল্ড ...", নিম্ন স্তরের থেকে বার্তাটি দেখান।
যেমনটি আমরা দেখতে পাচ্ছি, এই আর্কিটেকচারটি খুব নমনীয় এবং প্রয়োজনীয় কোনও বুট লোডার নয়, কোনও প্রোগ্রাম বাস্তবায়নের অনুমতি দেয় ।
বিশেষ করে, এটি কিভাবে ব্যবহার করতে দেখায় "মিশ্র কোড" কৌশল ধন্যবাদ যা সম্ভব হয় উচ্চ পর্যায়ের বাক্য একত্রিত (থেকে সি বা সি ++ ) নিম্নস্তরের কমান্ড সহ (থেকে অ্যাসেম্বলার )। এটি একটি খুব দরকারী পদ্ধতি, তবে আমাদের এটি মনে রাখতে হবে:
প্রোগ্রামটি তৈরি করতে এবং এক্সিকিউটেবল ফাইলটি পেতে আপনার 16-বিট মোডের জন্য এসেমব্লারের সংকলক এবং লিংক প্রয়োজন । সি / সি ++ এর জন্য আপনার কেবলমাত্র সংকলক প্রয়োজন যা 16-বিট মোডের জন্য অবজেক্ট ফাইল তৈরি করতে পারে ।
নিবন্ধটি কীভাবে তৈরি করা প্রোগ্রামটি কার্যক্ষমতার সাথে দেখতে হয় এবং কীভাবে এটির পরীক্ষা এবং ডিবাগ সম্পাদন করতে পারে তাও দেখায়।
উপরোক্ত উদাহরণগুলি সেক্টর এমবিআর ডেটা মিডিয়ামে লোড করার সত্যতা ব্যবহার করেছিল। যাইহোক, আমরা ইউইএফআই অ্যাপ্লিকেশনগুলির সাথে উদাহরণস্বরূপ রেখে গভীরতার গভীরে যেতে পারি :
কোনও ওএস লোড করার বাইরে, ইউইএফআই UEFI অ্যাপ্লিকেশনগুলি চালাতে পারে, যা EFI সিস্টেম পার্টিশনের ফাইল হিসাবে থাকে। এগুলি ইউইএফআই কমান্ড শেল, ফার্মওয়্যারের বুট ম্যানেজার বা অন্যান্য ইউইএফআই অ্যাপ্লিকেশন দ্বারা কার্যকর করা যেতে পারে। ইউইএফআই অ্যাপ্লিকেশনগুলি সিস্টেম প্রস্তুতকারকের স্বাধীনভাবে বিকাশ ও ইনস্টল করা যেতে পারে।
এক ধরণের UEFI অ্যাপ্লিকেশন হ'ল GRUB, rEFInd, Gummiboot, এবং Windows বুট ম্যানেজারের মতো একটি ওএস লোডার ; যা কোনও ওএস ফাইলকে মেমরিতে লোড করে এবং কার্যকর করে। এছাড়াও, একটি ওএস লোডার অন্য ইউইএফআই অ্যাপ্লিকেশন নির্বাচন চালানোর অনুমতি দিতে একটি ব্যবহারকারী ইন্টারফেস সরবরাহ করতে পারে। ইউইএফআই শেলের মতো ইউটিলিটিগুলিও ইউইএফআই অ্যাপ্লিকেশন।
যদি আমরা এই জাতীয় প্রোগ্রাম তৈরি শুরু করতে চাই , তবে আমরা উদাহরণস্বরূপ এই ওয়েবসাইটগুলি দিয়ে শুরু করতে পারি:
EFI এর জন্য প্রোগ্রামিং: একটি "হ্যালো, ওয়ার্ল্ড" প্রোগ্রাম / ইউইএফআই প্রোগ্রামিং তৈরি করা - প্রথম পদক্ষেপ
এটা সর্বজনবিদিত একটি সম্পূর্ণ গ্রুপ আছে যে ক্ষতিকারক সফ্টওয়্যার (যা প্রোগ্রাম হয়) যে অপারেটিং সিস্টেম শুরু হওয়ার আগে দৌড়াচ্ছে ।
তাদের এক বিশাল গ্রুপ শুধু সর্বোপরি সমাধান মতো উপস্থিত MBR সেক্টর বা UEFI অ্যাপ্লিকেশন কাজ, কিন্তু সেই যে যেমন অন্য এন্ট্রি পয়েন্ট ব্যবহার করেন ভলিউম বুট রেকর্ড (VBR) অথবা বায়োস :
কমপক্ষে চারটি বিআইওএস আক্রমণ ভাইরাস রয়েছে , যার মধ্যে দুটি বিক্ষোভের উদ্দেশ্যে।
বা অন্য একটি সম্ভবত।
বুটকিটস প্রুফ অফ কনসেপ্ট বিকাশ থেকে গণ বিতরণে বিবর্তিত হয়েছে এবং এখন কার্যকরভাবে ওপেন সোর্স সফ্টওয়্যার হয়ে উঠেছে ।
আমিও মনে করি যে এই প্রেক্ষাপটে এটি মূল্য উল্লেখ করে হয় আছে বুট বিভিন্ন ধরনের অপারেটিং সিস্টেম (অথবা এক্সিকিউটেবল প্রোগ্রাম এই জন্য দেয়ার উদ্দেশ্যে করা) । অনেকগুলি রয়েছে, তবে আমি নেটওয়ার্ক বুট অপশন ( পিএক্সই ) ব্যবহার করে নেটওয়ার্ক থেকে কোডটি লোড করার দিকে মনোযোগ দিতে চাই , যা আমাদের কম্পিউটারে প্রোগ্রাম পরিচালনা করতে দেয় এটির অপারেটিং সিস্টেম নির্বিশেষে এমনকি কোনও স্টোরেজ মিডিয়াম নির্বিশেষে is কম্পিউটারের সাথে সরাসরি সংযুক্ত:
নেটওয়ার্ক বুটিং (PXE) কী এবং আপনি কীভাবে এটি ব্যবহার করতে পারেন?