系统环境:
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
Bochs
C'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 Linux
au 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 sourceforge
sur
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 configure
pour configurer le code source. Ici, l'auteur utilise --prefix
pour 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 .cpp
fichier en tant .cc
que 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 make
la 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 25
ligne #include "config.h"
pour #include "../config.h"
qu'il soit .
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.h
et #include “osdep.h”
changez en , et modifiez #include "../osdep.h"
la 36
ligne de .#include "cpu/decoder/decoder.h"
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 .cpp
fichier , .cc
copiez-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 make
devrait , exécutez make install
la 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 boch
et utiliser tab
la 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 bochs
qu'il est installé.
3. Créer un fichier image de disquette
Celui que nous venons Bochs
d'installer est livré avec un bximage
outil 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 ~/.bashrc
fichier 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 1
choisir 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 fd
et 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.img
le nom entré par l'auteur ici imboot.img
, car cette disquette servira de boot
programme .
ok, ici le fichier image de la disquette est créé.
4. Configuration de l'environnement d'exploitation Bochs
Bochs
Un fichier de configuration pour notre référence sera fourni dans le répertoire d'installation /pgm/bochs/share/doc/bochs/bochsrc-sample.txt
de , 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 floppya
une configuration de , la taille de l'image et le chemin du fichier ici sont bximage
créé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 :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 使用小端存储),以确定这个扇区是否是引导扇区
Ce code d'assemblage utilise principalement la routine de service BIOS
d'interruption int 10h
et la fonction de int 13h
terminer 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 10h
contenant le numéro de la fonction principale.ah
int 13h
interrompre le service | Numéro de la fonction principale AH Valeur |
Mode d'emploi | AL Fonction |
BH Fonction |
BL Fonction |
CH Fonction |
CL Fonction |
DH Fonction |
DL Fonction |
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 0 pour 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 BL contrôlée par et la longueur CX est 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, CX Changez 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 NASM
la compilation , alors installons-le d'abord.
Installez d'abord les autres dépendances : s'il s'agit Ubuntu
d'un système , vous pouvez l'utiliser sudo apt-get install build-essential
directement
# 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 nasm
le 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 nasm
les 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.img
disquette :
[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.img
pour 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 %!xxd
l'outil convertir en 16
binaire pour l'affichage.
Après la conversion, nous pouvons voir le contenu suivant.
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 512
taille , et ici il y a 16
des octets dans une ligne, donc les octets 511
et 512
doivent apparaître à la fin de 32
la ligne . ( 512 / 16 = 32
)
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 bochs
la 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 6
de commencer à exécuter le fichier image que nous avons donné, il suffit donc d'entrer et d'appuyer sur Entrée ici.
À ce moment, vous devriez voir une interface à écran noir.À ce moment, vous devez continuer à entrer c
ou continue
pour indiquer bochs
Exécuter boot
le programme.
À ce moment, vous pouvez voir que la chaîne dans le code The imboot is working!
a été imprimée, ce qui signifie que Boot
le programme a été exécuté.
#Fin de cet article
À ce stade, vous avez BIOS
maîtrisé boot
le 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