虽然标题是我提问的一部分,但第二部分并不那么简单。 第一部分:假设我想创建自己的操作系统。我怎么去做呢?我知道我必须创建一个bootloader。但是我从哪里去?我必须将它发送到另一个程序,但要做到这一点,该程序已经必须在那里,我必须确切知道它在内存空间的位置。任何提示/教程?
第二个问题。我目前正在研究内存管理,我认为我有一个更好的实现放置算法的理论,但除了理论上我无法真正测试它。一旦我可以创建操作系统(所以这是为了将来参考),我如何实际搞乱主内存,并移动进程?
P.S。:另外,我是否必须编写自己的文件系统?
编辑:在阅读了当前的评论后,我想修改我所说的内容。当我说“第二部分不会那么简单”时,这似乎是一个不好的选择。我知道两者都是非常艰难的努力,但这对我来说无关紧要。我喜欢学习新事物。而且我并不是说有人为我写一个教程,只是为了指出我正确的方向。
答案 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