OS开发FAQ

发表于:2007-06-08来源:作者:点击数: 标签:
在做OS中经常会有些小技巧小困惑弄得自己夜不能寐。 在此将一些疑问和解决办法陆续做成FAQ,给愿意研究内核 开发技术 的朋友提供方便 ---yapo 在做OS中经常会有些小技巧小困惑弄得自己夜不能寐。 在此将一些疑问和解决办法陆续做成FAQ,给愿意研究内核开发技

在做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:

待续

原文转自:http://www.ltesting.net