برنامه نویسی

پروژه بوت لودر x86 ساده – انجمن DEV

Summarize this content to 400 words in Persian Lang

فهرست مطالب

مقدمه
پیش نیازها
کد بوت لودر
توضیح کد
جریان بوت لودر
ساخت بوت لودر
تست بوت لودر
عیب یابی
یادگیری بیشتر
نتیجه گیری

مقدمه

این پروژه نحوه ایجاد یک بوت لودر ساده با استفاده از زبان اسمبلی x86 را نشان می دهد. بوت لودر هنگام اجرا، پیام “Hello World I am vivek” را روی صفحه نمایش می دهد. این به عنوان یک ابزار آموزشی برای درک اصول اولیه نحوه بوت شدن رایانه و نحوه نوشتن کدهای سطح پایین که مستقیماً با سخت افزار در تعامل است عمل می کند.

پیش نیازها

برای کار با این پروژه، شما نیاز دارید:

درک اولیه مفاهیم زبان اسمبلی
اسمبلر x86 (مانند NASM یا GNU Assembler)
یک پیوند دهنده (مانند ld)
یک ابزار مجازی سازی (مانند QEMU) یا یک ماشین فیزیکی برای آزمایش بوت لودر
یک ویرایشگر متن برای نوشتن کد
یک پوسته سازگار با bash (برای سیستم‌های یونیکس مانند) یا معادل آن برای ویندوز

کد بوت لودر

کد زیر را در فایلی به نام ذخیره کنید sample_bootable.s:

.code16
.global init

init:
mov $string, %si
mov $0xe, %ah

print:
lodsb
cmp $0, %al
je end
int $0x10
jmp print

end:
hlt

string: .asciz “Hello World I am vivek”

.fill 510-(.-init), 1, 0
.word 0xaa55

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

توضیح کد

بیایید هر قسمت از کد را تجزیه کنیم:

.code16: این دستورالعمل به اسمبلر می گوید که کد 16 بیتی تولید کند، این همان چیزی است که BIOS هنگام راه اندازی برای اولین بار انتظار دارد.
.global init: این باعث می شود init برچسب در سطح جهانی قابل مشاهده است، که برای پیوند دهنده مهم است.
init:: این برچسب نقطه ورود برنامه ما را مشخص می کند.
mov $string, %si: این آدرس رشته ما را در رجیستر SI (شاخص منبع) بارگیری می کند.
mov $0xe, %ah: این رجیستر AH را روی 0xe تنظیم می کند که تابع خروجی BIOS teletype است.
print:: این برچسب شروع حلقه چاپ ما را نشان می دهد.
lodsb: این یک بایت از آدرس در SI به AL بار می کند و SI را افزایش می دهد.
cmp $0, %al: این بایت بارگذاری شده را با 0 (ترمیناتور رشته ما) مقایسه می کند.
je end: اگر بایت 0 باشد به برچسب انتهایی می پریم.
int $0x10: این وقفه BIOS 0x10 را فراخوانی می کند که کاراکتر را در AL چاپ می کند.
jmp print: برای پردازش کاراکتر بعدی به برچسب چاپ برمی گردد.
end: hlt: این کار CPU را پس از اتمام چاپ متوقف می کند.
string: .asciz “Hello World I am vivek”: این رشته تهی ما را تعریف می کند.
.fill 510-(.-init), 1, 0: این بوت لودر ما را با صفر به 510 بایت می رساند.
.word 0xaa55: این امضای بوت است که BIOS به دنبال آن است تا مشخص کند آیا یک بخش قابل بوت است یا خیر.

جریان بوت لودر

BIOS بوت لودر ما را در آدرس 0x7C00 در حافظه بارگذاری می کند.
کد ما رجیستر SI را تنظیم می کند تا به رشته ما اشاره کند.
یک حلقه وارد می کنیم که هر کاراکتر رشته را چاپ می کند:

بارگذاری یک کاراکتر
بررسی کنید که آیا انتهای رشته است یا خیر (نابودگر تهی)
اگر نه، آن را پرینت بگیرید و ادامه دهید

پس از چاپ کل رشته، CPU را متوقف می کنیم.

ساخت بوت لودر

برای ساختن بوت لودر، از یک اسکریپت bash استفاده می کنیم که کد را جمع آوری می کند، آن را پیوند می دهد و برای اجرا آماده می کند. اسکریپت زیر را به عنوان ذخیره کنید build_bootloader.sh:

#!/usr/bin/env bash
as sample_bootable.s -o sample_bootable.o
ld -o boot.bin –oformat binary -e init -Ttext 0x7c00 -o boot.bin sample_bootable.o
rm sample_bootable.o
echo “execute command :- qemu-system-x86_64 boot.bin ”

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در اینجا چیزی است که هر خط انجام می دهد:

as sample_bootable.s -o sample_bootable.o: فایل منبع ما را در یک فایل شی جمع می کند.

ld -o boot.bin –oformat binary -e init -Ttext 0x7c00 -o boot.bin sample_bootable.o: فایل شی را به یک باینری مسطح پیوند می دهد:

–oformat binary: یک فایل باینری مسطح را خروجی می دهد.

-e init: نقطه ورود را روی ما تنظیم می کند init برچسب.

-Ttext 0x7c00: آدرس شروع را روی 0x7c00 قرار می دهد، جایی که BIOS بوت لودر را بارگذاری می کند.

rm sample_bootable.o: فایل شی میانی را حذف می کند.
دستور echo به شما یادآوری می کند که چگونه بوت لودر را در QEMU اجرا کنید.

اسکریپت را قابل اجرا کرده و اجرا کنید:

chmod +x build_bootloader.sh
./build_bootloader.sh

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این شما را ایجاد می کند boot.bin فایل، که تصویر قابل بوت شما است.

تست بوت لودر

می توانید بوت لودر خود را با استفاده از QEMU تست کنید:

qemu-system-x86_64 boot.bin

وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

با این کار QEMU شروع می شود، بوت لودر شما بارگیری می شود و باید پیام خود را با عنوان “Hello World I am vivek” روی صفحه چاپ شده ببینید.

عیب یابی

اگر با مشکلاتی مواجه شدید:

مطمئن شوید اسمبلر و لینکر شما به درستی نصب شده اند.
بررسی کنید که مسیرهای فایل در اسکریپت ساخت با ساختار دایرکتوری شما مطابقت داشته باشد.
بررسی کنید که QEMU به درستی روی سیستم شما نصب شده باشد.
اگر پیام ظاهر نشد، کد اسمبلی خود را از نظر غلط املایی دوباره بررسی کنید.

یادگیری بیشتر

برای گسترش دانش خود در مورد بوت لودرها و برنامه نویسی سطح پایین:

پیام را تغییر دهید یا عملکردهای بیشتری به بوت لودر اضافه کنید.
درباره بارگذاری برنامه های بزرگتر از دیسک بیاموزید.
نحوه انتقال بوت لودرهای واقعی از حالت واقعی 16 بیتی به حالت محافظت شده 32 بیتی را مطالعه کنید.
بوت لودرهای سازگار با چند بوت را برای بارگیری سیستم عامل های مدرن کاوش کنید.
بوت لودرهای UEFI (رابط سفت‌افزار توسعه‌پذیر یکپارچه) را برای سیستم‌های جدیدتر بررسی کنید.

نتیجه گیری

تبریک می گویم! شما یک بوت لودر ساده ایجاد کرده اید که پیامی را روی صفحه نمایش می دهد. این پروژه اصول اولیه نحوه راه اندازی کامپیوتر و نحوه اجرای کدهای خود را در همان ابتدای فرآیند بوت نشان می دهد. در حالی که این بوت لودر ساده است، پایه و اساس درک فرآیندهای بوت پیچیده تر مورد استفاده در سیستم های دنیای واقعی را تشکیل می دهد.

به یاد داشته باشید، کار با بوت لودرها به این معنی است که شما در سطح بسیار پایینی کار می کنید. همیشه در ماشین مجازی تست کنید تا از آسیب احتمالی به بخش بوت کامپیوتر خود جلوگیری کنید.

کدنویسی و کاوش در دنیای جذاب برنامه نویسی سطح پایین مبارک!

مخزن github: https://github.com/Vivx701/simple_bootable

فهرست مطالب

  1. مقدمه
  2. پیش نیازها
  3. کد بوت لودر
  4. توضیح کد
  5. جریان بوت لودر
  6. ساخت بوت لودر
  7. تست بوت لودر
  8. عیب یابی
  9. یادگیری بیشتر
  10. نتیجه گیری

مقدمه

این پروژه نحوه ایجاد یک بوت لودر ساده با استفاده از زبان اسمبلی x86 را نشان می دهد. بوت لودر هنگام اجرا، پیام “Hello World I am vivek” را روی صفحه نمایش می دهد. این به عنوان یک ابزار آموزشی برای درک اصول اولیه نحوه بوت شدن رایانه و نحوه نوشتن کدهای سطح پایین که مستقیماً با سخت افزار در تعامل است عمل می کند.

پیش نیازها

برای کار با این پروژه، شما نیاز دارید:

  • درک اولیه مفاهیم زبان اسمبلی
  • اسمبلر x86 (مانند NASM یا GNU Assembler)
  • یک پیوند دهنده (مانند ld)
  • یک ابزار مجازی سازی (مانند QEMU) یا یک ماشین فیزیکی برای آزمایش بوت لودر
  • یک ویرایشگر متن برای نوشتن کد
  • یک پوسته سازگار با bash (برای سیستم‌های یونیکس مانند) یا معادل آن برای ویندوز

کد بوت لودر

کد زیر را در فایلی به نام ذخیره کنید sample_bootable.s:

.code16
.global init

init:
   mov $string, %si
   mov $0xe, %ah

print:
   lodsb
   cmp $0, %al
   je end
   int $0x10
   jmp print

end:
   hlt

string: .asciz "Hello World I am vivek"

.fill 510-(.-init), 1, 0
.word 0xaa55
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

توضیح کد

بیایید هر قسمت از کد را تجزیه کنیم:

  1. .code16: این دستورالعمل به اسمبلر می گوید که کد 16 بیتی تولید کند، این همان چیزی است که BIOS هنگام راه اندازی برای اولین بار انتظار دارد.

  2. .global init: این باعث می شود init برچسب در سطح جهانی قابل مشاهده است، که برای پیوند دهنده مهم است.

  3. init:: این برچسب نقطه ورود برنامه ما را مشخص می کند.

  4. mov $string, %si: این آدرس رشته ما را در رجیستر SI (شاخص منبع) بارگیری می کند.

  5. mov $0xe, %ah: این رجیستر AH را روی 0xe تنظیم می کند که تابع خروجی BIOS teletype است.

  6. print:: این برچسب شروع حلقه چاپ ما را نشان می دهد.

  7. lodsb: این یک بایت از آدرس در SI به AL بار می کند و SI را افزایش می دهد.

  8. cmp $0, %al: این بایت بارگذاری شده را با 0 (ترمیناتور رشته ما) مقایسه می کند.

  9. je end: اگر بایت 0 باشد به برچسب انتهایی می پریم.

  10. int $0x10: این وقفه BIOS 0x10 را فراخوانی می کند که کاراکتر را در AL چاپ می کند.

  11. jmp print: برای پردازش کاراکتر بعدی به برچسب چاپ برمی گردد.

  12. end: hlt: این کار CPU را پس از اتمام چاپ متوقف می کند.

  13. string: .asciz "Hello World I am vivek": این رشته تهی ما را تعریف می کند.

  14. .fill 510-(.-init), 1, 0: این بوت لودر ما را با صفر به 510 بایت می رساند.

  15. .word 0xaa55: این امضای بوت است که BIOS به دنبال آن است تا مشخص کند آیا یک بخش قابل بوت است یا خیر.

جریان بوت لودر

  1. BIOS بوت لودر ما را در آدرس 0x7C00 در حافظه بارگذاری می کند.
  2. کد ما رجیستر SI را تنظیم می کند تا به رشته ما اشاره کند.
  3. یک حلقه وارد می کنیم که هر کاراکتر رشته را چاپ می کند:
    • بارگذاری یک کاراکتر
    • بررسی کنید که آیا انتهای رشته است یا خیر (نابودگر تهی)
    • اگر نه، آن را پرینت بگیرید و ادامه دهید
  4. پس از چاپ کل رشته، CPU را متوقف می کنیم.

ساخت بوت لودر

برای ساختن بوت لودر، از یک اسکریپت bash استفاده می کنیم که کد را جمع آوری می کند، آن را پیوند می دهد و برای اجرا آماده می کند. اسکریپت زیر را به عنوان ذخیره کنید build_bootloader.sh:

#!/usr/bin/env bash 
as sample_bootable.s -o sample_bootable.o
ld -o boot.bin --oformat binary -e init -Ttext 0x7c00 -o boot.bin sample_bootable.o
rm sample_bootable.o
echo "execute command  :- qemu-system-x86_64 boot.bin "
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

در اینجا چیزی است که هر خط انجام می دهد:

  1. as sample_bootable.s -o sample_bootable.o: فایل منبع ما را در یک فایل شی جمع می کند.
  2. ld -o boot.bin --oformat binary -e init -Ttext 0x7c00 -o boot.bin sample_bootable.o: فایل شی را به یک باینری مسطح پیوند می دهد:

    • --oformat binary: یک فایل باینری مسطح را خروجی می دهد.
    • -e init: نقطه ورود را روی ما تنظیم می کند init برچسب.
    • -Ttext 0x7c00: آدرس شروع را روی 0x7c00 قرار می دهد، جایی که BIOS بوت لودر را بارگذاری می کند.
  3. rm sample_bootable.o: فایل شی میانی را حذف می کند.
  4. دستور echo به شما یادآوری می کند که چگونه بوت لودر را در QEMU اجرا کنید.

اسکریپت را قابل اجرا کرده و اجرا کنید:

chmod +x build_bootloader.sh
./build_bootloader.sh
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

این شما را ایجاد می کند boot.bin فایل، که تصویر قابل بوت شما است.

تست بوت لودر

می توانید بوت لودر خود را با استفاده از QEMU تست کنید:

qemu-system-x86_64 boot.bin
وارد حالت تمام صفحه شوید

از حالت تمام صفحه خارج شوید

با این کار QEMU شروع می شود، بوت لودر شما بارگیری می شود و باید پیام خود را با عنوان “Hello World I am vivek” روی صفحه چاپ شده ببینید.

عیب یابی

اگر با مشکلاتی مواجه شدید:

  1. مطمئن شوید اسمبلر و لینکر شما به درستی نصب شده اند.
  2. بررسی کنید که مسیرهای فایل در اسکریپت ساخت با ساختار دایرکتوری شما مطابقت داشته باشد.
  3. بررسی کنید که QEMU به درستی روی سیستم شما نصب شده باشد.
  4. اگر پیام ظاهر نشد، کد اسمبلی خود را از نظر غلط املایی دوباره بررسی کنید.

یادگیری بیشتر

برای گسترش دانش خود در مورد بوت لودرها و برنامه نویسی سطح پایین:

  1. پیام را تغییر دهید یا عملکردهای بیشتری به بوت لودر اضافه کنید.
  2. درباره بارگذاری برنامه های بزرگتر از دیسک بیاموزید.
  3. نحوه انتقال بوت لودرهای واقعی از حالت واقعی 16 بیتی به حالت محافظت شده 32 بیتی را مطالعه کنید.
  4. بوت لودرهای سازگار با چند بوت را برای بارگیری سیستم عامل های مدرن کاوش کنید.
  5. بوت لودرهای UEFI (رابط سفت‌افزار توسعه‌پذیر یکپارچه) را برای سیستم‌های جدیدتر بررسی کنید.

نتیجه گیری

تبریک می گویم! شما یک بوت لودر ساده ایجاد کرده اید که پیامی را روی صفحه نمایش می دهد. این پروژه اصول اولیه نحوه راه اندازی کامپیوتر و نحوه اجرای کدهای خود را در همان ابتدای فرآیند بوت نشان می دهد. در حالی که این بوت لودر ساده است، پایه و اساس درک فرآیندهای بوت پیچیده تر مورد استفاده در سیستم های دنیای واقعی را تشکیل می دهد.

به یاد داشته باشید، کار با بوت لودرها به این معنی است که شما در سطح بسیار پایینی کار می کنید. همیشه در ماشین مجازی تست کنید تا از آسیب احتمالی به بخش بوت کامپیوتر خود جلوگیری کنید.

کدنویسی و کاوش در دنیای جذاب برنامه نویسی سطح پایین مبارک!

مخزن github: https://github.com/Vivx701/simple_bootable

نوشته های مشابه

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *

دکمه بازگشت به بالا