我一直想做的一件事是开发我自己的操作系统(不一定像Linux或Windows那样花哨,但比我已经完成的简单的引导加载程序更好).
我很难找到资源/指南,让你过去编写一个简单的"Hello World"操作系统.
我知道很多人可能会建议我看看Linux或BSD; 但是像这样的系统的代码库(大概)是如此之大,以至于我不知道从哪里开始.
有什么建议?
更新:为了让通过Google登陆此帖子的人们更容易,这里有一些操作系统开发资源:
编写自己的操作系统(感谢Adam)
Linux From Scratch(感谢John)
SharpOS(C#操作系统)(谢谢lomaxx)
OS Dev Wiki和论坛(感谢Steve)
BonaFide(谢谢史蒂夫)
布兰(谢谢史蒂夫)
滚动你自己的玩具UNIX克隆操作系统(谢谢史蒂夫)
其他资源:
我找到了一个名为MikeOS的好资源,"MikeOS是一个学习工具,用于演示操作系统的简单操作.它使用16位实模式进行BIOS访问,因此不需要复杂的驱动程序"
版权所有11/14/08
我在Freebyte的指南中找到了一些资源...免费和非免费的操作系统链接到OSKit和ExOS库等工具包.这些在开始OS开发时似乎非常有用.
2009年2月23日更新
Ric Tokyo在这个问题上推荐了nanoos.Nanoos是一个用C++编写的操作系统.
更新于3/9/09
Dinah为有抱负的操作系统开发人员提供了一些有用的Stack Overflow讨论:创建自定义操作系统的障碍讨论了在开发操作系统和操作系统开发时可能遇到的陷阱是一个更为一般性的讨论.
2009年7月9日更新
LB提供了Pintos项目的链接,Pintos项目是为学生学习OS开发而设计的教育操作系统.
2009年7月27日更新(仍然很强劲!)
我偶然发现了伯克利的在线操作系统课程,有23个讲座.
TomOS是MikeOS的一个分支,包括一些内存管理器和鼠标支持.作为MikeOS,它旨在成为一个教育项目.它是用NASM汇编程序编写的.
2009年8月4日更新
我发现幻灯片和其他材料与上面列出的在线伯克利讲座一致.
2009年8月23日更新 …
如何在没有运行操作系统的情况下自行运行程序?你能创建计算机可以在启动时加载和运行的汇编程序,例如从闪存驱动器启动计算机并运行cpu上的程序吗?
这可能是徒劳的,因为我知道编写一个操作系统是无法忍受的复杂(尤其是自己).
我不希望构建下一个linux或Windows.
我知道这将是可怕的,而且越野车,并且不会起作用,但那很好.
我想在Assembly,C和(某些)C++中自己编写所有内容.
这是一个未来的项目,因为我现在忙于其他一些事情并且没有立即的时间,但我想我现在会问它,所以也许我可以得到很多答案,它可以构建并成为这种方法的有用资源(我所见过的其他一切都涉及构建minix,使用现有的引导程序,在虚拟引导程序中构建它等).
我想用显示器,键盘和鼠标设置一个旧的桌面,然后开始使用空白硬盘.
我想学习如何编写我自己的bootloader(我已经找到了很多有关这方面的资源,但为了完整性,请仍然添加一些好的),我自己的USB驱动程序(如果有必要),CD驱动程序(如果有必要的话) )等等,从头开始.
如何将代码放入计算机?用软盘做它最好吗?大多数计算机可以通过USB记忆棒完成吗?
我需要哪些司机,你能建议任何建议吗?
启动序列之后 - 然后是什么?我如何进入保护模式等
如何在没有操作系统帮助的情况下管理内存?我只是使用我想要的任何地址吗?无需初始化?
毫无疑问,我会遇到什么会让我困惑?
我怎样才能使命令行O/S和图形命令行?
什么是图形操作系统?比如,我怎么做一些命令行,一个字体,一个顶部的图片?
我在哪里可以阅读有关设置多任务环境的信息?(即,有两个并行运行的图形命令行).
我该如何设置一种窗口系统?设置简单的多任务处理后,如何在屏幕上显示图形?
相信我,我知道这是一个非常复杂的项目,我可能永远无法完成它或在任何用途上写任何东西.
还有很多其他的部分我还没有提到过,如果你想到的话,也可以自由添加.
请为每个答案添加一个"主题" - 例如,USB驱动程序,然后可能是资源列表,需要注意的事项等.
此外,请不要建议建立另一个操作系统或预先存在的代码.我知道我将阅读许多预先存在的代码(例如Linux内核,或示例资源,现有驱动程序等),但最终我想自己完成所有的写作.我知道我应该建立其他的东西,而且还有很多其他的问题,如果我改变主意并走那条路,我就可以读到这些问题.但这一切都是关于从头开始做整件事.
关于如何获得图形的任何建议?不同的视频模式以及如何使用它们等?
我打算编写一个操作系统,我对操作系统知之甚少.是否有任何好的资源或书籍可供我学习?你有什么建议?
创建操作系统似乎是一个庞大的项目.怎么会有人开始?
例如,当我将Ubuntu弹出到我的驱动器中时,我的计算机如何才能运行它? (我想,这是我真正想知道的.)
或者,从另一个角度来看,磁盘上可能存在的字节数最少,仍然可以作为操作系统"运行"?
(我很抱歉,如果这是模糊的.我只是不知道这个主题,所以我不能非常具体.我假装知道关于计算机如何工作的相当数量,但我对这个主题完全无能为力. )
我计划为x86架构开发一个操作系统.
有什么建议?
我正在从OSDev.org学习一些OS开发.我有一个内核,我正在尝试使用qemu在GRUB Legacy(0.97)中启动.但是,当我输入时kernel 200+9,我收到了消息
[Multiboot-elf, <0x100000:0x80:0x4008>(bad), entry=0x10000c]
Run Code Online (Sandbox Code Playgroud)
这是我所期望的,除了(坏)部分.如果我boot现在输入GRUB就会挂起.
我认为数字0x100000,0x44,0x4008分别代表.text段起始地址,.bss起始地址和.bss段大小.我认为这是因为objdump -h在内核映像上运行会产生以下结果:
kernel.bin: file format elf32-i386
Sections:
Idx Name Size VMA LMA File off Algn
0 .text 00000044 00100000 00100000 00001000 2**4
CONTENTS, ALLOC, LOAD, READONLY, CODE
1 .bss 00004008 00100044 00100044 00001044 2**2
ALLOC
Run Code Online (Sandbox Code Playgroud)
所以你可以看到我提到的数字几乎匹配.问题是,而不是100044,.bss的开头只有44个.我认为这就是GRUB说错的原因.我的内存不足1 MB(低内存).但objdump告诉我我的部分超过了这个门槛,所以我不知道出了什么问题.无论如何,我会在下面粘贴我的代码,它相对较短.虽然我的问题可能是非常基本的,如果你以前做过OS开发,所以代码可能是无关紧要的.
;loader.s - contains the multiboot header for grub and calls the main kernel method
global loader ; making entry point visible to linker
global magic ; we will …Run Code Online (Sandbox Code Playgroud) 我想更好地了解操作系统内部.流程管理,内存管理等等.
我想通过了解linux或BSD内核来学习.
哪一个内核更适合学习目的?
什么是最好的起点?
你能推荐一本好书吗?
在我看来,程序员(尤其是Comp.Sci.grads)试图解决的最常见的过于雄心勃勃的项目是构建自己的操作系统.(尝试创建自己的编程语言+编译器可能更常见,但不是那么雄心勃勃.)
对于那些(像我一样)愚蠢的尝试:除了庞大的规模,你在尝试从头开始创建自己的操作系统时遇到的最大问题或意想不到的障碍是什么?
编辑:一个很棒的操作系统问题:在操作系统开发中有哪些资源?