-
Notifications
You must be signed in to change notification settings - Fork 0
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
Comments
まず、環境(バイナリエディタ、qemu、アセンブラのインストール
|
OK。無事動いた。
|
hello_os.asmをnasmでアセンブルして動かす。
無事動いた。これで1日目終了。
|
Makefileを作る。 30日でできる!OS自作入門(2日目)[Ubuntu16.04/NASM] ↓でバイナリを作って、qemuが走るようになった。
|
3日目は難関らしい。気合入れていこう。 |
レジスタに色々設定して、BIOS callして、フラグレジスタで結果チェック、みたいな流れが鉄板なんだな。 |
なるほど、勉強になるが、フロッピーとかBIOSだから、もう少し2018年っぽい感じにしたいな。 USBブートで、UEFIとか、やっている人はいるだろうか? x64 UEFI 対応 OS 自作入門 ~実機で動作する OS を作ってみよう~ |
floppyイメージを作るために、↓を参照。 30日でできる!OS自作入門(3日目)[Ubuntu16.04/NASM] ↓が何やっているのか、は調べた方がよいかな?多分、floppyイメージ作っているだけだと思うけど。
mformatはMS-DOS方式でフォーマットね。 |
今のところ、特に詰まることなく進められている。先駆者が情報公開してくれていて素晴らしい。 |
C言語の実行ファイルが、著者オリジナルなのか…。 |
なんかちゃんとC言語に飛んでいるのか少し不安が残るな…。 |
ああ、pp63で32ビットモードに入るために、100行ほどアセンブラを追加しているのか。 とりあえず、nasmでは、*[INSTRSET "i486p"]*が不要、とのことだったので、asmhead.asmから、該当の行を削除してあげた。 これで、pp72の真っ白の画面表示までできた! |
sprintfを使おうとしたら、エラー。32bit用ライブラリを入れてみるか。希望はあまりないが。
|
素直に↓から借りることにする。 http://bttb.s1.valueserver.jp/wordpress/blog/2017/12/17/makeos-5-2/ sprintfできるようになった。 |
昨日はキーボード割り込みが動くようになった。マウス制御がしばらく続くっぽいので、ぼちぼちやろう。 |
マウスを動かすと7F, 81あたりで止まるんだけど、他の人が動かしているのを見てもそうみたいなので、一旦先に進めるかね。 |
マウスカーソルの移動が大きいんだよなぁ。なんでだろこれ。 |
pp.184 |
アセンブラを出力して確認する。
普通にフルでコード吐かれているな。 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) |
ああ、O3付けると消えるわ。それだけの話ね。 |
一旦やりたいことまでやった感ある。 |
基本に立ち返ろう。
30日でできる!OS自作入門(1日目)[Ubuntu16.04/NASM]
上を参考にまず、環境構築する。
The text was updated successfully, but these errors were encountered: