这是一个很难问的问题,因为我很肯定我会受到仇恨者的轰炸评论“如果我不能写一个操作系统,我将无法编写操作系统”。好吧,我已经阅读了Tanembaum的现代操作系统,Linux内核开发,了解Linux内核以及其他我还不知道我是否可以编写操作系统,只有通过推进写一个才能实现我所做的我知道。最重要的是,我读过的书都没有描述引导序列/编译序列。
无论如何我讨厌消极,但我只想从下面的bkerndev教程构建示例代码并拥有一个绝对最小的操作系统:
http://www.osdever.net/bkerndev/index.php?the_id=90
您可以从此处以zip格式下载相关的源代码:
http://www.osdever.net/bkerndev/bkerndev.zip
当您尝试编译此内核时,您会遇到由于某些代码被破坏而导致的各种错误。另一位用户在这里寻求有关堆栈溢出的帮助:
compiling my own kernel (not from linux-kernel source)
虽然没有得到太多帮助。我通过添加gcc标记fleading-underscores和更改某些数据类型来解决这些错误。你可以在这里看到我的代码:
http://github.com/PhillipTaylor/farmix
代码将成功编译并留下一个kernel.bin可执行文件,但当我从grub启动时,我得到:
错误13:无法识别或不支持的格式(或具有该性质的内容)
当我直接从authors zip文件中获取kernel.bin并在我的eeepc上运行时,它启动时非常好,所以我认为我在编译代码时遇到了问题。我相信作者正在从Windows机器构建它,但我正在尝试使用带有GNU GCC 4.3的Fedora 10 i386进行编译,我认为这是导致问题的原因所以我问你,我如何构建一个有效的可执行文件核心?我错过了正确的目标或错误的二进制格式吗?
我真的很感谢有人帮助我解决这个令人尴尬的“第一步”
答案 0 :(得分:2)
我上面的评论不太清楚。我的意思是“你的kernel.bin与他们的''''命令报告的内容是什么?”。链接器的输出是原始二进制文件。它应该从grub识别的一些神奇的词开始。它们在“mboot”附近的start.asm中定义。我怀疑你的不同于他们的。
我没有鼻子方便,所以我无法构建,但你可能想从比较.bin文件的前几个单词开始。
答案 1 :(得分:1)
事实证明,用于编译应用程序的行显式设置为编译为“aout”格式,这是指南所说的和我认为是真实的。只有阅读“barebones”指南中的内容才能说服我,我可能感到困惑。一旦我将这一行更改为“nasm -f elf”,它就会起作用。
这是我的存储库中的一个标记,它指向bkerndev教程代码的基本WORKING版本(如何编写自己的操作系统)以供将来参考和处于我职位的人员。 < / p>
它带有一个makefile,用于从32位Linux系统构建它。
http://github.com/PhillipTaylor/farmix/tree/bkerndev_tutorial_working