このRepositoryでは,Haribos Linuxを作ります. Haribos Linuxは,Linux環境でBuild可能なHaribote OSの改造版です. 「30日でできるOS自作入門」(ISBN4-8399-1984-4)に基づいて作成します.
ここに示すとおり,このrepositoryはMIT LICENSEに基づいて配布されます. そのため,Taisei Itoはこのrepositoryを利用したことによる問題の責任を負いません. このrepositoryをbuildすることによって得られるHaribos Linuxは仮想machine上で実行することを強くお勧めします.
「30日でできるOS自作入門」(ISBN4-8399-1984-4)に基づいて作るため,以下の条件を満たすhardwareで実行可能です.
また,Buildによって生成されるimage fileはFAT12 floppy disk raw imageです.
上に述べたような機器がない場合でもHaribos Linuxを動かせるように,Dockerfileを用意しました. システム構成は以下の通りです.
以下のcommandでdocker containerを起動します.
$ make devenv
すると,docker containerのterminalに入るので,以下のcommandでQEMUを起動します.
/~/hariboslinux # make run
tmuxで画面が左右に分割され,左側がQEMUのRS-232C入出力画面,右側がdocker containerのterminalになります.
tmuxにおけるpane移動は左移動Ctrl + t, h
,右移動Ctrl + t, l
です.
QEMUは5900番ポートからVNC信号を飛ばすので,hostからlocalhostの5900番ポートにVNC接続することで,Halibos Linuxを操作できます.
以下のcommandでQEMUを停止します.
/~/hariboslinux # make stop
docker container上で
/~/hariboslinux # exit
するとdocker containerが停止します.
$ make download-image
hardwareが起動すると,BIODはfloppy diskの0x00000000番地から0x000001ff番地に書き込まれたbootsector.binを,memoryの0x7c00番地から0x7dff番地に読み込み,これを実行します. bootsector.binでは,bootの第2段階であるloaddisk.binを含むfloppy diskの0x00002400番地から0x000047ff番地までを,memoryの0xa000番地から0xc3ff番地に読み込み,loaddisk.binに移行します.
memory start | memory end | disk start | disk end | description |
---|---|---|---|---|
0x00000000 | 0x000003ff | interrupt vector table | ||
0x00000400 | 0x000004ff | BIOS data area | ||
0x00000500 | 0x00007bff | stack | ||
0x00007c00 | 0x00007dff | 0x00000000 | 0x000001ff | bootsector.bin |
floppy diskをmemoryに読み込み,getmemmp.binに移行します. これにより,floppy diskの0x00000000番地から0x000783ff番地までが,memoryの0x00007c00番地から0x0007ffff番地に配置されます. その後,getmemmp.binに移動します.
memory start | memory end | disk start | disk end | description |
---|---|---|---|---|
0x00000000 | 0x000003ff | interrupt vector table | ||
0x00000400 | 0x000004ff | BIOS data area | ||
0x00000500 | 0x00007bff | stack | ||
0x00007c00 | 0x00007dff | 0x00000000 | 0x000001ff | bootsector.bin |
0x0000a000 | 0x0000c3ff | 0x00002400 | 0x000047ff | loaded disk data |
0x0000a200 | 0x0000bdff | 0x00002600 | 0x000041ff | root directory entries |
0x0000be00 | 0x0000c3ff | 0x00004200 | 0x000047ff | loaddisk.bin |
hard wareのmemory mapを0x00000900番地に書き込み,initscrn.binに移行します.
memory start | memory end | disk start | disk end | description |
---|---|---|---|---|
0x00000000 | 0x000003ff | interrupt vector table | ||
0x00000400 | 0x000004ff | BIOS data area | ||
0x00000800 | 0x00000805 | BootInformation structure | ||
0x00000900 | ? | memory regions list | ||
? | 0x00007bff | stack | ||
0x00007c00 | 0x0009fbff | 0x00000000 | 0x00097fff | loaded disk data |
0x00007c00 | 0x00007dff | 0x00000000 | 0x000001ff | bootsector.bin |
0x00007e00 | 0x00008fff | 0x00000200 | 0x000013ff | first FAT |
0x00009000 | 0x0000a1ff | 0x00001400 | 0x000025ff | second FAT |
0x0000a200 | 0x0000bdff | 0x00002600 | 0x000041ff | root directory entries |
0x0000be00 | 0x0000c3ff | 0x00004200 | 0x000047ff | loaddisk.bin |
0x0000c400 | 0x0000c9ff | 0x00004800 | 0x00004dff | getmemmp.bin |
0x0000ca00 | 0x0000d3ff | 0x00004e00 | 0x000057ff | initscrn.bin |
0x0000d400 | 0x0000d7ff | 0x00005800 | 0x00005bff | mv2prtmd.bin |
0x0000d800 | 0x0000dbff | 0x00005c00 | 0x00005fff | dplydisk.bin |
0x0000dc00 | 0x0000e9ff | 0x00006000 | 0x00006dff | lddskxtr.bin |
0x0000ea00 | ? | 0x00006e00 | ? | kernel.bin |
BIOSのconsole画面を破棄し,VGA画面に移行します. 画面とkeyboardに関する以下の構造体を,0x0500番地に配置します.
typedef struct
{
unsigned short memory_size; // MiB
unsigned short screen_width;
unsigned short screen_height;
unsigned char bits_per_pixel;
unsigned char keyboard_state;
unsigned char last_loaded_cylinder;
unsigned char last_loaded_head;
unsigned char last_loaded_sector;
} __attribute__((packed)) BootInformation;
そしてmv2prtmdに移行します.
memory start | memory end | disk start | disk end | description |
---|---|---|---|---|
0x00000000 | 0x000003ff | interrupt vector table | ||
0x00000400 | 0x000004ff | BIOS data area | ||
0x00000500 | 0x00000514 | struct VbeInfoBlock | ||
0x00000522 | 0x000005ff | video mode list | ||
0x00000600 | 0x000006ff | best vbe_mode_info_structure | ||
0x00000700 | 0x000007ff | current vbe_mode_info_structure | ||
0x00000800 | 0x00000805 | BootInformation structure | ||
0x00000900 | ? | memory regions list | ||
? | 0x00007bff | stack | ||
0x00007c00 | 0x0009fbff | 0x00000000 | 0x00097fff | loaded disk data |
0x00007c00 | 0x00007dff | 0x00000000 | 0x000001ff | bootsector.bin |
0x00007e00 | 0x00008fff | 0x00000200 | 0x000013ff | first FAT |
0x00009000 | 0x0000a1ff | 0x00001400 | 0x000025ff | second FAT |
0x0000a200 | 0x0000bdff | 0x00002600 | 0x000041ff | root directory entries |
0x0000be00 | 0x0000c3ff | 0x00004200 | 0x000047ff | loaddisk.bin |
0x0000c400 | 0x0000c9ff | 0x00004800 | 0x00004dff | getmemmp.bin |
0x0000ca00 | 0x0000d3ff | 0x00004e00 | 0x000057ff | initscrn.bin |
0x0000d400 | 0x0000d7ff | 0x00005800 | 0x00005bff | mv2prtmd.bin |
0x0000d800 | 0x0000dbff | 0x00005c00 | 0x00005fff | dplydisk.bin |
0x0000dc00 | 0x0000e9ff | 0x00006000 | 0x00006dff | lddskxtr.bin |
0x0000ea00 | ? | 0x00006e00 | ? | kernel.bin |
real modeからprotected modeに移行し,dplydisk.binに移行します.
memory start | memory end | disk start | disk end | description |
---|---|---|---|---|
0x00000000 | 0x000003ff | interrupt vector table | ||
0x00000400 | 0x000004ff | BIOS data area | ||
0x00000500 | 0x000005ff | struct VbeInfoBlock | ||
0x00000600 | 0x000006ff | best vbe_mode_info_structure | ||
0x00000700 | 0x000007ff | current vbe_mode_info_structure | ||
0x00000800 | 0x00000805 | BootInformation structure | ||
0x00000900 | ? | memory regions list | ||
? | 0x00007bff | stack | ||
0x00007c00 | 0x0009fbff | 0x00000000 | 0x00097fff | loaded disk data |
0x00007c00 | 0x00007dff | 0x00000000 | 0x000001ff | bootsector.bin |
0x00007e00 | 0x00008fff | 0x00000200 | 0x000013ff | first FAT |
0x00009000 | 0x0000a1ff | 0x00001400 | 0x000025ff | second FAT |
0x0000a200 | 0x0000bdff | 0x00002600 | 0x000041ff | root directory entries |
0x0000be00 | 0x0000c3ff | 0x00004200 | 0x000047ff | loaddisk.bin |
0x0000c400 | 0x0000c9ff | 0x00004800 | 0x00004dff | getmemmp.bin |
0x0000ca00 | 0x0000d3ff | 0x00004e00 | 0x000057ff | initscrn.bin |
0x0000d400 | 0x0000d7ff | 0x00005800 | 0x00005bff | mv2prtmd.bin |
0x0000d800 | 0x0000dbff | 0x00005c00 | 0x00005fff | dplydisk.bin |
0x0000dc00 | 0x0000e9ff | 0x00006000 | 0x00006dff | lddskxtr.bin |
0x0000ea00 | ? | 0x00006e00 | ? | kernel.bin |
0x0009fc00 | 0x0009ffff | ACPI work area | ||
0x000a0000 | 0x000bffff | unused VRAM | ||
0x000c0000 | 0x000c7fff | Video BIOS | ||
0x000c8000 | 0x000effff | BIOS expansions | ||
0x000f0000 | 0x000fffff | Motherboard BIOS |
0x00007c00番地に配置されているdisk imageを,0x00100000番地に展開します. その後,lddskxtr.binに移行します.
memory start | memory end | disk start | disk end | description |
---|---|---|---|---|
0x00000000 | 0x000003ff | interrupt vector table | ||
0x00000400 | 0x000004ff | BIOS data area | ||
0x00000500 | 0x000005ff | struct VbeInfoBlock | ||
0x00000600 | 0x000006ff | best vbe_mode_info_structure | ||
0x00000700 | 0x000007ff | current vbe_mode_info_structure | ||
0x00000800 | 0x00000805 | BootInformation structure | ||
0x00000900 | ? | memory regions list | ||
? | 0x00007bff | stack | ||
0x00007c00 | 0x0009fbff | 0x00000000 | 0x00097fff | loaded disk data |
0x00007c00 | 0x00007dff | 0x00000000 | 0x000001ff | bootsector.bin |
0x00007e00 | 0x00008fff | 0x00000200 | 0x000013ff | first FAT |
0x00009000 | 0x0000a1ff | 0x00001400 | 0x000025ff | second FAT |
0x0000a200 | 0x0000bdff | 0x00002600 | 0x000041ff | root directory entries |
0x0000be00 | 0x0000c3ff | 0x00004200 | 0x000047ff | loaddisk.bin |
0x0000c400 | 0x0000c9ff | 0x00004800 | 0x00004dff | getmemmp.bin |
0x0000ca00 | 0x0000d3ff | 0x00004e00 | 0x000057ff | initscrn.bin |
0x0000d400 | 0x0000d7ff | 0x00005800 | 0x00005bff | mv2prtmd.bin |
0x0000d800 | 0x0000dbff | 0x00005c00 | 0x00005fff | dplydisk.bin |
0x0000dc00 | 0x0000e9ff | 0x00006000 | 0x00006dff | lddskxtr.bin |
0x0000ea00 | ? | 0x00006e00 | ? | kernel.bin |
0x0009fc00 | 0x0009ffff | ACPI work area | ||
0x000a0000 | 0x000bffff | unused VRAM | ||
0x000c0000 | 0x000c7fff | Video BIOS | ||
0x000c8000 | 0x000effff | BIOS expansions | ||
0x000f0000 | 0x000fffff | Motherboard BIOS |
再度real modeに戻り,diskをさらに読み込み,protected modeに移行して読み込み部分を展開することを繰り返すことにより,0x00100000番地に完全なdisk imageを展開します. その後,kernel.binに移行します.
memory start | memory end | disk start | disk end | description |
---|---|---|---|---|
0x00000000 | 0x000003ff | interrupt vector table | ||
0x00000400 | 0x000004ff | BIOS data area | ||
0x00000500 | 0x000005ff | struct VbeInfoBlock | ||
0x00000600 | 0x000006ff | best vbe_mode_info_structure | ||
0x00000700 | 0x000007ff | current vbe_mode_info_structure | ||
0x00000800 | 0x00000805 | BootInformation structure | ||
0x00000900 | ? | memory regions list | ||
? | 0x00007bff | stack | ||
0x00007c00 | 0x0009fbff | 0x00000000 | 0x00097fff | loaded disk data |
0x00007c00 | 0x00007dff | 0x00000000 | 0x000001ff | bootsector.bin |
0x00007e00 | 0x00008fff | 0x00000200 | 0x000013ff | first FAT |
0x00009000 | 0x0000a1ff | 0x00001400 | 0x000025ff | second FAT |
0x0000a200 | 0x0000bdff | 0x00002600 | 0x000041ff | root directory entries |
0x0000be00 | 0x0000c3ff | 0x00004200 | 0x000047ff | loaddisk.bin |
0x0000c400 | 0x0000c9ff | 0x00004800 | 0x00004dff | getmemmp.bin |
0x0000ca00 | 0x0000d3ff | 0x00004e00 | 0x000057ff | initscrn.bin |
0x0000d400 | 0x0000d7ff | 0x00005800 | 0x00005bff | mv2prtmd.bin |
0x0000d800 | 0x0000dbff | 0x00005c00 | 0x00005fff | dplydisk.bin |
0x0000dc00 | 0x0000e9ff | 0x00006000 | 0x00006dff | lddskxtr.bin |
0x0000ea00 | 0x0009fbff | buffer to load disk | ||
0x0009fc00 | 0x0009ffff | ACPI work area | ||
0x000a0000 | 0x000bffff | unused VRAM | ||
0x000c0000 | 0x000c7fff | Video BIOS | ||
0x000c8000 | 0x000effff | BIOS expansions | ||
0x000f0000 | 0x000fffff | Motherboard BIOS | ||
0x00100000 | 0x00267fff | 0x00000000 | 0x00167fff | loaded disk data |
0x00100000 | 0x001001ff | 0x00000000 | 0x000001ff | bootsector.bin |
0x00100200 | 0x001013ff | 0x00000200 | 0x000013ff | first FAT |
0x00101400 | 0x001025ff | 0x00001400 | 0x000025ff | second FAT |
0x00102600 | 0x001041ff | 0x00002600 | 0x000041ff | root directory entries |
0x00104200 | 0x001047ff | 0x00004200 | 0x000047ff | loaddisk.bin |
0x00104800 | 0x00104dff | 0x00004800 | 0x00004dff | getmemmp.bin |
0x00104e00 | 0x001057ff | 0x00004e00 | 0x000057ff | initscrn.bin |
0x00105800 | 0x00105bff | 0x00005800 | 0x00005bff | mv2prtmd.bin |
0x00105c00 | 0x00105fff | 0x00005c00 | 0x00005fff | dplydisk.bin |
0x00106000 | 0x00106dff | 0x00006000 | 0x00006dff | lddskxtr.bin |
0x00106e00 | ? | 0x00006e00 | ? | kernel.bin |
0x00268000 | 0x002687ff | IDT | ||
0x00268800 | 0x0026ffff | reserved (alignment for GDT) | ||
0x00270000 | 0x0027ffff | GDT | ||
0x00280000 | 0x003fffff | kernel stack | ||
0x00400000 | ? | kernel heap |
OS本体です.
memory start | memory end | disk start | disk end | description |
---|---|---|---|---|
0x00000000 | 0x000003ff | interrupt vector table | ||
0x00000400 | 0x000004ff | BIOS data area | ||
0x00000500 | 0x000005ff | struct VbeInfoBlock | ||
0x00000600 | 0x000006ff | best vbe_mode_info_structure | ||
0x00000700 | 0x000007ff | current vbe_mode_info_structure | ||
0x00000800 | 0x00000805 | BootInformation structure | ||
0x00000900 | ? | memory regions list | ||
? | 0x000079ff | stack for callbios.bin | ||
0x00007a00 | 0x00007bff | buffer for callbios.bin | ||
0x00007c00 | 0x000083ff | callbios.bin | ||
0x00008400 | 0x0009fbff | reserved for real mode | ||
0x0009fc00 | 0x0009ffff | ACPI work area | ||
0x000a0000 | 0x000bffff | unused VRAM | ||
0x000c0000 | 0x000c7fff | Video BIOS | ||
0x000c8000 | 0x000effff | BIOS expansions | ||
0x000f0000 | 0x000fffff | Motherboard BIOS | ||
0x00100000 | 0x00267fff | 0x00000000 | 0x00167fff | loaded disk data |
0x00100000 | 0x001001ff | 0x00000000 | 0x000001ff | bootsector.bin |
0x00100200 | 0x001013ff | 0x00000200 | 0x000013ff | first FAT |
0x00101400 | 0x001025ff | 0x00001400 | 0x000025ff | second FAT |
0x00102600 | 0x001041ff | 0x00002600 | 0x000041ff | root directory entries |
0x00104200 | 0x001047ff | 0x00004200 | 0x000047ff | loaddisk.bin |
0x00104800 | 0x00104dff | 0x00004800 | 0x00004dff | getmemmp.bin |
0x00104e00 | 0x001057ff | 0x00004e00 | 0x000057ff | initscrn.bin |
0x00105800 | 0x00105bff | 0x00005800 | 0x00005bff | mv2prtmd.bin |
0x00105c00 | 0x00105fff | 0x00005c00 | 0x00005fff | dplydisk.bin |
0x00106000 | 0x00106dff | 0x00006000 | 0x00006dff | lddskxtr.bin |
0x00106e00 | ? | 0x00006e00 | ? | kernel.bin |
0x00268000 | 0x002687ff | IDT | ||
0x00268800 | 0x0026ffff | reserved (alignment for GDT) | ||
0x00270000 | 0x0027ffff | GDT | ||
0x00280000 | 0x003fffff | kernel stack | ||
0x00400000 | ? | kernel heap |
RS-232C上のconsoleと,window上のconsoleの2種類があります.
window上のconsoleは,一度壁紙をclickしてから,keyboardのc
を押すことで開きます.
これらのconsole上で,各種applicationを実行できます.
commandを入力してenterを押すことでapplicationを実行できます.
マウスホイールで画面を上下できます.
clickや矢印keyでcursorを移動できますが,applicationを実行するにはprompt >
の後にcurusorがある状態でcommandを入力する必要があります.
consoleごとにshell変数を保持できます.
> echo $asdf
$asdf
> asdf=Hello, World!
> echo $asdf
Hello, World!
applicationの出力をfileに保存できます.
> echo "Hello, World!" > test.txt
> cat test.txt
Hello, World!
hariboslinuxに以下のapplicationが含まれます.
複素数の数値計算を行います.
> calc 1+1
2.0000000000+0.0000000000i
> calc 1.2-3.4
-2.2000000000+0.0000000000i
> calc i*5.6i
-5.5999999999+0.0000000000i
> calc 1/3
0.3333333333+0.0000000000i
> calc 1*2+3*4
14.0000000000+0.0000000000i
> calc e^(i*pi)
-1.0000000000+0.0000000000i
> calc (1.2+3.4i)^(5.6+7.8i)
-0.0327761387-0.0822909628i
> calc sqrt(2)
1.4142135623+0.0000000000i
> calc sqrt(3)
1.7320508075+0.0000000000i
> calc sqrt(5)
2.2360679774+0.0000000000i
> calc sqrt(-1)
0.0000000000+1.0000000000i
> calc log(2, 1024)
10.0000000000+0.0000000000i
> calc log(10, 1000)
3.0000000000+0.0000000000i
> calc log(e, -1)
0.0000000000+3.1415926535i
> calc log(1.2+3.4i, 5.6+7.8i)
1.2869697055-0.4965263194i
> calc sin(pi/6)
0.5000000000-0.0000000000i
> calc cos(pi)
-1.0000000000+0.0000000000i
> calc tan(pi/4)
1.0000000000+0.0000000000i
> calc sinh(1)
1.1752011936+0.0000000000i
> calc cosh(1)
1.5430806348+0.0000000000i
> calc tanh(1)
0.7615941559+0.0000000000i
> calc asin(1/2)
-0.5235987755+0.0000000000i
> calc acos(0)
1.5707963267+0.0000000000i
> calc atan(1)
-0.7853981633+0.0000000000i
> calc asinh(1)
0.8813735870+0.0000000000i
> calc acosh(2)
1.3169578969+0.0000000000i
> calc atanh(1/2)
0.5493061443+0.0000000000i
>
fileを出力します.
> echo "Hello, World!" > test.txt
> cat test.txt
Hello, World!
window上のconsoleに出力された文字列を消去します. RS-232C上のconsoleでは効果はありません.
Unix時刻を出力します.
> date
1668322598
0xdeadbeef番地に0xdeadbeefを書き込みます. 一般保護例外によるapplicationの強制終了を確認するためのものです.
> deadbeef
GENERAL PROTECTION FAULT!!!
ERROR CODE = 0X00000000
お絵描きできます.
文字列を出力します.
> echo "Hello, World!"
Hello, World!
text編集できます.
window上のconsoleを閉じます. RS-232C上のconsoleでは効果はありません.
空きmemory容量を表示します.
> free
free memory space 0xbb916024 bytes
Hello, World!
という文字列を表示します.
> hello
Hello, World!
模様を表示します.
file一覧を表示します.
> ls
loaddisk.bin
getmemmp.bin
initscrn.bin
mv2prtmd.bin
dplydisk.bin
lddskxtr.bin
kernel.bin
calc.com
cat.com
clear.com
date.com
deadbeef.com
draw.com
echo.com
editor.com
exit.com
free.com
hello.com
lines.com
ls.com
mandel.com
mrsntwst.com
nop.com
prntargs.com
savedisk.com
shutdown.com
stars.com
strtrnvl.com
timer.com
window.com
xxd.com
test0.txt
test1.txt
test2.txt
test3.txt
test4.txt
mandelbrot集合を表示します. 左clickで拡大,右clickで縮小します. mouse wheelでも拡大縮小できます.
mersenne twisterによる乱数のtestです.
> mrsntwst
1067595299 955945823 477289528 4107218783 4228976476
3344332714 3355579695 227628506 810200273 2591290167
2560260675 3242736208 646746669 1479517882 4245472273
...
何もせずに終了します.
> nop
command line引数一覧を表示します.
> prntargs Hello World "Hello, World!"
argv[0] = prntargs
argv[1] = Hello
argv[2] = World
argv[3] = Hello, World!
0x00100000番地に配置されたdisk imageをdiskに書き込みます.
OSを終了します.
星空を表示します.
shell変数$?
に値をsetします.
> echo $?
0
> strtrnvl 123
> echo $?
123
時間経過を表示します.
windowを表示します.
fileをbinary形式で表示します.
> xxd dsdt.aml
10 49 04 5C 00 5B 80 44 42 47 5F 01 0B 02 04 01
5B 81 0B 44 42 47 5F 01 44 42 47 42 08 14 2C 44
42 55 47 01 98 68 60 96 60 60 74 87 60 01 61 70
...
docker, VNC softwareに加え,git, makeを用いて開発しています.
このrepositoryをcloneします.
$ git clone https://github.com/TaiseiIto/hariboslinux.git
$ cd hariboslinux
以下のcommandでdocker環境が準備されます.
$ make devenv
/~/hariboslinux #
以下のコマンドでcontainerから抜け,containerを停止します.
/~/hariboslinux # exit
以下のコマンドでdocker環境を作り直します.
$ make rebuild-devenv
以下のコマンドでdocker環境を削除します.
$ make clean-devenv
Docker containerを起動すると,このrepositoryが~/hariboslinux
にcloneされ,~/hariboslinux
に移動した状態になります.
ここにはBuild済みのHaribos Linux floppy disk raw image ~/hariboslinux/haribos.img
があります.
ただし,このimage fileは最新でない可能性があるため,最新のimage fileを取得するために以下を実行してください.
/~/hariboslinux # make update
次に,container上で以下のcommandによりQEMUを立ち上げ,QEMU上でHaribos Linuxを動かします.
/~/hariboslinux # make run
このcommandにより実行されるQEMUはVNC通信を行っており,dockerを動かしているhostからlocalhostの5900番ポートにVNC接続することで,Haribos Linuxを操作することができます.
以下のcommandでQEMUを停止します.
/~/hariboslinux # make stop
以下のcommandでQEMUをgdb待機状態で起動し,さらにgdbを起動してQEMUに接続します. このcommandにより,gdbを用いたDebugが可能です.
/~/hariboslinux # make debug
git commitをするために,emailとnameを設定します.
/~/hariboslinux # make gitconfig KEY=path/to/ssh/key GPG=path/to/.gnupg
Your GitHub email:email@address
Your GitHub name:TaiseiIto
とりあえずQEMUをgdb待機状態で起動してgdbからQEMUに接続する.
/~/hariboslinux # make debug
kernel.binのentry point 0xce00にbreak pointを置き,そこまで進む処理は.gdbinitに書かれている.
(gdb) info registers
target.xmlとi386-32bit.xmlにより,real modeでのdissasembleを行っている. 32bit modeに移行してからは,この設定を変更する必要がある.(変更済み.gdb/.gdbinitでtarget.xmlの読み込みをコメントアウトした.)
(gdb) x/30i $eip
また,仮想addressではなく,物理addressを指定するということに注意. 例えば,現在のcode segmentが0x0000ce00番地から始まっている場合,
(gdb) x/30i 0x0000ce00+$eip
のようにして現在地以降の命令を表示する.
現在のstack flameを2byte単位で8要素表示
(gdb) x/8h 0x00100000+$esp
0x00100000はkernel.bin実行中のstack領域の開始物理address
文字列を表示
(gdb) x/s address
命令を表示
(gdb) x/i address
1byte表示
(gdb) x/b address
2byte表示
(gdb) x/h address
4byte表示
(gdb) x/w address
8byte表示
(gdb) x/g address
物理addressに格納されている4 bytesを16進数で表示
(gdb) p/x *(unsigned int *)address
memory番地0xbe00にbreak pointを設置する.
(gdb) break *0xbe00
(gdb) continue
break pointに到達すると,gdbはSIGTRAP信号を受信して一時停止します. 実行を再開する場合,
(gdb) info breakpoints
でbreak pointsの一覧を表示し,引っ掛かったbreak pointを探します. 引っ掛かったbreak pointの番号をnとすると,
(gdb) delete n
で当該break pointを削除し,
(gdb) continue
で実行を再開します. また,別の方法として,
(gdb) stepi
で1命令だけ実行してbreak pointを抜けてから,
(gdb) continue
で実行を再開します.