系统环境:
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
インストール ディレクトリを確認する デフォルトのインストール ディレクトリを使用している場合は、ディレクトリを直接入力しboch
、tab
キーを使用してディレクトリを完成させることができます。
[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.img
boot
これでフロッピー ディスクのイメージ ファイルが作成されました。
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
ことに注意してください。ここのパスとサイズは正しく記述されていないと起動しません。bximage
imboot.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
コンパイル、最初にインストールしましょう.
最初に他の依存関係をインストールします。それがUbuntu
system、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
行にバイトがあるため511
、行512
の最後にバイトとが表示されます。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 キーを押します。この時点で、黒い画面のインターフェイスが表示されるはずです.この時点で、コマンドラインにまたはを入力して、プログラムを実行するように指示する必要
があります.c
continue
bochs
boot
この時点で、コード内の文字列が出力されThe imboot is working!
ている。これは、Boot
プログラムが実行されたことを意味します。
#この記事の終わり
この時点で、プログラムのワークフローと、仮想マシンでの実際のシミュレーションをBIOS
マスターしました。boot
この記事が役に立ったと思われる場合は、いいね
! ご協力ありがとうございます〜
[著者]: イマジン ミラクル
[著作権]: この作品は、「表示 - 非商用利用 - 継承 4.0 国際」ライセンス契約の下でライセンスされています。
[この記事へのリンク]: https://blog.csdn.net/qq_36393978/article/details/126260487