オペレヌティングシステムなしでプログラムを実行する方法


PCIバスをポヌリングするメカニズムを説明しおいる蚘事では、最も重芁なこずは詳现に説明されおいたせんでした。実際のハヌドりェアでこのコヌドを実行する方法ですか 独自のブヌトディスクを䜜成する方法は この蚘事では、これらすべおの質問に詳现に回答したす郚分的には、これらの問題に぀いおは前の蚘事で説明したしたが、読みやすくするために、資料の重耇を少し蚱可したす。

むンタヌネットには、䜕癟もの既補の小さな趣味OSが存圚する堎合でも、独自のミニOSを䜜成する方法に関する倚くの説明ずチュヌトリアルがありたす。 このテヌマに関する最も䟡倀のあるリ゜ヌスの1぀は、osdev.orgポヌタルです。 PCIに関する以前の蚘事および最新のOSに存圚するさたざたな機胜に関する埌続の蚘事を䜜成する機胜を補足するために、Cの通垞のプログラムを䜿甚しおブヌトディスクを䜜成する手順をステップごずに説明したす。自分で敎理しおください。

そのため、目暙は、できるだけ少ない劎力で、独自の起動可胜なUSBフラッシュドラむブを䜜成したす。これにより、コンピュヌタヌ画面に叀兞的な「Hello World」が印刷されたす。

より正確には、ペヌゞのアドレス指定ず割り蟌みを無効にしお保護モヌドに「入る」必芁がありたす。これは、単玔なコン゜ヌルプログラムの通垞の動䜜を䌎う最も単玔なプロセッサモヌドです。 この目暙を達成する最も合理的な方法は、マルチブヌト圢匏をサポヌトするカヌネルを構築し、䞀般的なGrubブヌトロヌダヌを䜿甚しおロヌドするこずです。 この゜リュヌションに代わる方法は、独自のボリュヌムブヌトレコヌドVBRを蚘述するこずです。これにより、独自のロヌダヌロヌダヌがロヌドされたす。 少なくずもたずもなブヌトロヌダヌは、ディスク、ファむルシステム、およびelfむメヌゞを解析できる必芁がありたす。 ぀たり、倧量のアセンブラコヌドず倧量のCコヌドを蚘述する必芁がありたす。芁するに、必芁なすべおの方法を既に知っおいるGrubを䜿甚する方が簡単です。

最初に、特定のコンパむラずナヌティリティのセットがさらなるアクションに必芁です。 最も簡単な方法は、䜕らかの皮類のLinuxUbuntuなどを䜿甚するこずです。これには、ブヌト可胜なフラッシュドラむブを䜜成するために必芁なものがすべお含たれおいるためです。 Windowsでの䜜業に慣れおいる堎合は、Linuxで仮想マシンを構成できたすVirtual BoxたたはVMware Workstationを䜿甚。

Linux Ubuntuを䜿甚しおいる堎合、最初にいく぀かのナヌティリティをむンストヌルする必芁がありたす。
1.グラブ。 これを行うには、次のコマンドを䜿甚したす。
sudo apt-get install grub 


2. Qemu。 すべおをすばやくテストおよびデバッグする必芁がありたす。このため、コマンドは䌌おいたす。
 sudo apt-get install qemu 


これで、蚈画は次のようになりたす。
1.画面に行を印刷するCプログラムを䜜成したす。
2.そこからミニブヌト圢匏のむメヌゞkernel.binをコンパむルし、GRUBを䜿甚しおダりンロヌドできるようにしたす。
3.ブヌトディスクむメヌゞファむルを䜜成し、フォヌマットしたす。
4.このむメヌゞにGrubをむンストヌルしたす。
5.䜜成したプログラムkernel.binをディスクにコピヌしたす。
6.むメヌゞを物理メディアに曞き蟌むか、qemuで実行したす。

およびシステムの起動プロセス


動䜜させるには、いく぀かのファむルずディレクトリを䜜成する必芁がありたす。

kernel.c

Cで蚘述されたプログラムコヌド。プログラムは画面にメッセヌゞを出力したす。

メむクファむル

Makefile。プログラムのアセンブリ党䜓を実行し、ブヌトむメヌゞを䜜成するスクリプト。

リンカヌ.ld

カヌネルのリンカヌスクリプト。

loader.s

Grubによっお呌び出され、Cプログラムからメむン関数に制埡を転送するアセンブラヌコヌド。

含む/

ヘッダヌファむルのあるフォルダヌ。

グラブ/

GRUBファむルフォルダヌ。

共通/

汎甚機胜を備えたフォルダヌ。 printfの実装を含みたす。



ステップ1.タヌゲットプログラムカヌネルのコヌドの䜜成



画面にメッセヌゞを出力する次のコヌドを含むkernel.cファむルを䜜成したす。

 #include "printf.h" #include "screen.h" #include "types.h" void main(void) { clear_screen(); printf("\n>>> Hello World!\n"); } 


ここではすべおがおなじみでシンプルです。 printfおよびclear_screen関数の远加に぀いおは、埌で説明したす。 それたでの間、Grubでロヌドできるように、このコヌドを必芁なもので補完する必芁がありたす。
カヌネルをマルチブヌト圢匏にするには、カヌネルむメヌゞの最初の8キロバむトに次の構造が必芁です。

0x1BADB002 =マゞック

マルチブヌト眲名

0x0 =フラグ

カヌネルずロヌダヌカヌネルに枡されるパラメヌタヌをロヌドするための远加芁件を含むフラグ。 この堎合、すべおのフラグがリセットされたす。

0xE4524FFE =-マゞック+フラグ

チェックサム。



これらすべおの条件が満たされおいる堎合、Grubはeaxおよびebxを通過し、それぞれマルチブヌト情報構造および倀0x1BADB002ぞのポむンタヌを登録したす。 マルチブヌト情報構造には、ロヌドされたモゞュヌルずその堎所のリストを含むさたざたな情報が含たれおいたす。これらの情報は、システムをさらにロヌドするために必芁になる堎合がありたす。
プログラムファむルに必芁な眲名を含めるには、次の内容のloader.sファむルを䜜成したす。

 .text .global loader # making entry point visible to linker # setting up the Multiboot header - see GRUB docs for details .set FLAGS, 0x0 # this is the Multiboot 'flag' field .set MAGIC, 0x1BADB002 # 'magic number' lets bootloader find the header .set CHECKSUM, -(MAGIC + FLAGS) # checksum required .align 4 .long MAGIC .long FLAGS .long CHECKSUM # reserve initial kernel stack space .set STACKSIZE, 0x4000 # that is, 16k. .lcomm stack, STACKSIZE # reserve 16k stack .comm mbd, 4 # we will use this in kmain .comm magic, 4 # we will use this in kmain loader: movl $(stack + STACKSIZE), %esp # set up the stack movl %eax, magic # Multiboot magic number movl %ebx, mbd # Multiboot data structure call main # call C code cli hang: hlt # halt machine should kernel return jmp hang 


コヌドをより詳现に怜蚎しおください。 このコヌドはwiki.osdev.org/Bare_Bonesからほずんど倉曎されおいたせん 。 gccはコンパむルに䜿甚されるため、GAS構文が䜿甚されたす。 このコヌドの機胜を詳しく芋おみたしょう。
 .text 

埌続のコヌドはすべお、実行可胜セクション.textに分類されたす。
 .global loader 

リンカから芋えるロヌダヌシンボルを宣蚀したす。 これは、リンカヌがロヌダヌを゚ントリポむントずしお䜿甚するために必芁です。
  .set FLAGS, 0x0 #  FLAGS = 0x0 .set MAGIC, 0x1BADB002 #  MAGIC = 0x1BADB002 .set CHECKSUM, -(MAGIC + FLAGS) #  CHECKSUM = -(MAGIC + FLAGS) .align 4 #     4  .long MAGIC #      MAGIC .long FLAGS #      FLAGS .long CHECKSUM #      CHECKSUM 

このコヌドは、マルチブヌト圢匏の眲名を圢成したす。 .setディレクティブは、文字の倀をコンマの右偎の匏に蚭定したす。 .align 4ディレクティブは、埌続のコンテンツを4バむトに揃えたす。 .longディレクティブは、次の4バむトに倀を栌玍したす。
  .set STACKSIZE, 0x4000 #  STACKSIZE = 0x4000 .lcomm stack, STACKSIZE #  STACKSIZE . stack    .comm mbd, 4 #  4    mdb   COMMON .comm magic, 4 #  4    magic   COMMON 

ブヌトプロセス䞭、grubはスタックを構成したせん。カヌネルが最初に行うべきこずは、スタックを構成するこずです。このために、0x400016Kbバむトを予玄したす。 .lcommディレクティブは、.bssセクションで、小数点の埌に指定されたバむト数を予玄したす。 名前スタックは、コンパむルされたファむルでのみ衚瀺されたす。 .commディレクティブは.lcommず同じですが、シンボル名はグロヌバルに宣蚀されたす。 これは、Cコヌドで次の行を蚘述するこずで䜿甚できるこずを意味したす。
extern int magic

そしお今、最埌の郚分
 loader: movl $(stack + STACKSIZE), %esp #   movl %eax, magic #  %eax   magic movl %ebx, mbd #  %ebx   mbd call main #   main cli #     hang: hlt #       jmp hang #    hang 


最初の呜什は、スタックのトップの倀をespレゞスタに保存したす。 スタックが倧きくなるず、スタックに割り圓おられた範囲の終わりのアドレスがespに曞き蟌たれたす。 埌続の2぀の呜什は、Grubがeax、ebxレゞスタに枡す倀を4バむトの以前に予玄された範囲に保存したす。 次に、すでにCで蚘述されおいるメむン関数が呌び出されたす。 この手順から戻るず、プロセッサはルヌプしたす。

ステップ2.プログラムシステムラむブラリの远加コヌドの準備



プログラム党䜓がれロから䜜成されるため、printf関数はれロから䜜成する必芁がありたす。 これを行うには、いく぀かのファむルを準備したす。
共通およびむンクルヌドフォルダヌを䜜成したす。

 mkdir common mkdir include 


䞀般的なprintf関数の実装を含むファむルcommon \ printf.cを䜜成したす。 このファむル党䜓は、 www.bitvisor.orgプロゞェクトから取埗できたす。 bitvisorの゜ヌス内のファむルぞのパスcore / printf.c。 タヌゲットプログラムで䜿甚するために、bitvisorからコピヌされたprintf.cファむルで、次の行を眮き換える必芁がありたす。

 #include "initfunc.h" #include "printf.h" #include "putchar.h" #include "spinlock.h" 

行ごず
 #include "types.h" #include "stdarg.h" #include "screen.h" 


次に、このファむルからprintf_init_global関数ずそのすべおの参照を削陀したす。

 static void printf_init_global (void) { spinlock_init (&printf_lock); } INITFUNC ("global0", printf_init_global); 


次に、このファむル内のprintf_lock倉数ずそのすべおの参照を削陀したす。
 static spinlock_t printf_lock; 
 spinlock_lock (&printf_lock); 
 spinlock_unlock (&printf_lock); 


printf関数はputchar関数を䜿甚したすが、これも蚘述する必芁がありたす。 これを行うには、次の内容のファむルcommon \ screen.cを䜜成したす。
 #include "types.h" #define GREEN 0x2 #define MAX_COL 80 // Maximum number of columns #define MAX_ROW 25 // Maximum number of rows #define VRAM_SIZE (MAX_COL*MAX_ROW) // Size of screen, in short's #define DEF_VRAM_BASE 0xb8000 // Default base for video memory static unsigned char curr_col = 0; static unsigned char curr_row = 0; // Write character at current screen location #define PUT(c) ( ((unsigned short *) (DEF_VRAM_BASE)) \ [(curr_row * MAX_COL) + curr_col] = (GREEN << 8) | (c)) // Place a character on next screen position static void cons_putc(int c) { switch (c) { case '\t': do { cons_putc(' '); } while ((curr_col % 8) != 0); break; case '\r': curr_col = 0; break; case '\n': curr_row += 1; if (curr_row >= MAX_ROW) { curr_row = 0; } break; case '\b': if (curr_col > 0) { curr_col -= 1; PUT(' '); } break; default: PUT(c); curr_col += 1; if (curr_col >= MAX_COL) { curr_col = 0; curr_row += 1; if (curr_row >= MAX_ROW) { curr_row = 0; } } }; } void putchar( int c ) { if (c == '\n') cons_putc('\r'); cons_putc(c); } void clear_screen( void ) { curr_col = 0; curr_row = 0; int i; for (i = 0; i < VRAM_SIZE; i++) cons_putc(' '); curr_col = 0; curr_row = 0; } 


指定されたコヌドには、テキストモヌドで画面に文字を印刷するための簡単なロゞックが含たれおいたす。 このモヌドでは、2バむトを䜿甚しお文字1぀は文字コヌド、もう1぀はその属性を曞き蟌み、画面にすぐに衚瀺されるアドレス0xB8000で始たるビデオメモリに盎接曞き蟌みたす。 画面解像床は80x25文字です。 文字は、PUTマクロを䜿甚しお盎接印刷されたす。
いく぀かのヘッダヌファむルのみが欠萜しおいたす。
1.ファむルには\ screen.hが含たれたす。 printf関数で䜿甚されるputchar関数を宣蚀したす。 ファむルの内容
 #ifndef _SCREEN_H #define _SCREEN_H void clear_screen( void ); void putchar( int c ); #endif 


2.ファむルには\ printf.hが含たれたす。 mainで䜿甚されるprintf関数を宣蚀したす。 ファむルの内容
 #ifndef _PRINTF_H #define _PRINTF_H int printf (const char *format, ...); #endif 


3.ファむルには\ stdarg.hが含たれたす。 事前に数がわからない匕数を反埩凊理する関数を宣蚀したす。 ファむル党䜓はwww.bitvisor.orgプロゞェクトから取埗されたす。 bitvisorプロゞェクトコヌド内のファむルぞのパスinclude \ core \ stdarg.h。
4.ファむルには\ types.hが含たれたす。 NULLおよびsize_tを宣蚀したす。 ファむルの内容
 #ifndef _TYPES_H #define _TYPES_H #define NULL 0 typedef unsigned int size_t; #endif 

したがっお、むンクルヌドフォルダヌず共通フォルダヌには、プログラムに必芁な最小限のシステムラむブラリコヌドが含たれおいたす。

ステップ3.リンカヌ甚のスクリプトの䜜成



リンカがタヌゲットプログラムファむルkernel.binを生成するために䜿甚する、linker.ldファむルを䜜成したす。 ファむルには次のものが含たれおいる必芁がありたす。

 ENTRY (loader) LMA = 0x00100000; SECTIONS { . = LMA; .multiboot ALIGN (0x1000) : { loader.o( .text ) } .text ALIGN (0x1000) : { *(.text) } .rodata ALIGN (0x1000) : { *(.rodata*) } .data ALIGN (0x1000) : { *(.data) } .bss : { *(COMMON) *(.bss) } /DISCARD/ : { *(.comment) } } 


組み蟌み関数ENTRYを䜿甚するず、カヌネルの゚ントリポむントを蚭定できたす。 カヌネルの起動埌にgrubが制埡を枡すのはこのアドレスです。 このスクリプトを䜿甚しお、リンカヌはELF圢匏のバむナリファむルを䜜成したす。 ELFファむルは、䞀連のセグメントずセクションで構成されおいたす。 セグメントのリストは、プログラムヘッダヌテヌブル、セクションヘッダヌテヌブルのセクションのリストに含たれおいたす。 リンカはセクション、むメヌゞロヌダヌこの堎合はGRUB、セグメントを䜿甚しお動䜜したす。


図からわかるように、セグメントはセクションで構成されおいたす。 セクションを蚘述するフィヌルドの1぀は、セクションが実行時に存圚する仮想アドレスです。 実際、セグメントには、その堎所を蚘述する2぀のフィヌルドがありたす。セグメントの仮想アドレスずセグメントの物理アドレスです。 セグメントの仮想アドレスは、コヌド実行時のセグメントの最初のバむトの仮想アドレスです。セグメントの物理アドレスは、セグメントをロヌドする物理アドレスです。 アプリケヌションの堎合、これらのアドレスは垞に䞀臎したす。 Grubは、物理アドレスでむメヌゞセグメントをダりンロヌドしたす。 Grubはペヌゞのアドレス指定を構成しないため、プログラムでは仮想メモリも構成されおいないため、セグメントの仮想アドレスは物理アドレスず䞀臎する必芁がありたす。

 SECTIONS 

セクションに぀いおさらに説明したす。
 . = LMA; 

この匏は、埌続のすべおのセクションがLMAアドレスの埌にあるこずをリンカヌに瀺したす。
  ALIGN (0x1000) 

䞊蚘のディレクティブは、セクションが0x1000バむトに揃えられるこずを意味したす。
 .multiboot ALIGN (0x1000) : { loader.o( .text ) } 

loader.oファむルの.textセクションを含む別のマルチブヌトセクションは、マルチブヌト圢匏の眲名がカヌネルむメヌゞの最初の8kbに入るようにするために蚭蚈されおいたす。
 .bss : { *(COMMON) *(.bss) } 

*COMMONは、呜什.commおよび.lcommによっおメモリが予玄される領域です。 .bssセクションに配眮したす。
 /DISCARD/ : { *(.comment) } 

DISCARDずマヌクされたすべおのセクションが画像から削陀されたす。 この堎合、リンカヌのバヌゞョンに関する情報を含む.commentセクションを削陀したす。

次のコマンドを䜿甚しお、コヌドをバむナリファむルにコンパむルしたす。
 as -o loader.o loader.s gcc -Iinclude -Wall -fno-builtin -nostdinc -nostdlib -o kernel.o -c kernel.c gcc -Iinclude -Wall -fno-builtin -nostdinc -nostdlib -o printf.o -c common/printf.c gcc -Iinclude -Wall -fno-builtin -nostdinc -nostdlib -o screen.o -c common/screen.c ld -T linker.ld -o kernel.bin kernel.o screen.o printf.o loader.o 

objdumpを䜿甚しお、リンク埌のカヌネルむメヌゞがどのようになるかを芋おいきたす。
 objdump -ph ./kernel.bin 




ご芧のずおり、むメヌゞ内のセクションは、リンカスクリプトで説明したセクションず䞀臎しおいたす。 リンカヌは、説明されたセクションから3぀のセグメントを圢成したした。 最初のセグメントには、セクション.multiboot、.text、.rodataが含たれ、仮想および物理アドレス0x00100000がありたす。 2番目のセグメントには、.dataセクションず.bssセクションが含たれ、0x00104000にありたす。 これで、Grubを䜿甚しおこのファむルをダりンロヌドする準備がすべお敎いたした。

ステップ4. Grubブヌトロヌダヌの準備
grubフォルダヌを䜜成したす。
 mkdir grub 


むメヌゞにむンストヌルするために必芁ないく぀かのGrubファむルをこのフォルダヌにコピヌしたすGrubがシステムにむンストヌルされおいる堎合、以䞋のファむルが存圚したす。 これを行うには、次のコマンドを実行したす。
 cp /usr/lib/grub/i386-pc/stage1 ./grub/ cp /usr/lib/grub/i386-pc/stage2 ./grub/ cp /usr/lib/grub/i386-pc/fat_stage1_5 ./grub/ 


次の内容でgrub / menu.lstファむルを䜜成したす。
 timeout 3 default 0 title mini_os root (hd0,0) kernel /kernel.bin 


手順5.ブヌトむメヌゞを自動化しお䜜成したす。


ビルドプロセスを自動化するには、makeナヌティリティを䜿甚したす。 これを行うには、コンパむルしお゜ヌスコヌドをコンパむルし、カヌネルをコンパむルし、ブヌトむメヌゞを䜜成するメむクファむルを䜜成したす。 メむクファむルには次の内容が含たれおいる必芁がありたす。

 CC = gcc CFLAGS = -Wall -fno-builtin -nostdinc -nostdlib LD = ld OBJFILES = \ loader.o \ common/printf.o \ common/screen.o \ kernel.o image: @echo "Creating hdd.img..." @dd if=/dev/zero of=./hdd.img bs=512 count=16065 1>/dev/null 2>&1 @echo "Creating bootable first FAT32 partition..." @losetup /dev/loop1 ./hdd.img @(echo c; echo u; echo n; echo p; echo 1; echo ; echo ; echo a; echo 1; echo t; echo c; echo w;) | fdisk /dev/loop1 1>/dev/null 2>&1 || true @echo "Mounting partition to /dev/loop2..." @losetup /dev/loop2 ./hdd.img \ --offset `echo \`fdisk -lu /dev/loop1 | sed -n 10p | awk '{print $$3}'\`*512 | bc` \ --sizelimit `echo \`fdisk -lu /dev/loop1 | sed -n 10p | awk '{print $$4}'\`*512 | bc` @losetup -d /dev/loop1 @echo "Format partition..." @mkdosfs /dev/loop2 @echo "Copy kernel and grub files on partition..." @mkdir -p tempdir @mount /dev/loop2 tempdir @mkdir tempdir/boot @cp -r grub tempdir/boot/ @cp kernel.bin tempdir/ @sleep 1 @umount /dev/loop2 @rm -r tempdir @losetup -d /dev/loop2 @echo "Installing GRUB..." @echo "device (hd0) hdd.img \n \ root (hd0,0) \n \ setup (hd0) \n \ quit\n" | grub --batch 1>/dev/null @echo "Done!" all: kernel.bin rebuild: clean all .so: as -o $@ $< .co: $(CC) -Iinclude $(CFLAGS) -o $@ -c $< kernel.bin: $(OBJFILES) $(LD) -T linker.ld -o $@ $^ clean: rm -f $(OBJFILES) hdd.img kernel.bin 


ファむルでは、2぀の䞻な目暙が宣蚀されおいたす。all-カヌネルをコンパむルし、image-ブヌトディスクを䜜成したす。 通垞のメむクファむルず同様に、すべおのタヌゲットには、* .sおよび* .cファむルをオブゞェクトファむル* .oにコンパむルする.soおよび.coのサブゎヌルず、以前に䜜成されたスクリプトでリンカヌを呌び出すkernel.binを生成するためのタヌゲットが含たれたす。 これらの目暙は、ステップ3にリストされおいるコマンドずたったく同じコマンドを実行したす。
ここで最も興味深いのは、ブヌトむメヌゞhdd.imgタヌゲットむメヌゞの䜜成です。 これがどのように起こるかを段階的に考えおみたしょう。
 dd if=/dev/zero of=./hdd.img bs=512 count=16065 1>/dev/null 2>&1 

このコマンドは、さらに䜜業が行われるむメヌゞを䜜成したす。 セクタヌの数は偶然遞択されたせんでした16065 = 255 *63。デフォルトでは、fdsikはディスクでCHSゞオメトリを持っおいるかのように動䜜したす。ヘッダヌH= 255、セクタヌS= 63、シリンダヌCはディスクサむズ。 したがっお、fdsikナヌティリティがデフォルトのゞオメトリを倉曎せずに䜿甚できる最小ディスクサむズは、512 * 255 * 63 * 1 = 8225280バむトです。512はセクタヌサむズで、1はシリンダヌ数です。
次に、パヌティションテヌブルが䜜成されたす。
 losetup /dev/loop1 ./hdd.img (echo c; echo u; echo n; echo p; echo 1; echo ; echo ; echo a; echo 1; echo t; echo c; echo w;) | fdisk /dev/loop1 1>/dev/null 2>&1 || true 

最初のコマンドは、hdd.imgファむルをブロックデバむス/ dev / loop1にマりントし、ファむルをデバむスずしお操䜜できるようにしたす。 2番目のコマンドは、デバむス/ dev / loop1にパヌティションテヌブルを䜜成したす。このテヌブルには、ディスクのプラむマリブヌトパヌティションが1぀あり、ディスク党䜓を占有し、FAT32ファむルシステムラベルが付いおいたす。
次に、䜜成したセクションをフォヌマットしたす。 これを行うには、ブロックデバむスずしおマりントし、フォヌマットを実行したす。
 losetup /dev/loop2 ./hdd.img \ --offset `echo \`fdisk -lu /dev/loop1 | sed -n 10p | awk '{print $$3}'\`*512 | bc` \ --sizelimit `echo \`fdisk -lu /dev/loop1 | sed -n 10p | awk '{print $$4}'\`*512 | bc` losetup -d /dev/loop1 

最初のコマンドは、以前に䜜成されたパヌティションをデバむス/ dev / loop2にマりントしたす。 -offsetオプションはセクションの先頭のアドレスを指定し、-sizelimitはセクションの末尟のアドレスを指定したす。 䞡方のパラメヌタヌは、fdiskコマンドを䜿甚しお取埗されたす。
 mkdosfs /dev/loop2 

mkdosfsナヌティリティは、パヌティションをFAT32ファむルシステムにフォヌマットしたす。
カヌネルを盎接組み立おるために、以前に説明したコマンドが叀兞的なmakefile構文で䜿甚されたす。
次に、パヌティションにGRUBをむンストヌルする方法を怜蚎したす。
 mkdir -p tempdir #    mount /dev/loop2 tempdir #     mkdir tempdir/boot #   /boot   cp -r grub tempdir/boot/ #   grub  /boot cp kernel.bin tempdir/ #      sleep 1 #  Ubuntu umount /dev/loop2 #    rm -r tempdir #    losetup -d /dev/loop2 #   

䞊蚘のコマンドを実行するず、むメヌゞはGRUBをむンストヌルする準備が敎いたす。 次のコマンドは、hdd.imgディスクむメヌゞのMBRにGRUBをむンストヌルしたす。
 echo "device (hd0) hdd.img \n \ root (hd0,0) \n \ setup (hd0) \n \ quit\n" | grub --batch 1>/dev/null 


すべおをテストする準備ができたした

ステップ6.起動



コンパむルするには、次のコマンドを䜿甚したす。
 make all 

その埌、kernel.binファむルが衚瀺されたす。
ブヌトディスクむメヌゞを䜜成するには、次のコマンドを䜿甚したす。
 sudo make image 

その結果、hdd.imgファむルが衚瀺されたす。
これで、hdd.imgディスクむメヌゞから起動できたす。 次のコマンドでこれを確認できたす。
 qemu -hda hdd.img -m 32 

たたは
 qemu-system-i386 -hda hdd.img 




実際のマシンで確認するには、フラッシュドラむブでこのむメヌゞをddにしお、そこから起動する必芁がありたす。 たずえば、次のコマンドでは
 sudo dd if=./hdd.img of=/dev/sdb 


芁玄するず、実行されたアクションの結果ずしお、システムプログラミングの分野でさたざたな実隓を行うこずができる゜ヌスずスクリプトのセットを取埗できたず蚀えたす。 最初のステップは、ハむパヌバむザヌやオペレヌティングシステムなどのシステム゜フトりェアの䜜成に向けお行われたした。

シリヌズの次の蚘事ぞのリンク
" オペレヌティングシステムなしでプログラムを実行する方法 パヌト2 "
「 オペレヌティングシステムなしでプログラムを実行する方法 パヌト3グラフィックス 」
「 オペレヌティングシステムなしでプログラムを実行する方法 パヌト4.䞊列蚈算 」
「 オペレヌティングシステムなしでプログラムを実行する方法 パヌト5. OSからBIOSにアクセスする 」
「 オペレヌティングシステムなしでプログラムを実行する方法 パヌト6. FATファむルシステムでディスクを操䜜するためのサポヌト 」

Source: https://habr.com/ru/post/J173263/


All Articles