内核加载到内存但不工作,汇编格式可能是问题所在吗?
Kernel loaded to memory but not working, may assembly format be the issue?
我正在开发一个用于教育目的的简单操作系统。我写了一个简单的内核,作用是直接在显存(0xb8000)中写入,在屏幕上显示一个字符。我正在使用 Qemu 来测试整个过程。内核如下:
void main(){
char* video_memory=(char*)0xb8000;
*video_memory='X';
}
我首先使用以下方法生成目标文件:
gcc -m32 -ffreestanding -c kernel.c -o kernel.o
然后我生成二进制文件使用:
ld -o -m elf_i386 kernel.bin -Ttext 0x1000 kernel.o --oformat binary
当我输入以下命令时:
objdump -d kernel.o
我看到这个输出:
00000000 <main>:
0: 55 push %ebp
1: 89 e5 mov %esp,%ebp
3: 83 ec 10 sub [=14=]x10,%esp
6: c7 45 fc 00 80 0b 00 movl [=14=]xb8000,-0x4(%ebp)
d: 8b 45 fc mov -0x4(%ebp),%eax
10: c6 00 58 movb [=14=]x58,(%eax)
13: c9 leave
14: c3 ret
这与 NASM 有点不相似。
但是当我输入以下命令时:
ndisasm -b 32 kernel.bin
我看到这个输出:
00000000 55 push ebp
00000001 89E5 mov ebp,esp
00000003 83EC10 sub esp,byte +0x10
00000006 C745FC00800B00 mov dword [ebp-0x4],0xb8000
0000000D 8B45FC mov eax,[ebp-0x4]
00000010 C60058 mov byte [eax],0x58
00000013 C9 leave
00000014 C3 ret
这正是我希望生成的内核程序集的样子。
问题是我认为加载的内核是第一个内核程序集的二进制文件。
我尝试使用第二个命令生成的代码在汇编中编写自己的这段内核并且成功了。
如何为第二个程序集而不是第一个程序集生成二进制文件?
提前致谢。
编辑:
我忘了说,当使用 ndisasm 命令时,它显示我生成的程序集有更多无用的程序集命令:
00000000 55 push ebp
00000001 89E5 mov ebp,esp
00000003 83EC10 sub esp,byte +0x10
00000006 C745FC00800B00 mov dword [ebp-0x4],0xb8000
0000000D 8B45FC mov eax,[ebp-0x4]
00000010 C60058 mov byte [eax],0x58
00000013 C9 leave
00000014 C3 ret
00000015 0000 add [eax],al
00000017 001400 add [eax+eax],dl
0000001A 0000 add [eax],al
0000001C 0000 add [eax],al
0000001E 0000 add [eax],al
00000020 017A52 add [edx+0x52],edi
00000023 0001 add [ecx],al
00000025 7C08 jl 0x2f
00000027 011B add [ebx],ebx
00000029 0C04 or al,0x4
0000002B 0488 add al,0x88
0000002D 0100 add [eax],eax
0000002F 001C00 add [eax+eax],bl
00000032 0000 add [eax],al
00000034 1C00 sbb al,0x0
00000036 0000 add [eax],al
00000038 C8FFFFFF enter 0xffff,0xff
0000003C 1500000000 adc eax,0x0
00000041 41 inc ecx
00000042 0E push cs
00000043 088502420D05 or [ebp+0x50d4202],al
00000049 51 push ecx
0000004A C50C04 lds ecx,[esp+eax]
0000004D 0400 add al,0x0
0000004F 00 db 0x00
此外,当使用十六进制编辑器打开 bin 文件时,我得到了不同的内容,第一行应该是相同的,但事实并非如此
"first assembly"和"second assembly"实际上显示的是同一件事。
它们只是同一机器代码的两种不同表示。
查看它们中的第二列数字。这些数字是您的计算机将 运行 的实际机器代码。如果这些数字相同,则代码相同。其他一切都只是一种奇特的展示方式,让人们更容易理解。
所以不,这里的问题不是反汇编的格式。
问题已解决,我的引导加载程序中缺少一些 [bits ##] 指令
我正在开发一个用于教育目的的简单操作系统。我写了一个简单的内核,作用是直接在显存(0xb8000)中写入,在屏幕上显示一个字符。我正在使用 Qemu 来测试整个过程。内核如下:
void main(){
char* video_memory=(char*)0xb8000;
*video_memory='X';
}
我首先使用以下方法生成目标文件:
gcc -m32 -ffreestanding -c kernel.c -o kernel.o
然后我生成二进制文件使用:
ld -o -m elf_i386 kernel.bin -Ttext 0x1000 kernel.o --oformat binary
当我输入以下命令时:
objdump -d kernel.o
我看到这个输出:
00000000 <main>:
0: 55 push %ebp
1: 89 e5 mov %esp,%ebp
3: 83 ec 10 sub [=14=]x10,%esp
6: c7 45 fc 00 80 0b 00 movl [=14=]xb8000,-0x4(%ebp)
d: 8b 45 fc mov -0x4(%ebp),%eax
10: c6 00 58 movb [=14=]x58,(%eax)
13: c9 leave
14: c3 ret
这与 NASM 有点不相似。
但是当我输入以下命令时:
ndisasm -b 32 kernel.bin
我看到这个输出:
00000000 55 push ebp
00000001 89E5 mov ebp,esp
00000003 83EC10 sub esp,byte +0x10
00000006 C745FC00800B00 mov dword [ebp-0x4],0xb8000
0000000D 8B45FC mov eax,[ebp-0x4]
00000010 C60058 mov byte [eax],0x58
00000013 C9 leave
00000014 C3 ret
这正是我希望生成的内核程序集的样子。
问题是我认为加载的内核是第一个内核程序集的二进制文件。
我尝试使用第二个命令生成的代码在汇编中编写自己的这段内核并且成功了。
如何为第二个程序集而不是第一个程序集生成二进制文件?
提前致谢。
编辑:
我忘了说,当使用 ndisasm 命令时,它显示我生成的程序集有更多无用的程序集命令:
00000000 55 push ebp
00000001 89E5 mov ebp,esp
00000003 83EC10 sub esp,byte +0x10
00000006 C745FC00800B00 mov dword [ebp-0x4],0xb8000
0000000D 8B45FC mov eax,[ebp-0x4]
00000010 C60058 mov byte [eax],0x58
00000013 C9 leave
00000014 C3 ret
00000015 0000 add [eax],al
00000017 001400 add [eax+eax],dl
0000001A 0000 add [eax],al
0000001C 0000 add [eax],al
0000001E 0000 add [eax],al
00000020 017A52 add [edx+0x52],edi
00000023 0001 add [ecx],al
00000025 7C08 jl 0x2f
00000027 011B add [ebx],ebx
00000029 0C04 or al,0x4
0000002B 0488 add al,0x88
0000002D 0100 add [eax],eax
0000002F 001C00 add [eax+eax],bl
00000032 0000 add [eax],al
00000034 1C00 sbb al,0x0
00000036 0000 add [eax],al
00000038 C8FFFFFF enter 0xffff,0xff
0000003C 1500000000 adc eax,0x0
00000041 41 inc ecx
00000042 0E push cs
00000043 088502420D05 or [ebp+0x50d4202],al
00000049 51 push ecx
0000004A C50C04 lds ecx,[esp+eax]
0000004D 0400 add al,0x0
0000004F 00 db 0x00
此外,当使用十六进制编辑器打开 bin 文件时,我得到了不同的内容,第一行应该是相同的,但事实并非如此
"first assembly"和"second assembly"实际上显示的是同一件事。
它们只是同一机器代码的两种不同表示。
查看它们中的第二列数字。这些数字是您的计算机将 运行 的实际机器代码。如果这些数字相同,则代码相同。其他一切都只是一种奇特的展示方式,让人们更容易理解。
所以不,这里的问题不是反汇编的格式。
问题已解决,我的引导加载程序中缺少一些 [bits ##] 指令