这是一个很难问的问题,因为我敢肯定,我即将被那些“如果我不能写操作系统,我就永远不能写操作系统”的仇恨分子轰炸。我读过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标志的前导下划线,并更改了一些数据类型。你可以在这里看到我的代码:
http://github.com/PhillipTaylor/farmix
代码将成功编译,并为我留下一个kernel.bin可执行文件,但当我从grub引导到它时,我得到:
错误13:无法识别或不支持的格式(或类似性质的内容)
当我直接从作者的压缩文件中获取kernel.bin并在我的eeepc上运行它时,它引导得绝对正常,所以我认为我在正确编译代码方面遇到了问题。作者是从Windows机构建它,我相信,但我正在尝试使用Fedora10 i386与GNU GCC 4.3编译它,我认为这是导致问题的原因,所以我问你,我如何构建一个有效的可执行内核?我是否错过了正确的目标或错误的二进制格式?
如果有人能帮我走出这令人尴尬的“第一步”,我会非常感激。
发布于 2009-12-23 07:59:44
事实证明,用于编译应用程序的代码行被明确设置为编译为"aout“格式,这是指南中所说的,也是我认为是正确的。只有在阅读"barebones“指南中的内容时,我才意识到自己可能被搞糊涂了。当我将这一行改为"nasm -f精灵“时,一切都正常了。
bkerndev这是我的存储库中的一个标签,它指向教程代码的基本工作版本(如何编写您自己的操作系统),供将来参考和处于我这个位置的人参考。
它附带了一个makefile,用于从32位Linux系统构建它。
http://github.com/PhillipTaylor/farmix/tree/bkerndev_tutorial_working
发布于 2009-12-23 06:20:52
我上面的评论不是很清楚。我的意思是“'file‘命令在你的kernel.bin上和他们的上报告了什么?”链接器的输出是一个原始二进制文件。它应该从一些grub能够识别的神奇单词开始。它们在"mboot“附近的start.asm中定义。我怀疑你的和他们的不一样。
我手头没有nasm,所以不能编译,但是您可能希望从比较.bin文件的前几个单词开始。
https://stackoverflow.com/questions/1949472
复制相似问题