Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

OS自作入門をやる #6

Closed
tomoyuki-nakabayashi opened this issue Jun 9, 2018 · 21 comments
Closed

OS自作入門をやる #6

tomoyuki-nakabayashi opened this issue Jun 9, 2018 · 21 comments

Comments

@tomoyuki-nakabayashi
Copy link
Owner

基本に立ち返ろう。

30日でできる!OS自作入門(1日目)[Ubuntu16.04/NASM]

上を参考にまず、環境構築する。

@tomoyuki-nakabayashi
Copy link
Owner Author

まず、環境(バイナリエディタ、qemu、アセンブラのインストール

sudo apt install ghex
sudo apt install qemu
sudo apt install nasm

@tomoyuki-nakabayashi
Copy link
Owner Author

tomoyuki-nakabayashi commented Jun 9, 2018

OK。無事動いた。

qemu-system-i386 helloos.img

@tomoyuki-nakabayashi
Copy link
Owner Author

tomoyuki-nakabayashi commented Jun 9, 2018

hello_os.asmをnasmでアセンブルして動かす。

$ nasm hello_os.asm -o helloos.img
hello_os.asm:22: warning: uninitialized space declared in .text section: zeroing
hello_os.asm:39: warning: uninitialized space declared in .text section: zeroing
hello_os.asm:46: warning: uninitialized space declared in .text section: zeroing
hello_os.asm:48: warning: uninitialized space declared in .text section: zeroing

無事動いた。これで1日目終了。

qemu-system-i386 helloos.img

@tomoyuki-nakabayashi
Copy link
Owner Author

tomoyuki-nakabayashi commented Jun 10, 2018

Makefileを作る。

30日でできる!OS自作入門(2日目)[Ubuntu16.04/NASM]

↓でバイナリを作って、qemuが走るようになった。

make run

@tomoyuki-nakabayashi
Copy link
Owner Author

3日目は難関らしい。気合入れていこう。

@tomoyuki-nakabayashi
Copy link
Owner Author

レジスタに色々設定して、BIOS callして、フラグレジスタで結果チェック、みたいな流れが鉄板なんだな。
わかりにくいなぁ~。

@tomoyuki-nakabayashi
Copy link
Owner Author

tomoyuki-nakabayashi commented Jun 10, 2018

なるほど、勉強になるが、フロッピーとかBIOSだから、もう少し2018年っぽい感じにしたいな。

USBブートで、UEFIとか、やっている人はいるだろうか?

x64 UEFI 対応 OS 自作入門 ~実機で動作する OS を作ってみよう~
はりぼてOSをUEFIで起動する/総集編

@tomoyuki-nakabayashi
Copy link
Owner Author

tomoyuki-nakabayashi commented Jun 10, 2018

floppyイメージを作るために、↓を参照。

30日でできる!OS自作入門(3日目)[Ubuntu16.04/NASM]

↓が何やっているのか、は調べた方がよいかな?多分、floppyイメージ作っているだけだと思うけど。

mformat -f 1440 -C -B ipl.bin -i haribote.img ::
mcopy haribote.sys -i haribote.img ::

mformatはMS-DOS方式でフォーマットね。
mcopyMS-DOSイメージのコピー。

@tomoyuki-nakabayashi
Copy link
Owner Author

今のところ、特に詰まることなく進められている。先駆者が情報公開してくれていて素晴らしい。

@tomoyuki-nakabayashi
Copy link
Owner Author

tomoyuki-nakabayashi commented Jun 10, 2018

C言語の実行ファイルが、著者オリジナルなのか…。
リンカスクリプトでの回避方法があるようなので、それを使わせてもらう。

https://vanya.jp.net/os/haribote.html#hrb

@tomoyuki-nakabayashi
Copy link
Owner Author

なんかちゃんとC言語に飛んでいるのか少し不安が残るな…。

@tomoyuki-nakabayashi
Copy link
Owner Author

ああ、pp63で32ビットモードに入るために、100行ほどアセンブラを追加しているのか。

とりあえず、nasmでは、*[INSTRSET "i486p"]*が不要、とのことだったので、asmhead.asmから、該当の行を削除してあげた。

これで、pp72の真っ白の画面表示までできた!

@tomoyuki-nakabayashi
Copy link
Owner Author

sprintfを使おうとしたら、エラー。32bit用ライブラリを入れてみるか。希望はあまりないが。

$ make run
make img
make[1]: Entering directory '/home/tomoyuki/work/07.PlayGround/MyPlayGround/MakeOsMyself/day05'
make -r haribote.img
make[2]: Entering directory '/home/tomoyuki/work/07.PlayGround/MyPlayGround/MakeOsMyself/day05'
nasm ipl.asm -o ipl.bin -l ipl.lst
ipl.asm:28: warning: uninitialized space declared in .text section: zeroing
ipl.asm:111: warning: uninitialized space declared in .text section: zeroing
nasm asmhead.asm -o asmhead.bin -l haribote.lst
asmhead.asm:132: warning: uninitialized space declared in .text section: zeroing
asmhead.asm:134: warning: uninitialized space declared in .text section: zeroing
nasm -g -f elf nasmfunc.asm -o nasmfunc.o
nasmfunc.asm:44: warning: label alone on a line without a colon might be in error
nasmfunc.asm:50: warning: label alone on a line without a colon might be in error
nasmfunc.asm:56: warning: label alone on a line without a colon might be in error
gcc -march=i486 -m32 -T har.ld bootpack.c hankaku.c nasmfunc.o -o bootpack.hrb
/usr/bin/x86_64-linux-gnu-ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/8/libgcc.a when searching for -lgcc
/usr/bin/x86_64-linux-gnu-ld: cannot find -lgcc
/usr/lib/gcc/x86_64-linux-gnu/8/../../../../lib32/libgcc_s.so.1: error adding symbols: File in wrong format
collect2: error: ld returned 1 exit status
Makefile:17: recipe for target 'bootpack.hrb' failed
make[2]: *** [bootpack.hrb] Error 1
make[2]: Leaving directory '/home/tomoyuki/work/07.PlayGround/MyPlayGround/MakeOsMyself/day05'
Makefile:30: recipe for target 'img' failed
make[1]: *** [img] Error 2
make[1]: Leaving directory '/home/tomoyuki/work/07.PlayGround/MyPlayGround/MakeOsMyself/day05'
Makefile:33: recipe for target 'run' failed
make: *** [run] Error 2

@tomoyuki-nakabayashi
Copy link
Owner Author

tomoyuki-nakabayashi commented Jun 15, 2018

素直に↓から借りることにする。

http://bttb.s1.valueserver.jp/wordpress/blog/2017/12/17/makeos-5-2/

sprintfできるようになった。
gccだけで同じことをやる方法を調査したいところだが、今は先へ進もう。

@tomoyuki-nakabayashi
Copy link
Owner Author

昨日はキーボード割り込みが動くようになった。マウス制御がしばらく続くっぽいので、ぼちぼちやろう。

@tomoyuki-nakabayashi
Copy link
Owner Author

マウスを動かすと7F, 81あたりで止まるんだけど、他の人が動かしているのを見てもそうみたいなので、一旦先に進めるかね。

@tomoyuki-nakabayashi
Copy link
Owner Author

マウスカーソルの移動が大きいんだよなぁ。なんでだろこれ。

@tomoyuki-nakabayashi
Copy link
Owner Author

pp.184
書籍内では、コンパイラの最適化オプションでメモリチェックロジックが消える、とあるが、普通に残っている。
QEMUのメモリサイズはデフォルトで128MBらしく、128MBが検出されている。

https://wiki.archlinux.jp/index.php/QEMU

@tomoyuki-nakabayashi
Copy link
Owner Author

アセンブラを出力して確認する。

gcc -c -g bootpack.c
objdump -d -S bootpack.o > bootpack.s

普通にフルでコード吐かれているな。

unsigned int memtest_sub(unsigned int start, unsigned int end) {
   0:	55                   	push   %rbp
   1:	48 89 e5             	mov    %rsp,%rbp
   4:	89 7d dc             	mov    %edi,-0x24(%rbp)
   7:	89 75 d8             	mov    %esi,-0x28(%rbp)
  unsigned int i, *p, old, pat0 = 0xaa55aa55, pat1 = 0x55aa55aa;
   a:	c7 45 ec 55 aa 55 aa 	movl   $0xaa55aa55,-0x14(%rbp)
  11:	c7 45 f0 aa 55 aa 55 	movl   $0x55aa55aa,-0x10(%rbp)
  for (i = start; i <= end; i += 0x1000) {
  18:	8b 45 dc             	mov    -0x24(%rbp),%eax
  1b:	89 45 e8             	mov    %eax,-0x18(%rbp)
  1e:	eb 75                	jmp    95 <memtest_sub+0x95>
    p = (unsigned int*)(i + 0xffc);
  20:	8b 45 e8             	mov    -0x18(%rbp),%eax
  23:	05 fc 0f 00 00       	add    $0xffc,%eax
  28:	89 c0                	mov    %eax,%eax
  2a:	48 89 45 f8          	mov    %rax,-0x8(%rbp)
    old = *p;
  2e:	48 8b 45 f8          	mov    -0x8(%rbp),%rax
  32:	8b 00                	mov    (%rax),%eax
  34:	89 45 f4             	mov    %eax,-0xc(%rbp)
    *p = pat0;
  37:	48 8b 45 f8          	mov    -0x8(%rbp),%rax
  3b:	8b 55 ec             	mov    -0x14(%rbp),%edx
  3e:	89 10                	mov    %edx,(%rax)
    *p ^= 0xffffffff;
  40:	48 8b 45 f8          	mov    -0x8(%rbp),%rax
  44:	8b 00                	mov    (%rax),%eax
  46:	f7 d0                	not    %eax
  48:	89 c2                	mov    %eax,%edx
  4a:	48 8b 45 f8          	mov    -0x8(%rbp),%rax
  4e:	89 10                	mov    %edx,(%rax)
    if (*p != pat1) {
  50:	48 8b 45 f8          	mov    -0x8(%rbp),%rax
  54:	8b 00                	mov    (%rax),%eax
  56:	39 45 f0             	cmp    %eax,-0x10(%rbp)
  59:	74 0f                	je     6a <memtest_sub+0x6a>
not_memory:
  5b:	90                   	nop
  5c:	eb 01                	jmp    5f <memtest_sub+0x5f>
      *p = old;
      break;
    }
    *p ^= 0xffffffff;
    if (*p != pat0) {
      goto not_memory;
  5e:	90                   	nop
    old = *p;
    *p = pat0;
    *p ^= 0xffffffff;
    if (*p != pat1) {
not_memory:
      *p = old;
  5f:	48 8b 45 f8          	mov    -0x8(%rbp),%rax
  63:	8b 55 f4             	mov    -0xc(%rbp),%edx
  66:	89 10                	mov    %edx,(%rax)
      break;
  68:	eb 33                	jmp    9d <memtest_sub+0x9d>
    }
    *p ^= 0xffffffff;
  6a:	48 8b 45 f8          	mov    -0x8(%rbp),%rax
  6e:	8b 00                	mov    (%rax),%eax
  70:	f7 d0                	not    %eax
  72:	89 c2                	mov    %eax,%edx
  74:	48 8b 45 f8          	mov    -0x8(%rbp),%rax
  78:	89 10                	mov    %edx,(%rax)
    if (*p != pat0) {
  7a:	48 8b 45 f8          	mov    -0x8(%rbp),%rax
  7e:	8b 00                	mov    (%rax),%eax
  80:	39 45 ec             	cmp    %eax,-0x14(%rbp)
  83:	75 d9                	jne    5e <memtest_sub+0x5e>
      goto not_memory;
    }
    *p = old;
  85:	48 8b 45 f8          	mov    -0x8(%rbp),%rax
  89:	8b 55 f4             	mov    -0xc(%rbp),%edx
  8c:	89 10                	mov    %edx,(%rax)

@tomoyuki-nakabayashi
Copy link
Owner Author

ああ、O3付けると消えるわ。それだけの話ね。

@tomoyuki-nakabayashi
Copy link
Owner Author

一旦やりたいことまでやった感ある。
続きは追々やるとして、ACRNハックに戻る。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

1 participant