来自Scratch的操作系统

时间:2010-12-07 01:25:03

标签: algorithm memory-management filesystems operating-system bootloader

虽然标题是我提问的一部分,但第二部分并不那么简单。 第一部分:假设我想创建自己的操作系统。我怎么去做呢?我知道我必须创建一个bootloader。但是我从哪里去?我必须将它发送到另一个程序,但要做到这一点,该程序已经必须在那里,我必须确切知道它在内存空间的位置。任何提示/教程?

第二个问题。我目前正在研究内存管理,我认为我有一个更好的实现放置算法的理论,但除了理论上我无法真正测试它。一旦我可以创建操作系统(所以这是为了将来参考),我如何实际搞乱主内存,并移动进程?

P.S。:另外,我是否必须编写自己的文件系统?

编辑:在阅读了当前的评论后,我想修改我所说的内容。当我说“第二部分不会那么简单”时,这似乎是一个不好的选择。我知道两者都是非常艰难的努力,但这对我来说无关紧要。我喜欢学习新事物。而且我并不是说有人为我写一个教程,只是为了指出我正确的方向。

9 个答案:

答案 0 :(得分:5)

呼。现在这是一个很大的问题!我认为你在这里得到的任何答案都不会涵盖如此巨大的理由(除非有人坐下来写作和修改一两个小时)。

我建议您先阅读操作系统 - 尝试Tanenbaum的书籍,然后OSDev.org快速参考。

您可以使用GRUB作为引导加载程序 - 这应该可以简化操作。

答案 1 :(得分:3)

我不同意标题是简单的部分。你可以考虑学习minix

答案 2 :(得分:3)

您可能需要考虑模拟(全部或部分)操作系统,而不是实际编写操作系统。根据型号的不同,它可以在减少工作量的同时获得更多功能。

我知道在我的本科生中,我们用Java编写了磁盘扫描算法;它只是带有几个类和接口的Java。它并没有真正扫描磁盘,但做得不错,我们可以测量,测试和调整算法以查看它是如何变化的。

所以我提出一些更简单的方法:如果你只是在记忆算法之后,也许你可以写一个小的可测试的,可调整的应用程序,它可以让你直接跳到你想做的事情,而不用担心“那个其他操作系统的东西“你必须另外写。

或者,使用现有的(UNIX / Linux)操作系统可能比从头开始编写新内容更省力。

答案 3 :(得分:1)

这不是一个简单的努力,而是你将学到很多东西。我建议前往http://wiki.osdev.org/Main_Page,因为该网站有很多教程,可以帮助您入门。

答案 4 :(得分:1)

您所描述的大多数组件(内存管理器,FS)都可以在不为其编写操作系统的情况下实现,测试和使用。

此外,引导程序并不是你应该首先开始的。你看,应该有一些东西可以加载它。而这一点(必须开发和测试)将比引导加载程序困难得多。

你似乎低估了做这件事所需的工作量(和知识!)。你能做的最好的事情就是找一个愿意向你解释的朋友,和他聊一小时。

答案 5 :(得分:0)

关于操作系统Operating System Concepts的理论书真的会对你有所帮助。任何操作系统都需要一个调度程序,它将处理任务切换,上下文切换,陷阱等。

答案 6 :(得分:0)

您可能需要考虑修改的另一本好的参考书是:

祝你好运。我的意思是,祝你好运。

答案 7 :(得分:0)

研究Linux,以及Minix的更好的部分,如果你像现在的建议一样使用现成的引导加载程序,我会选择LILO而不是GRUB(当然这些只是个人首选项)。

答案 8 :(得分:0)

Pritam Zope和theMike97在Youtube上有很棒的教程,内容涉及从头开始编写OS。 theMike97系列文章介绍了如何编写自己的引导程序,Pritam zope教您如何在asm和c中编写自己的内核。如果您想从这里开始,这里是我目前的引导加载程序。它只是打印出你好世界。

org 0x7c00
mov si, message       ;The message location *you can change this*
call print            ;CALL tells the pc to jump back here when done
jmp $
print:
  mov ah, 0Eh         ;Set function

.run:
  lodsb               ;Get the char
; cmp al, 0x00        ;I would use this but ya know u dont so use:
  cmp al, 0           ;0 has a HEX code of 0x48 so its not 0x00
  je .done            ;Jump to done if ending code is found
  int 10h             ;Else print
  jmp .run            ; and jump back to .run

.done:
  ret                 ;Return

message           db  'Hello, world', 0 ;IF you use 0x00
;message          db  'Hello, world', 0x00


times 510-($-$$) db 0
dw 0xaa55
~

将此代码保存在名为main.asm的文件中 用nasm -fbin main.asm -o main.bin编译 用qemu-system-x86_64 main.bin

运行