[オペレーティング システムの実装 01] CentOS 9 は、Bochs 2.7 仮想マシンをインストールして構成し、単純なブートローダーを書き込み、起動用のフロッピー ディスクに書き込みます。

系统环境:
OS:CentOS Stream release 9 (cmd: cat /etc/redhat-release)
Linux Kernel:Linux 5.14.0-142.el9.x86_64 (cmd: uname -a)

1. Bochs 仮想マシン

Bochsこれはオープン ソースの仮想マシン ソフトウェアであり、システム開発に有益な関連するデバッグ機能を提供します.オペレーティング システムを研究している、またはLinuxカーネル開発内容。
ダウンロードリンク:
Bochs 公式サイト: https://bochs.sourceforge.io/
Sourceforge ダウンロード: https://sourceforge.net/projects/bochs/files/bochs/
Github ダウンロード: https://github.com/stlintel/Bochs

2. Bochs のコンパイルとインストール

著者は、ダウンロードすることsourceforge

2.2. ソースパッケージの解凍

ダウンロード後、ソースパッケージを解凍する必要があります。

[imaginemiracle@imos-ws Downloads]$ tar -zxvf bochs-2.7.tar.gz

2.3. 依存関係のインストールと Bochs の設定

関連する依存関係をインストールします。そうしないと、最初に構成またはコンパイルで依存関係が不足します。

[imaginemiracle@imos-ws bochs-2.7]$ sudo yum install gcc-c++
[imaginemiracle@imos-ws bochs-2.7]$ sudo yum install gtk2-devel
[imaginemiracle@imos-ws bochs-2.7]$ sudo yum install readline-devel
[imaginemiracle@imos-ws bochs-2.7]$ sudo yum install xorg-x11-server-Xdmx.x86_64

2.3.1. configure を使用して Makefile を生成する

解凍後のソースコードのディレクトリを入力し, を使っconfigureてソースコードを設定します. ここで, 作者--prefixは指定した場所にインストールディレクトリを設定するために使っています. 指定する必要のない読者はこのパラメータを追加する必要はありません.

[imaginemiracle@imos-ws bochs-2.7]$ ./configure --prefix=/pgm/bochs --with-x11 --with-wx --enable-debugger --enable-all-optimizations --enable-readline --enable-long-phy-address --enable-ltdl-install --enable-idle-hack --enable-a20-pin --enable-x86-64 --enable-smp --enable-cpu-level=6 --enable-large-ramfile --enable-repeat-speedups --enable-fast-function-calls  --enable-handlers-chaining  --enable-trace-linking --enable-configurable-msrs --enable-show-ips --enable-cpp --enable-debugger-gui --enable-iodebug --enable-logging --enable-assert-checks --enable-fpu --enable-vmx=2 --enable-svm --enable-3dnow --enable-alignment-check  --enable-monitor-mwait --enable-avx  --enable-evex --enable-x86-debugger --enable-pci --enable-usb --enable-voodoo

2.3.2. コンパイルする

構成でエラーが報告されなくなったら、直接コンパイルできます。

[imaginemiracle@imos-ws bochs-2.7]$ make

2.3.3. 报错:「parser.o」が必要とする「parser.cc」をターゲットにするルールはありません。

コンパイル時に次のようなエラーが発生する場合があります。

make[1]: *** No rule to make target 'parser.cc', needed by 'parser.o'.  Stop.

2.3.4. parser.ccがない問題を解決する

対応する.cppファイルを.ccファイルとしてコピーするだけです:

[imaginemiracle@imos-ws bochs-2.7]$ cp bx_debug/parser.cpp bx_debug/parser.cc

[注]:不要疑问要怎么找到复制文件的目录所在。出错行紧后会提示从出错目录退出,这个目录便是缺少文件的目录,需要复制文件的目录也就在这里了。

2.3.5. 作成を続行し、エラーを報告し続ける: 致命的なエラー: config.h: そのようなファイルまたはディレクトリはありません

makeコマンドの実行を続行しますが、このようなエラーが再び発生します: プロンプトが見つかりませんconfig.h

cd bx_debug && \
make  libdebug.a
make[1]: Entering directory '/home/imaginemiracle/Downloads/bochs-2.7/bx_debug'
g++ -g -O2 -D_FILE_OFFSET_BITS=64 -D_LARGE_FILES      -c -o parser.o parser.cc
In file included from parser.y:8:
debug.h:25:10: fatal error: config.h: No such file or directory
   25 | #include "config.h"
      |          ^~~~~~~~~~
compilation terminated.
make[1]: *** [<builtin>: parser.o] Error 1
make[1]: Leaving directory '/home/imaginemiracle/Downloads/bochs-2.7/bx_debug'
make: *** [Makefile:327: bx_debug/libdebug.a] Error 2

2.3.6. config.h が見つからない問題を解決する

このヘッダー ファイルについては、ソース コードのメイン ディレクトリで確認できます。

[imaginemiracle@imos-ws bochs-2.7]$ ls
aclocal.m4      bxversion.rc     configure     gui           ltdl.c         osdep.cpp       README
bios            bxversion.rc.in  configure.in  host          ltdlconf.h     osdep.h         README-wxWidgets
bochs.h         CHANGES          COPYING       install-sh    ltdlconf.h.in  param_names.h   TESTFORM.txt
build           config.cpp       cpu           instrument    ltmain.sh      PARAM_TREE.txt  TODO
bx_debug        config.guess     cpudb.h       iodev         main.cpp       patches         win32_enh_dbg.rc
bxdisasm.cpp    config.h         crc.cpp       libtool       Makefile       pc_system.cpp   win32res.rc
bxthread.cpp    config.h.in      doc           LICENSE       Makefile.in    pc_system.h     wxbochs.rc
bxthread.h      config.log       docs-html     logio.cpp     memory         plugin.cpp
bxversion.h     config.status    extplugin.h   logio.h       misc           plugin.h
bxversion.h.in  config.sub       gdbstub.cpp   ltdl-bochs.h  msrs.def       qemu-queue.h

エラーファイルを開く

[imaginemiracle@imos-ws bochs-2.7]$ vim bx_debug/debug.h

25#include "config.h"#include "../config.h"に変更するだけです。
ここに画像の説明を挿入

2.3.7. 作成を続行し、エラーを報告し続けます: 致命的なエラー: osdep.h: そのようなファイルまたはディレクトリはありません および致命的なエラー: cpu/decoder/decoder.h: そのようなファイルまたはディレクトリはありません

前のものと同様のエラーが他に 2 つあります。これもメイン ディレクトリにありますosdep.h。開いbx_debug/debug.h#include “osdep.h”に変更し、#include "../osdep.h"36行を#include "cpu/decoder/decoder.h"変更します。
ここに画像の説明を挿入

2.3.8. make を続行し、正しい場合はエラーが報告されます: 「misc/bximage.o」および一連のそのような問題によって必要とされるターゲット「misc/bximage.cc」を作成するルールはありません

このタイプの問題は最初のエラーに似ており、エラー ディレクトリに対応する.cppファイルが。.ccそれをファイルとしてコピーするだけです。

[imaginemiracle@imos-ws bochs-2.7]$ cp misc/bximage.cpp misc/bximage.cc
[imaginemiracle@imos-ws bochs-2.7]$ cp iodev/hdimage/hdimage.cpp iodev/hdimage/hdimage.cc
[imaginemiracle@imos-ws bochs-2.7]$ cp iodev/hdimage/vmware3.cpp iodev/hdimage/vmware3.cc
[imaginemiracle@imos-ws bochs-2.7]$ cp iodev/hdimage/vmware4.cpp iodev/hdimage/vmware4.cc
[imaginemiracle@imos-ws bochs-2.7]$ cp iodev/hdimage/vpc.cpp iodev/hdimage/vpc.cc
[imaginemiracle@imos-ws bochs-2.7]$ cp iodev/hdimage/vbox.cpp iodev/hdimage/vbox.cc

2.3.9. make install 後に make とインストールを続行する

この時点で実行しても問題ないmakeはずです。make installコマンドを実行してインストールします。

[imaginemiracle@imos-ws bochs-2.7]$ make install

インストール ディレクトリを確認する デフォルトのインストール ディレクトリを使用している場合は、ディレクトリを直接入力しbochtabキーを使用してディレクトリを完成させることができます。

[imaginemiracle@imos-ws ~]$ ls /pgm/bochs/bin/
bochs  bximage

ここで実行可能ファイルが生成された場合は、bochsそれがインストールされていることを。

3. フロッピー ディスクのイメージ ファイルを作成する

Bochsインストールしたばかりのものにはbximage、仮想マシン イメージの作成に使用される というツールが付属しています。

具体的な使用方法を見てみましょう:
(1)直接実行しますbximage(作成者のように指定したディレクトリにインストールされている場合は、最初に~/.bashrcファイルsource ~/.bashrc例: export PATH=$PATH:/pgm/bochs/bin)

[imaginemiracle@imos-ws img]$ bximage
========================================================================
                                bximage
  Disk Image Creation / Conversion / Resize and Commit Tool for Bochs
         $Id: bximage.cc 14091 2021-01-30 17:37:42Z sshwarts $
========================================================================

1. Create new floppy or hard disk image
2. Convert hard disk image to other format (mode)
3. Resize hard disk image
4. Commit 'undoable' redolog to base image
5. Disk image info

0. Quit

Please choose one [0] 1

(2)ここでの入力は、1フロッピー ディスクまたはハードディスクの作成を選択することを意味し、Enter キーを押すと、次の内容が表示されます。

Create image

Do you want to create a floppy disk image or a hard disk image?
Please type hd or fd. [hd] fd

(3)ここで、作成の種類がフロッピー ディスク ( fd) かハードディスク ( hd) かを選択し、ここに入力しfdて。

Choose the size of floppy disk image to create.
Please type 160k, 180k, 320k, 360k, 720k, 1.2M, 1.44M, 1.68M, 1.72M, or 2.88M.
 [1.44M]

(4)次に、作成するフロッピー ディスクのサイズを選択するよう求められます。デフォルト値は です1.44MB。ここで Enter キーを押してデフォルト値を使用します。

What should be the name of the image?
[a.img] imboot.img

Creating floppy image 'imboot.img' with 2880 sectors

The following line should appear in your bochsrc:
  floppya: image="imboot.img", status=inserted

(5)次に、作成したフロッピー ディスクの名前を聞かれますが、このフロッピー ディスクは後でオペレーティング システムを起動するためのプログラムデフォルトの名前はa.img作成者がここに入力した名前です。imboot.imgboot

これでフロッピー ディスクのイメージ ファイルが作成されました。

4. Bochs の動作環境設定

Bochs参照用の構成ファイルは のインストール ディレクトリに提供されます/pgm/bochs/share/doc/bochs/bochsrc-sample.txt。参照用にコピーをローカルにコピーするか、作成者の構成を直接コピーします。

# Configuration file generated by Bochs
#=======================================================================
plugin_ctrl: unmapped=1, biosdev=1, speaker=1, extfpuirq=1, parallel=1, serial=1, iodebug=1

config_interface: textconfig
#display_library: wx
display_library: x

romimage: file=$BXSHARE/BIOS-bochs-latest, options=fastboot
romimage: file=/pgm/bochs/share/bochs/BIOS-bochs-latest
vgaromimage: file=/pgm/bochs/share/bochs/VGABIOS-lgpl-latest

# choose the boot disk
boot: floppy
floppy_bootsig_check: disabled=0
floppya: type=1_44, 1_44=/home/imaginemiracle/Miracle/Projects/imOS/img/imboot.img, status=inserted, write_protected=0

cpu: model=corei7_haswell_4770, count=1:1:1, ips=50000000, reset_on_triple_fault=1, ignore_bad_msrs=1, msrs="msrs.def"
cpu: cpuid_limit_winnt=0

cpuid: x86_64=1, mmx=1, level=6, sep=1, simd=sse4_2, apic=xapic, aes=1, movbe=1, xsave=1, apic=x2apic, sha=1, adx=1, xsaveopt=1, avx_f16c=1, avx_fma=1, bmi=bmi2, 1g_pages=1, pcid=1, fsgsbase=1, smep=1, smap=1, mwait=1, vmx=1
cpuid: family=6, model=0x1a, stepping=5, vendor_string="GenuineIntel", brand_string="Intel(R) Core(TM) i7-4770 CPU (Haswell)"

#memory: guest=512, host=256

pci: enabled=1, chipset=i440fx
vga: extension=vbe, update_freq=5
#voodoo: enabled=1, model=voodoo1

keyboard: type=mf, serial_delay=250, paste_delay=100000, user_shortcut=none
mouse: enabled=0, type=ps2, toggle=ctrl+mbutton

clock: sync=none, time0=local, rtc_sync=0
#cmosimage: file=cmos.img, rtc_init=time0

private_colormap: enabled=0

ata0: enabled=1, ioaddr1=0x1f0, ioaddr2=0x3f0, irq=14
ata0-master: type=none
ata0-slave: type=none
ata1: enabled=1, ioaddr1=0x170, ioaddr2=0x370, irq=15
ata1-master: type=none
ata1-slave: type=none
ata2: enabled=0, ioaddr1=0x1e8, ioaddr2=0x3e0, irq=11
ata3: enabled=0, ioaddr1=0x168, ioaddr2=0x360, irq=9

boot: floppy
#boot: disk
floppy_bootsig_check: disabled=0

#log: /dev/null
log: bochsout.txt
logprefix: %t%e%d

panic: action=ask
error: action=report
info: action=report
debug: action=ignore, pci=report # report BX_DEBUG from module 'pci'

debugger_log: -
#com1: enabled=1, mode=term, dev=/dev/ttyp9

parport1: enabled=1, file="parport.out"

#sound: driver=default, waveout=/dev/dsp. wavein=, midiout=
speaker: enabled=1, mode=system
parport1: enabled=1, file=none
parport2: enabled=0

com1: enabled=1, mode=null
com2: enabled=0
com3: enabled=0
com4: enabled=0
#e1000: enabled=1, mac=52:54:00:12:34:56, ethmod=slirp, script=slirp.conf

magic_break: enabled=0
#debug_symbols: file="kernel.sym"
print_timestamps: enabled=1
port_e9_hack: enabled=0
private_colormap: enabled=0

megs: 2048

の構成があり、ここの画像サイズとファイルパスは の前にツールによって作成されているfloppyaことに注意してください。ここのパスとサイズは正しく記述されていないと起動しません。bximageimboot.img

floppya: type=1_44, 1_44=/home/imaginemiracle/Miracle/Project/imOS/img/imboot.img, status=inserted, write_protected=0

5. 簡単なブート プログラムを作成する

新しいファイルを作成して開き、imboot.S以下にBIOS基づいてbootコードを記述します。

org	0x7c00 ; BIOS 会加载引导程序到内存地址 0x7c00 处

BaseOfStack	equ	0x7c00 ; 定义一个标识符 BaseOfStack,代表值 0x7c00

Start:

mov ax, cs	; 将代码寄存器 cs 的段基地址设置到 ds、es、ss寄存器
mov	ds, ax
mov es, ax
mov ss, ax
mov sp, BaseOfStack

; 清屏

mov ax, 0600h
mov bx, 0700h
mov cx, 0h
mov dx, 0184fh
int 10h

; 设置光标位置

mov ax, 0200h
mov bx, 0000h
mov dx, 0000h
int 10h

; 在屏幕上打印字符串 "The imboot is working!"

mov ax, 1301h
mov bx, 000fh
mov dx, 0000h
mov cx, 22
push ax
mov ax, ds
mov es, ax
pop ax
mov bp, IMBootMessage
int 10h

; 软盘驱动器复位

xor ah, ah
xor dl, dl
int 13h

jmp $

IMBootMessage:	dd	"The imboot is working!"

; 填充 0 到结尾前 2 个字节

times 510 - ($ - $$) db 0
dw 0xaa55	; BIOS会检测软盘的第 0 磁头第 1 扇区最后两个字节是否为 0x55aa(代码中写成 0xaa55 是由于x86 使用小端存储),以确定这个扇区是否是引导扇区

このアセンブリ コードは、主にBIOS割り込みサービス ルーチンint 10hと、画面操作とドライバのリセットをint 13h完了する使用します。

int 10hメイン関数番号を保持するレジスタを変更して、ah別の関数を使用する場合もint 13h同様です。

割り込みサービス メイン関数番号AH 機能説明 AL関数 BH関数 BL関数 CH関数 CL関数 DH関数 DL関数 ES:BP

INT 10h
02h カーソル位置を設定 ページ番号 - - - - カーソルの列番号 カーソルの行番号 -
INT 10h 06h 指定した範囲でウィンドウをスクロールする スクロールする列の数;画面をクリアすることを
意味し、現時点では他の属性は無効です0
スクロール後の空き位置のアトリビュート color 属性を設定します
:
* ビット 0~2: 文字色 (0: 黒 1: 青 2: 緑 3: 緑 4: 赤 5: 紫 6: 茶 7: 白) * ビット 3:
フォントの明るさ (0: デフォルト 1: ハイライト)
* ビット 4~6: 背景色 (色の値は上記と同じ)
* ビット 7: フォントの点滅 (0: オフ 1: 有効)
- スクロール範囲の左上隅の座標列番号 スクロール範囲の左上隅の座標線番号 スクロール範囲の右下隅の座標列番号 スクロール範囲の右下隅の座標行番号 -
INT 10h 13h 文字列の行を表示する 書き込みモード:
00h: 文字列プロパティがBL制御され、長さCXが (単位: バイト) によって制御され、カーソル位置は変更されません;
01h: 上記と同じですが、表示が終了し、カーソルが文字列の末尾に更新されます;
02h: 文字列は最後のバイトによって制御されます,CX制御単位を変更しWordます, カーソル位置は変更しません;
03h: 同じですが02h, カーソル位置を文字列の最後に更新します
ページ番号 文字属性、同じ06h 文字列の長さ 文字列の長さ カーソル位置の行番号 カーソルが置かれている列番号 表示する文字列のメモリアドレス
INT 13h 00h ディスクドライブをリセットする - - - - - - 00h: 最初のフロッピー ドライブ ( drive A:);
01h: 2 番目のフロッピー ドライブ ( drive B:);

7fh: 128 番目のフロッピー ドライブ;
80h: 最初のハード ドライブ;

ffh: 128 番目のハード ドライブ
-

6. Bochs で Boot プログラムを実行します。

6.1. NASM コンパイラをダウンロードしてインストールする

上記のコードを書きましたが、まだコンパイルされていません.コンパイラはNASMコンパイル、最初にインストールしましょう.
最初に他の依存関係をインストールします。それがUbuntusystem、sudo apt-get install build-essential直接使用できます

# Ubuntu 系统
imaginemiracle:~$ sudo apt-get install build-essential
imaginemiracle:~$ sudo apt-get install curl
# CentOS 系统
[imaginemiracle@imos-ws imboot]$ sudo yum install make automake gcc gcc-c++ kernel-devel
[imaginemiracle@imos-ws imboot]$ sudo yum install -y curl

nasmコンパイラをダウンロードしてインストールします。

[imaginemiracle@imos-ws Downloads]$ curl -O -L https://www.nasm.us/pub/nasm/releasebuilds/2.15/nasm-2.15.tar.gz
[imaginemiracle@imos-ws Downloads]$ tar -zxvf nasm-2.15.tar.gz
[imaginemiracle@imos-ws Downloads]$ cd nasm-2.15/
[imaginemiracle@imos-ws nasm-2.15]$ ./autogen.sh
[imaginemiracle@imos-ws nasm-2.15]$ ./configure --prefix=/pgm/nasm
[imaginemiracle@imos-ws nasm-2.15]$ make install

nasm環境変数に追加しvim ~/.bashrc、以下の内容を追加

export PATH=$PATH:/pgm/bochs/bin:/pgm/nasm/bin

環境変数を更新する

source ~/.bashrc

6.2. プログラムをコンパイルしてフロッピーディスクに書き込む

インストールしたばかりのnasmツールコードをコンパイルしますboot

[imaginemiracle@imos-ws imboot]$ nasm imboot.S -o imboot.bin
[imaginemiracle@imos-ws imboot]$ ls
imboot.bin  imboot.S

コンパイルによりバイナリ ファイルが生成されます。このファイルを以前に作成したフロッピーimboot.imgディスク。

[imaginemiracle@imos-ws img]$ dd if=../imboot/imboot.bin of=./imboot.img bs=512 count=1 conv=notrunc
1+0 records in
1+0 records out
512 bytes copied, 0.000104768 s, 4.9 MB/s

イメージ ファイルを開いて、プログラミングまたはコードの記述が正しいかどうかimboot.imgを確認します。

[imaginemiracle@imos-ws img]$ vim imboot.img

バイナリファイルのため、開いた際に「文字化け」が発生しますが、%!xxdツール16バイナリに変換して表示することで問題ありません。
ここに画像の説明を挿入
変換後、次のコンテンツが表示されます。

ここに画像の説明を挿入

主にチェックする必要があるのは、フロッピー ディスクの最初のセクターの最後の 2 バイトが であるかどうかです0x55aa。これは、ブート セクターの最後かどうかを示します。セクターの512サイズ、ここでは16行にバイトがあるため511512の最後にバイトとが表示されます。32( 512 / 16 = 32)

ここに画像の説明を挿入

わかりました。コードとプログラミングは問題ないようです。次のステップに進むことができます。

7. Bochs で Boot コードを開始する

bochsコマンドを使用して、構成ファイルを以前に書き込まれた構成ファイルとして指定します。

[imaginemiracle@imos-ws bochs-run]$ bochs -f bochsrc

実行後、次の出力が表示されます。

========================================================================
                        Bochs x86 Emulator 2.7
              Built from SVN snapshot on August  1, 2021
                Timestamp: Sun Aug  1 10:07:00 CEST 2021
========================================================================
00000000000i[      ] BXSHARE not set. using compile time default '/pgm/bochs/share/bochs'
00000000000i[      ] reading configuration from bochsrc
00000000000i[      ] Ignoring magic break points
------------------------------
Bochs Configuration: Main Menu
------------------------------

This is the Bochs Configuration Interface, where you can describe the
machine that you want to simulate.  Bochs has already searched for a
configuration file (typically called bochsrc.txt) and loaded it if it
could be found.  When you are satisfied with the configuration, go
ahead and start the simulation.

You can also start bochs with the -q option to skip these menus.

1. Restore factory default configuration
2. Read options from...
3. Edit options
4. Save options to...
5. Restore the Bochs state from...
6. Begin simulation
7. Quit now

Please choose one: [6]

ここでのデフォルトの選択は、6指定したイメージ ファイルの実行を開始することなので、ここで入力して Enter キーを押します。この時点で、黒い画面のインターフェイスが表示されるはずです.この時点で、コマンドラインにまたはを入力して、プログラムを実行するように指示する必要
ここに画像の説明を挿入
があります.ccontinuebochsboot
ここに画像の説明を挿入

この時点で、コード内の文字列が出力されThe imboot is working!ている。これは、Bootプログラムが実行されたことを意味します。
ここに画像の説明を挿入

#この記事の終わり

この時点で、プログラムのワークフローと、仮想マシンでの実際のシミュレーションをBIOSマスターしました。boot

この記事が役に立ったと思われる場合は、いいね
! ご協力ありがとうございます〜
[著者]: イマジン ミラクル
[著作権]: この作品は、「表示 - 非商用利用 - 継承 4.0 国際」ライセンス契約の下でライセンスされています。
[この記事へのリンク]: https://blog.csdn.net/qq_36393978/article/details/126260487

おすすめ

転載: blog.csdn.net/qq_36393978/article/details/126260487