অপারেটিং সিস্টেম ছাড়াই কীভাবে একটি প্রোগ্রাম চালানো যায়?


239

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


4
কোন স্থাপত্যের উপরে? এক্স 86? এআরএম?
কিসিয়েল


2
হ্যাঁ ঠিক এভাবেই প্রসেসর বুট হয়। বিধানসভা হতে হবে না, সি প্রায়শই বুটস্ট্র্যাপ এবং সম্ভবত অন্য কোনও সহায়তার জন্য সামান্য কিছুটা asm ব্যবহার করা হয়।
old_timer

24
এটি ভেবে দেখুন: যদি এরকম ক্ষমতা না থাকে তবে ওএস নিজেই কীভাবে শুরু এবং চালিত হবে? :)
সেবা আলেকসেয়েভ

উত্তর:


153

অপারেটিং সিস্টেমটি না চালিয়ে আপনি কীভাবে কোনও প্রোগ্রাম চালাবেন?

আপনি আপনার বাইনারি কোডটি এমন জায়গায় রেখেছেন যেখানে প্রসেসর রিবুট করার পরে দেখায় (যেমন ঠিকানাটি এআরএম-তে 0)।

আপনি কি এমন সংসদীয় প্রোগ্রাম তৈরি করতে পারেন যা কম্পিউটার প্রারম্ভকালে লোড এবং চালাতে পারে (যেমন কোনও ফ্ল্যাশ ড্রাইভ থেকে কম্পিউটার বুট করে এবং এটি ড্রাইভে থাকা প্রোগ্রামটি চালায়)?

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

অনেক এআরএম বোর্ড আপনাকে সেই কয়েকটি কাজ করতে দেয়। বেসিক সেটআপে আপনাকে সহায়তা করতে কারও কারও কাছে বুট লোডার রয়েছে।

এখানে আপনি কীভাবে রাস্পবেরি পাইতে বেসিক অপারেটিং সিস্টেম করবেন সে সম্পর্কে একটি দুর্দান্ত টিউটোরিয়াল পেতে পারেন।

সম্পাদনা করুন: এই নিবন্ধটি এবং পুরো wiki.osdev.org আপনার বেশিরভাগ প্রশ্নকে http://wiki.osdev.org/ পরিচয় দেবে

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


723

চলমান উদাহরণ

আসুন কয়েকটি অপ্রয়োজনীয় বেয়ার মেটাল হ্যালো ওয়ার্ল্ড প্রোগ্রামগুলি তৈরি এবং পরিচালনা করি যা কোনও ওএস ছাড়াই চালু থাকে:

আমরা তাদের যথাসম্ভব কিউইএমইউ এমুলেটরটিতে চেষ্টা করে দেখব, কারণ এটি নিরাপদ এবং উন্নয়নের পক্ষে আরও সুবিধাজনক। কিউইএমইউ পরীক্ষাগুলি একটি উবুন্টু 18.04 হোস্টে প্রাক-প্যাকেজযুক্ত কিউইএমইউ 2.11.1 এর সাথে রয়েছে।

নীচে এবং আরও অনেক x86 উদাহরণের কোড এই গিটহাব রেপোতে উপস্থিত রয়েছে ।

X86 রিয়েল হার্ডওয়ারে উদাহরণগুলি কীভাবে চালানো যায়

মনে রাখবেন যে সত্যিকারের হার্ডওয়্যারটিতে চলমান উদাহরণগুলি বিপজ্জনক হতে পারে, উদাহরণস্বরূপ আপনি ভুলভাবে নিজের ডিস্কটি মুছে ফেলতে বা হার্ডওয়্যারটি ইট করতে পারেন: কেবল পুরানো মেশিনে এটি করুন যাতে সমালোচনামূলক ডেটা থাকে না! বা আরও ভাল, সস্তা রাস্পবেরি পাই হিসাবে আধা-নিষ্পত্তিযোগ্য ডেভবোর্ডগুলি ব্যবহার করুন, নীচের এআরএম উদাহরণ দেখুন example

একটি সাধারণ x86 ল্যাপটপের জন্য আপনাকে এমন কিছু করতে হবে:

  1. ছবিটি একটি ইউএসবি স্টিকে পোড়াও (আপনার ডেটা ধ্বংস করবে!):

    sudo dd if=main.img of=/dev/sdX
    
  2. একটি কম্পিউটারে ইউএসবি প্লাগ করুন

  3. এটি চালু কর

  4. এটি ইউএসবি থেকে বুট করতে বলুন।

    এর অর্থ হার্ডডিস্কের আগে ফার্মওয়্যারটিকে ইউএসবি বাছাই করা।

    যদি এটি আপনার মেশিনের ডিফল্ট আচরণ না হয় তবে পাওয়ার-অনের পরে এন্টার, এফ 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
    

    তবে এটি অবশ্যই ইন্টেল ম্যানুয়ালটিতে নথিভুক্ত করা হয়েছে।

  • %509s509 স্পেস উত্পাদন। 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

যেখানে 20ASCII তে একটি স্থান রয়েছে।

বিআইওএস ফার্মওয়্যার ডিস্ক থেকে এই 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বিকল্পটি ব্যবহার করুন , যা একটি সম্পূর্ণ ইএলএফ ফাইলকে মেমরিতে লোড করে। আমি সেই পদ্ধতিটি দিয়ে তৈরি করেছি এমন একটি আর্মের উদাহরণ এখানে
  • রাস্পবেরী Pi জন্য ডিফল্ট ফার্মওয়্যার নামে একটি ELF ফাইল থেকে আমাদের জন্য ছবি লোড যত্ন নেয় 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

সি স্ট্যান্ডার্ড লাইব্রেরি

আপনি যদি সি স্ট্যান্ডার্ড লাইব্রেরিটি ব্যবহার করতে চান তবে বিষয়গুলি আরও মজাদার হয়, যেহেতু আমাদের কাছে লিনাক্স কার্নেল নেই, যা পসিক্সের মাধ্যমে সি স্ট্যান্ডার্ড লাইব্রেরি কার্যকারিতা অনেকটাই প্রয়োগ করে ।

লিনাক্সের মতো একটি সম্পূর্ণ বর্ধিত ওএসে না গিয়ে কয়েকটি সম্ভাবনার মধ্যে রয়েছে:

  • আপনার নিজের লিখুন। এটি শেষ পর্যন্ত কেবল একগুচ্ছ শিরোনাম এবং সি ফাইলগুলি, তাই না? রাইট ??

  • Newlib

    বিস্তারিত উদাহরণ এখানে: 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() সাথে প্রয়োগ করতে পারেন

  • এম্বেড করা অপারেটিং সিস্টেমগুলি যেমন ফ্রিআরটিওএস এবং জেফির

    এই ধরনের অপারেটিং সিস্টেমগুলি সাধারণত আপনাকে প্রাক-অভিজাত সময়সূচী বন্ধ করতে দেয়, সুতরাং আপনাকে প্রোগ্রামের রানটাইমের উপরে পুরো নিয়ন্ত্রণ দেয়।

    এগুলি প্রাক-বাস্তবায়িত নিউলিবের এক ধরণের হিসাবে দেখা যেতে পারে।

জিএনইউ গ্রুব মাল্টি বুট

বুট সেক্টরগুলি সহজ, তবে সেগুলি খুব সুবিধাজনক নয়:

  • আপনার প্রতি ডিস্কে একটি ওএস থাকতে পারে
  • লোড কোডটি সত্যই ছোট হতে হবে এবং 512 বাইটে ফিট করতে হবে
  • সুরক্ষিত মোডে যাওয়ার মতো আপনাকে নিজেকে প্রচুর স্টার্টআপ করতে হবে

এই কারণগুলির জন্যই জিএনইউ গ্রুব মাল্টি বুট নামে একটি আরও সুবিধাজনক ফাইল ফর্ম্যাট তৈরি করেছে।

সর্বনিম্ন কাজের উদাহরণ: 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

ফার্মওয়্যার

সত্যিকার অর্থে, আপনার বুট সেক্টরটি প্রথম সফ্টওয়্যার নয় যা সিস্টেমের সিপিইউতে চলে।

আসলে যা প্রথমে চলে তা হ'ল তথাকথিত ফার্মওয়্যার যা একটি সফ্টওয়্যার:

  • হার্ডওয়্যার নির্মাতারা তৈরি
  • সাধারণত বন্ধ উত্স তবে সম্ভবত সি-ভিত্তিক
  • কেবল পঠনযোগ্য মেমরির মধ্যে সঞ্চিত এবং তাই বিক্রেতার সম্মতি ছাড়াই সংশোধন করা শক্ত / অসম্ভব।

সুপরিচিত ফার্মওয়্যারগুলির মধ্যে রয়েছে:

  • 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সেগুলিও রয়েছে, সুতরাং আপনি এগুলি স্পষ্টভাবে ব্যবহার না করেও আপনার এগুলি শূন্য করা উচিত।

মনে রাখবেন যে কিছু ইমুলেটরগুলি সত্যিকারের হার্ডওয়্যার থেকে ভাল, এবং আপনাকে একটি দুর্দান্ত প্রাথমিক অবস্থা দেয়। তারপরে আপনি যখন সত্যিকারের হার্ডওয়্যারটিতে চলে যান, তখন সমস্ত কিছু ভেঙে যায়।

এল টরিটো

ফর্ম্যাট যা সিডিতে পোড়া যায়: https://en.wikedia.org/wiki/El_Torito_%28CD-ROM_standard%29

আইএসও বা ইউএসবি উভয় ক্ষেত্রেই কাজ করে এমন একটি হাইব্রিড চিত্র তৈরি করা সম্ভব। এটি grub-mkrescue( উদাহরণস্বরূপ ) দিয়ে করা যায় এবং লিনাক্স কার্নেল make isoimageব্যবহার করেও এটি করা যায় isohybrid

এআরএম

এআরএম-এ, সাধারণ ধারণাগুলি একই রকম are

আইও-র জন্য আমাদের ব্যবহারের জন্য বিআইওএসের মতো কোনও বিস্তৃত অর্ধ-মানকৃত প্রাক-ইনস্টলড ফার্মওয়্যার নেই, সুতরাং দুটি সহজ ধরণের আইও যা আমরা করতে পারি তা হ'ল:

  • সিরিয়াল, যা ডিবোর্ডে বিস্তৃত
  • এলইডি পলক

আমি আপলোড করেছি:

X86 থেকে কিছু পার্থক্য অন্তর্ভুক্ত:

  • আই সরাসরি যাদু ঠিকানায় লিখে সম্পন্ন করা হয়, সেখানে নেই inএবং outনির্দেশাবলী।

    এটাকে বলা হয় মেমরির আই ম্যাপ

  • রাস্পবেরি পাই এর মতো কিছু বাস্তব হার্ডওয়্যারের জন্য, আপনি নিজেরাই ডিস্কের ছবিতে ফার্মওয়্যার (বিআইওএস) যুক্ত করতে পারেন।

    এটি একটি ভাল জিনিস, কারণ এটি ফার্মওয়্যার আপডেট করা আরও স্বচ্ছ করে তোলে।

সম্পদ

  • http://wiki.osdev.org এই বিষয়গুলির জন্য একটি দুর্দান্ত উত্স।
  • https://github.com/scanlime/metalkit একটি আরও স্বয়ংক্রিয় / সাধারণ বেয়ার ধাতব সংকলন সিস্টেম যা একটি ছোট্ট কাস্টম এপিআই সরবরাহ করে

3
ইউনিকের্নালগুলি এমন লোকদের জন্য একটি বিকল্প যা তারা এত নিচু স্তরে যেতে চায় না এবং এখনও তাদের খুব কম পায়ের ছাপ থেকে উপকার পেতে চায়।
AndreLDM

1
@ আন্ডারএলডিএম আমি লিনাক্স ভিত্তিক ইউনিকার্নেল সংবাদ যুক্ত করার প্রান্তে ছিলাম, তবে এখনও খুব উদ্বেগ অনুভব করেছি: পরের.ডাহট.কম
২০১৮ / ১১ / ১৪ / কুক্ল-এ-ইউনিকারেল-বেসড- অন-

14
সত্যই বিস্তারিত উত্তর কিন্তু "একটি প্রোগ্রাম যা কোনও ওএস ছাড়াই চলে, এটি একটি ওএস" সত্য নয়। আপনি এমন একটি প্রোগ্রাম লিখতে পারেন যা কেবল একটি LED চালু / বন্ধ জ্বলজ্বল করে তবে এটি ওএস করে না। আপনার ফ্ল্যাশ ড্রাইভে মাইক্রোকন্ট্রোলার চালিত এমন কিছু ফার্মওয়্যার কোড এটিকে ওএস বানায় না। আরও সহজেই অন্য সফ্টওয়্যারটি লিখতে কোনও ওএস ন্যূনতম একটি বিমূর্ত স্তর থাকে। খুব কম সময়ে এই দিন আমি বলব যদি কোনও শিডিউল না থাকে তবে এটি সম্ভবত কোনও ওএস নয়।
ভিটালী

4
নিখুঁত বোকা বাদে ভাল উত্তর যে কোনও প্রোগ্রাম যা কোনও ওএসে চালিত হয় না তা ওএস।
কৌতূহলীনি

3
@ মিশেলপ্যাচ হে, বুট সেক্টরের নাল বাঁচাতে :-) সম্ভবত এটির পক্ষে মূল্য নেই।
সিরো সান্তিলি 郝海东 冠状 病 六四 事件

3

অনুপ্রেরণা হিসাবে অপারেটিং সিস্টেম

অপারেটিং সিস্টেম একটি প্রোগ্রাম , তাই আমরা কিছু করতে গোড়া থেকে তৈরি অথবা পরিবর্তন করে আমাদের নিজস্ব প্রোগ্রাম তৈরি (সীমিত বা যোগ) এক অতিরিক্ত বৈশিষ্ট্যগুলিও উপস্থিত রয়েছে ছোট অপারেটিং সিস্টেম , এবং তারপর বুট প্রক্রিয়ার সময় এটি চালানোর (একটি ব্যবহার ISO ইমেজ ) ।

উদাহরণস্বরূপ, এই পৃষ্ঠাটি একটি সূচনা পয়েন্ট হিসাবে ব্যবহার করা যেতে পারে:

কীভাবে একটি সাধারণ অপারেটিং সিস্টেম লিখবেন

এখানে, সম্পূর্ণ অপারেটিং সিস্টেমটি 512-বাইট বুট সেক্টরে ( এমবিআর ) পুরোপুরি ফিট করে !

এই জাতীয় বা অনুরূপ সাধারণ ওএস একটি সাধারণ কাঠামো তৈরি করতে ব্যবহার করা যেতে পারে যা আমাদের অনুমতি দেবে:

করতে র্যাম মধ্যে ডিস্কে বুট-লোডার লোড পরবর্তী সেক্টর, ও মৃত্যুদন্ড অব্যাহত রাখার জন্য যে বিন্দু ঝাঁপ । অথবা আপনি পারে FAT12, ফাইলসিস্টেম ফ্লপি ড্রাইভ ব্যবহার উপর পড়তে, এবং যে বাস্তবায়ন

তবে অনেকগুলি সম্ভাবনা রয়েছে। উদাহরণস্বরূপ একটি বৃহত্তর x86 অ্যাসেম্বলি ভাষার ওএস দেখতে আমরা মাইকিওএস , এক্স 86 অপারেটিং সিস্টেমটি অন্বেষণ করতে পারি যা ভাল 16-বিট, রিয়েল-মোড ওএসস কাজটি ভাল মন্তব্য করা কোড এবং বিস্তৃত ডকুমেন্টেশন সহ দেখানোর জন্য একটি শিখন সরঞ্জাম

অনুপ্রেরণা হিসাবে বুট লোডার

অপারেটিং সিস্টেম ব্যতীত চালিত অন্যান্য সাধারণ ধরণের প্রোগ্রামগুলি হ'ল বুট লোডার । আমরা উদাহরণস্বরূপ এই সাইটটি ব্যবহার করে যেমন একটি ধারণা দ্বারা অনুপ্রাণিত একটি প্রোগ্রাম তৈরি করতে পারি:

আপনার নিজের বুট লোডার কীভাবে বিকাশ করবেন

উপরের নিবন্ধটি এই জাতীয় প্রোগ্রামের প্রাথমিক আর্কিটেকচারটিও উপস্থাপন করে :

  1. 0000: 7C00 ঠিকানার মাধ্যমে মেমোরিতে লোডিং সঠিক করুন।
  2. উচ্চ-স্তরের ভাষায় বিকাশযুক্ত বুটমেন ফাংশনটিকে কল করা হচ্ছে
  3. ডিসপ্লেতে "হ্যালো, ওয়ার্ল্ড ...", নিম্ন স্তরের থেকে বার্তাটি দেখান।

যেমনটি আমরা দেখতে পাচ্ছি, এই আর্কিটেকচারটি খুব নমনীয় এবং প্রয়োজনীয় কোনও বুট লোডার নয়, কোনও প্রোগ্রাম বাস্তবায়নের অনুমতি দেয়

বিশেষ করে, এটি কিভাবে ব্যবহার করতে দেখায় "মিশ্র কোড" কৌশল ধন্যবাদ যা সম্ভব হয় উচ্চ পর্যায়ের বাক্য একত্রিত (থেকে সি বা সি ++ ) নিম্নস্তরের কমান্ড সহ (থেকে অ্যাসেম্বলার )। এটি একটি খুব দরকারী পদ্ধতি, তবে আমাদের এটি মনে রাখতে হবে:

প্রোগ্রামটি তৈরি করতে এবং এক্সিকিউটেবল ফাইলটি পেতে আপনার 16-বিট মোডের জন্য এসেমব্লারের সংকলক এবং লিংক প্রয়োজন । সি / সি ++ এর জন্য আপনার কেবলমাত্র সংকলক প্রয়োজন যা 16-বিট মোডের জন্য অবজেক্ট ফাইল তৈরি করতে পারে

নিবন্ধটি কীভাবে তৈরি করা প্রোগ্রামটি কার্যক্ষমতার সাথে দেখতে হয় এবং কীভাবে এটির পরীক্ষা এবং ডিবাগ সম্পাদন করতে পারে তাও দেখায়।

অনুপ্রেরণা হিসাবে UEFI অ্যাপ্লিকেশন

উপরোক্ত উদাহরণগুলি সেক্টর এমবিআর ডেটা মিডিয়ামে লোড করার সত্যতা ব্যবহার করেছিল। যাইহোক, আমরা ইউইএফআই অ্যাপ্লিকেশনগুলির সাথে উদাহরণস্বরূপ রেখে গভীরতার গভীরে যেতে পারি :

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

এক ধরণের UEFI অ্যাপ্লিকেশন হ'ল GRUB, rEFInd, Gummiboot, এবং Windows বুট ম্যানেজারের মতো একটি ওএস লোডার ; যা কোনও ওএস ফাইলকে মেমরিতে লোড করে এবং কার্যকর করে। এছাড়াও, একটি ওএস লোডার অন্য ইউইএফআই অ্যাপ্লিকেশন নির্বাচন চালানোর অনুমতি দিতে একটি ব্যবহারকারী ইন্টারফেস সরবরাহ করতে পারে। ইউইএফআই শেলের মতো ইউটিলিটিগুলিও ইউইএফআই অ্যাপ্লিকেশন।

যদি আমরা এই জাতীয় প্রোগ্রাম তৈরি শুরু করতে চাই , তবে আমরা উদাহরণস্বরূপ এই ওয়েবসাইটগুলি দিয়ে শুরু করতে পারি:

EFI এর জন্য প্রোগ্রামিং: একটি "হ্যালো, ওয়ার্ল্ড" প্রোগ্রাম / ইউইএফআই প্রোগ্রামিং তৈরি করা - প্রথম পদক্ষেপ

অনুপ্রেরণা হিসাবে সুরক্ষা বিষয়গুলি অন্বেষণ করা

এটা সর্বজনবিদিত একটি সম্পূর্ণ গ্রুপ আছে যে ক্ষতিকারক সফ্টওয়্যার (যা প্রোগ্রাম হয়) যে অপারেটিং সিস্টেম শুরু হওয়ার আগে দৌড়াচ্ছে

তাদের এক বিশাল গ্রুপ শুধু সর্বোপরি সমাধান মতো উপস্থিত MBR সেক্টর বা UEFI অ্যাপ্লিকেশন কাজ, কিন্তু সেই যে যেমন অন্য এন্ট্রি পয়েন্ট ব্যবহার করেন ভলিউম বুট রেকর্ড (VBR) অথবা বায়োস :

কমপক্ষে চারটি বিআইওএস আক্রমণ ভাইরাস রয়েছে , যার মধ্যে দুটি বিক্ষোভের উদ্দেশ্যে।

বা অন্য একটি সম্ভবত।

সিস্টেম শুরুর আগে আক্রমণ

বুটকিটস প্রুফ অফ কনসেপ্ট বিকাশ থেকে গণ বিতরণে বিবর্তিত হয়েছে এবং এখন কার্যকরভাবে ওপেন সোর্স সফ্টওয়্যার হয়ে উঠেছে

বুট করার বিভিন্ন উপায়

আমিও মনে করি যে এই প্রেক্ষাপটে এটি মূল্য উল্লেখ করে হয় আছে বুট বিভিন্ন ধরনের অপারেটিং সিস্টেম (অথবা এক্সিকিউটেবল প্রোগ্রাম এই জন্য দেয়ার উদ্দেশ্যে করা) । অনেকগুলি রয়েছে, তবে আমি নেটওয়ার্ক বুট অপশন ( পিএক্সই ) ব্যবহার করে নেটওয়ার্ক থেকে কোডটি লোড করার দিকে মনোযোগ দিতে চাই , যা আমাদের কম্পিউটারে প্রোগ্রাম পরিচালনা করতে দেয় এটির অপারেটিং সিস্টেম নির্বিশেষে এমনকি কোনও স্টোরেজ মিডিয়াম নির্বিশেষে is কম্পিউটারের সাথে সরাসরি সংযুক্ত:

নেটওয়ার্ক বুটিং (PXE) কী এবং আপনি কীভাবে এটি ব্যবহার করতে পারেন?

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.