在做OS中经常会有些小技巧小困惑弄得自己夜不能寐。
在此将一些疑问和解决办法陆续做成FAQ,给愿意研究内核开发技术的朋友提供方便
---yapo
在做OS中经常会有些小技巧小困惑弄得自己夜不能寐。
在此将一些疑问和解决办法陆续做成FAQ,给愿意研究内核开发技术的朋友提供方便
整理者:yapo
1.Q:如何将生成的操作系统文件从 elf 格式转换到 binary 格式
A:用以下方法:
os.bin: os.elf
objcopy -R .comment -R .note -S -O binary os.elf os.bin
2.Q:如何将MinGW生成的.exe文件转换成binary格式
A: MinGW总是想把你的代码生成.exe文件。实在让人恼火
参考以下方法:
objcopy -O binary -R .note -R .comment -R .bss tools/system.exe tools/kernel
3.Q:如何将生成的.o文件转换成binary格式
A:参考以下方法:
boot/boot: boot/boot.o
objcopy -O binary boot/boot.o boot/boot
4. Q:MinGW是GCC套件,可是为什么我却无法使用GCC手册上的-oformat选项输出我
想要的纯2进制文件格式?
A:以我的经验的确如此,在linux和BSD下的GCC那一套不是到处都灵光的。可能是MinGW的一个BUG吧。不过我们有了objcopy这个格式转换工具,还在乎这个BUG干什么呢?不过这里有一个另类使用MINGW直接输出伪纯2进制文件格式的方法(它还是要有个PE文件头,但是会自己跳过去的)
ld --oformat pei-i386 --file-alignment 0x1000 --section-alignment 0x1000 ...
5.Q:C语言中的函数调用过程是怎样的?
A:是先将参数依次入栈,然后将EIP入栈,最后转跳到子函数体来执行。请计算好参数在堆栈中的位置以免在和ASM互交的时候弄乱了堆栈。
6.Q:请问minix中hdimg64M这个硬盘镜像文件是怎么做的?
A:用bximage生成一个64M的硬盘映象,然后用losetup把它关联成一个loop设备,
假设loop0,再对它用fdisk进行分区,再用mkfs.minix进行格式化
7.Q: 对于AT&T:
foo $foo和(foo)
%eax和%eax
都有什么区别?和Intel语法有什么区别?
A: 这个的确很让人疑惑
foo 是间接寻址方式
$foo 是立即数寻址方式和$(foo)一样
(foo) 应该是间接寻址方式,应该和foo一样。
比如,
movw $foo, %ax
movw foo, %ax
movw (foo), %ax
.org 0x400
foo:
.asciz "hello"
在intel语法中为:
mov ax, 400h
mov ax, [400h]
mov ax, [400h]
至于intel和att的区别,网上的文章很多,man手册也讲的很详细,就不多说了
8. Q:如何做一个我可以装载的内核文件
A:和生活中的事情一样,你可以用几种手段来达到你的目的。你可以让GCC产生一个flat的二进制文件,没有重定向的、头和其它的信息。我想这就是你想要的。
GCC -c my_kernel.c
LD my_kernel.o -o kernel.bin -oformat binary -Ttext 0x100000
“-c”GCC开关告诉GCC只是编译成一个目标文件而不连接。
用"-oformat binary"开关来运行LD告诉连接器你的输出文件是plain的,没有重定向,没有头信息,只是一个flat的二进制映像。"-Ttext 0x100000"告诉连接器你想要你的"text"(代码段)地址在1M的内存标记处。 当然你还必须把你的二进制文件映像装载到正确的偏移量处,以使它运行正常,因为所有的重定向已经静态地连接好了。
9. Q: 救命,我在保护模式下无法直接写屏了
A: 请问您的kernel段是从0开始起始的吗,如果不是,那么很抱歉,您不能直接用
movb 'A', (0xB8000)。这样的代码来直接写屏,您需要稍微转个弯。
注意.上面的代码段中0xB8000只是kernel的段内偏移,而非真正的物理内存0xB8000地址。如果您的kernel段直接从0开始,那么恭喜您。物理0xB8000和你的线性地址kernel中偏移地址0xB8000重合,因此可以。如果不是,那您需要换算出物理内存0xB8000与您线性地址对应关系。例如,你的kernel 是从KERNEL_START=0X200处开始,则需要这样:
VIDEO_M = 0xB8000 - KERNEL_START
movb 'A', VIDEO_M
我想你一定明白是怎么回事了。
10. Q: 见鬼,GAS总是告诉我Warning:partial line at end of file ignored
A: 的确很见鬼,但是您只需要在整个代码后面插入一个空行--回一下车。这个见鬼的警告 就不会打扰您了。为什么?恩,啊 ,呜 我也不知道 ^_^
11. Q: 我该如何从16位代码转跳到32位代码?
A:
待续