[Mise en œuvre du système d'exploitation 01] CentOS 9 installe et configure la machine virtuelle Bochs 2.7, et écrit un chargeur de démarrage simple et l'écrit sur une disquette pour le démarrage

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

1. Machine virtuelle Bochs

BochsC'est un logiciel de machine virtuelle open source, et il fournit des fonctions de débogage connexes qui sont bénéfiques pour le développement du système. Si vous êtes également un lecteur qui étudie le système d'exploitation ou qui s'intéresse Linuxau noyau le contenu du développement.
Lien de téléchargement :
Site officiel de Bochs : https://bochs.sourceforge.io/
Téléchargement Sourceforge : https://sourceforge.net/projects/bochs/files/bochs/
Téléchargement Github : https://github.com/stlintel/Bochs

2. Compiler et installer Bochs

L'auteur choisit de télécharger sourceforgesur

2.2. Décompresser le paquet source

Après le téléchargement, vous devez décompresser le package source.

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

2.3. Installer les dépendances et configurer Bochs

Installez les dépendances associées, sinon la configuration ou la compilation manquera de dépendances en premier.

[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. Utiliser configure pour générer Makefile

Entrez le répertoire du code source après décompression et utilisez configurepour configurer le code source. Ici, l'auteur utilise --prefixpour configurer le répertoire d'installation à un emplacement spécifié. Les lecteurs qui n'ont pas besoin de spécifier n'ont pas besoin d'ajouter ce paramètre.

[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 faire compiler

Une fois que la configuration ne signale pas d'erreur, elle peut être compilée directement.

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

2.3.3. 报错:Aucune règle pour créer la cible 'parser.cc', nécessaire à 'parser.o'.

Vous pouvez rencontrer des erreurs comme celle-ci ou similaire lors de la compilation :

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

2.3.4. Résoudre le problème de no parser.cc

Copiez simplement le .cppfichier en tant .ccque fichier :

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

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

2.3.5. Continuer à créer, continuer à signaler une erreur : erreur fatale : config.h : aucun fichier ou répertoire de ce type

Continuez à exécuter makela commande , mais il y aura à nouveau une telle erreur : l'invite est introuvableconfig.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. Résoudre le problème de ne pas trouver config.h

A propos de ce fichier d'en-tête, nous pouvons le voir dans le répertoire principal du code source

[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

Ouvrir le fichier d'erreur

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

Modifiez simplement le dans la 25ligne #include "config.h"pour #include "../config.h"qu'il soit .
insérez la description de l'image ici

2.3.7. Continuer à créer, continuer à signaler les erreurs : erreur fatale : osdep.h : aucun fichier ou répertoire de ce type et erreur fatale : cpu/decoder/decoder.h : aucun fichier ou répertoire de ce type

Il existe deux autres erreurs similaires à la précédente, qui peuvent également être trouvées dans le répertoire principal osdep.h, donc ouvrez bx_debug/debug.het #include “osdep.h”changez en , et modifiez #include "../osdep.h"la 36ligne de .#include "cpu/decoder/decoder.h"
insérez la description de l'image ici

2.3.8. Continuez à faire, s'il est correct, il signalera une erreur : Aucune règle pour créer la cible 'misc/bximage.cc', nécessaire à 'misc/bximage.o' et une série de problèmes de ce type

Ce type de problème est similaire à la première erreur, et il y aura un .cppfichier , .cccopiez-le simplement en tant que fichier.

[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. Continuer à créer et installer après make install

Il ne makedevrait , exécutez make installla commande pour installer.

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

Vérifiez le répertoire d'installation. Si vous utilisez le répertoire d'installation par défaut, vous pouvez le saisir directement bochet utiliser tabla clé pour le compléter.

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

OK, si vous voyez un fichier exécutable généré ici, cela signifie bochsqu'il est installé.

3. Créer un fichier image de disquette

Celui que nous venons Bochsd'installer est livré avec un bximageoutil appelé , qui est utilisé pour créer des images de machines virtuelles.

Regardons la méthode d'utilisation spécifique :
(1) Exécuter directement bximage(s'il est installé dans un répertoire spécifié comme l'auteur, vous devez d'abord l'ajouter au ~/.bashrcfichier et mettre à jour la variable d'environnement source ~/.bashrc, par exemple : 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) Entrée signifie ici 1choisir de créer une disquette ou un disque dur, appuyez sur Entrée et le contenu suivant apparaîtra ;

Create image

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

(3) Ici choisissons si le type de création est une disquette ( fd) ou un disque dur ( hd), entrez ici fdet Entrée ;

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) Ensuite, il vous sera demandé de choisir la taille de la disquette créée, la valeur par défaut est 1.44MB, appuyez simplement sur Entrée ici pour utiliser la valeur par défaut ;

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) L'étape suivante demandera quel est le nom de la disquette créée. Le nom par défaut est a.imgle nom entré par l'auteur ici imboot.img, car cette disquette servira de bootprogramme .

ok, ici le fichier image de la disquette est créé.

4. Configuration de l'environnement d'exploitation Bochs

BochsUn fichier de configuration pour notre référence sera fourni dans le répertoire d'installation /pgm/bochs/share/doc/bochs/bochsrc-sample.txtde , copiez une copie dans le local pour référence ou copiez directement la configuration de l'auteur.

# 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

Il convient de noter qu'il existe floppyaune configuration de , la taille de l'image et le chemin du fichier ici sont bximagecréés par l'outil avant imboot.img, et le chemin et la taille ici doivent être écrits correctement, sinon il ne démarrera pas.

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

5. Écrivez un programme de démarrage simple

Créez et ouvrez un nouveau fichier , et écrivez du code baséimboot.S sur :BIOSboot

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 使用小端存储),以确定这个扇区是否是引导扇区

Ce code d'assemblage utilise principalement la routine de service BIOSd'interruption int 10het la fonction de int 13hterminer l'opération d'écran et la réinitialisation du pilote.

Il en va de même pour l'utilisation de différentes fonctions en modifiant le registre int 10hcontenant le numéro de la fonction principale.ahint 13h

interrompre le service Numéro de la fonction principale AHValeur Mode d'emploi ALFonction BHFonction BLFonction CHFonction CLFonction DHFonction DLFonction ES:BP

INT 10h
02h définir la position du curseur numéro de page - - - - le numéro de colonne du curseur le numéro de ligne du curseur -
INT 10h 06h Faire défiler la fenêtre par la plage spécifiée Le nombre de colonnes de défilement ;
signifie 0pour effacer l'écran et d'autres attributs ne sont pas valides pour le moment
Définissez l'attribut couleur de la position vide après défilement
:
* bit 0~2 : couleur de la police (0 : noir 1 : bleu 2 : vert 3 : vert 4 : rouge 5 : violet 6 : marron 7 : blanc) * bit 3 :
police Luminosité (0 : par défaut 1 : surbrillance)
* bit 4~6 : couleur d'arrière-plan (la valeur de la couleur est la même que ci-dessus)
* bit 7 : police clignotante (0 : désactivé 1 : activé)
- Le numéro de colonne de coordonnées du coin supérieur gauche de la plage de défilement Numéro de ligne de coordonnées du coin supérieur gauche de la plage de défilement Le numéro de colonne de coordonnées du coin inférieur droit de la plage de défilement Le numéro de la ligne de coordonnées du coin inférieur droit de la plage de défilement -
INT 10h 13h afficher une ligne de chaîne Mode écriture :
00h : la propriété de chaîne est BLcontrôlée par et la longueur CXest contrôlée par (unité : octet), la position du curseur n'est pas modifiée ;
01h : comme ci-dessus, mais l'affichage se termine et le curseur est mis à jour à la fin de la chaîne ;
02h: la chaîne est contrôlée par son dernier octet, CXChangez l'unité de contrôle Word, ne changez pas la position du curseur ;
03h: idem 02h, mais mettez à jour la position du curseur à la fin de la chaîne
numéro de page attributs de caractère, identiques à06h Longueur de chaine Longueur de chaine Le numéro de ligne où se trouve le curseur Le numéro de la colonne où se trouve le curseur L'adresse mémoire de la chaîne à afficher
INT 13h 00h réinitialiser le lecteur de disque - - - - - - 00h: premier lecteur de disquette ( drive A:);
01h: deuxième lecteur de disquette ( drive B:);

7fh: 128e lecteur de disquette;
80h: premier disque dur;

ffh: 128e disque dur
-

6. Exécutez le programme Boot sur Bochs

6.1. Téléchargez et installez le compilateur NASM

Nous avons écrit le code ci-dessus, mais il n'a pas encore été compilé. Le compilateur sera utilisé pour NASMla compilation , alors installons-le d'abord.
Installez d'abord les autres dépendances : s'il s'agit Ubuntud'un système , vous pouvez l'utiliser sudo apt-get install build-essentialdirectement

# 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

Téléchargez et installez nasmle compilateur .

[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

Ajoutez nasmà la variable d'environnement vim ~/.bashrc, ajoutez le contenu suivant

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

mettre à jour les variables d'environnement

source ~/.bashrc

6.2. Compilez le programme et gravez-le sur la disquette

Compilez le code avec nasmles outils boot:

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

La compilation va générer un fichier binaire, gravez ce fichier dans la imboot.imgdisquette :

[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

Ouvrez le fichier image imboot.imgpour vérifier si la programmation ou l'écriture du code est correcte.

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

Parce que le fichier est un fichier binaire, vous verrez des "caractères brouillés" après l'avoir ouvert. Peu importe, vous pouvez utiliser %!xxdl'outil convertir en 16binaire pour l'affichage.
insérez la description de l'image ici
Après la conversion, nous pouvons voir le contenu suivant.

insérez la description de l'image ici

Ce que nous devons vérifier, c'est principalement si les deux derniers octets du premier secteur de la disquette sont 0x55aa, ce qui marque s'il s'agit de la fin du secteur de démarrage. Un secteur a une 512taille , et ici il y a 16des octets dans une ligne, donc les octets 511et 512doivent apparaître à la fin de 32la ligne . ( 512 / 16 = 32)

insérez la description de l'image ici

ok, il semble que notre code et notre programmation soient corrects, nous pouvons passer à l'étape suivante.

7. Démarrez notre code de démarrage avec Bochs

Utilisez bochsla commande et spécifiez le fichier de configuration en tant que fichier de configuration précédemment écrit.

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

Après l'exécution, il y aura la sortie suivante :

========================================================================
                        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]

Le choix par défaut ici est 6de commencer à exécuter le fichier image que nous avons donné, il suffit donc d'entrer et d'appuyer sur Entrée ici.
insérez la description de l'image ici
À ce moment, vous devriez voir une interface à écran noir.À ce moment, vous devez continuer à entrer cou continuepour indiquer bochsExécuter bootle programme.
insérez la description de l'image ici

À ce moment, vous pouvez voir que la chaîne dans le code The imboot is working!a été imprimée, ce qui signifie que Bootle programme a été exécuté.
insérez la description de l'image ici

#Fin de cet article

À ce stade, vous avez BIOSmaîtrisé bootle flux de travail du programme et , ainsi que la simulation proprement dite sur la machine virtuelle.

Si vous pensez que cet article vous est utile, veuillez laisser un j'aime ^ v ^ *
Veuillez respecter l'auteur et veuillez indiquer la source lors de la réimpression! Merci pour votre coopération ~
[Auteur] : Imagine Miracle
[Copyright] : Ce travail est sous licence sous l'accord de licence "Attribution-Non-Commercial Use-Share Alike 4.0 International".
[Lien vers cet article] : https://blog.csdn.net/qq_36393978/article/details/126260487

Je suppose que tu aimes

Origine blog.csdn.net/qq_36393978/article/details/126260487
conseillé
Classement