4

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

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

PS:另外,我是否必须编写自己的文件系统?

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

4

9 回答 9

5

呸。现在这是一个相当大的问题!我认为您在这里获得的任何答案都不会涵盖如此广阔的领域(除非有人坐下来写一两个小时并进行修改)。

我建议您首先阅读操作系统——尝试 Tanenbaum 的书籍,以及OSDev.org以获得快速参考。

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

于 2010-12-07T01:29:30.340 回答
3

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

于 2010-12-07T01:30:14.990 回答
3

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

我知道在我本科的时候,我们用 Java 编写了磁盘扫描算法;都是Java,只有几个类和接口。它并没有真正扫描磁盘,但做得足够好,我们可以测量、测试和调整算法,看看它是如何变化的。

所以我提出了一些更简单的建议:如果你只是在使用内存算法,也许你可以编写一个小的可测试、可调整的应用程序,它可以让你直接跳到你想做的事情,而不用担心“其他操作系统的东西”你' d 必须另外写。

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

于 2010-12-07T02:06:50.407 回答
1

这不是一项简单的努力,而是您将学到很多东西的努力。我建议您访问 http://wiki.osdev.org/Main_Page,因为该站点有很多教程,肯定会让您入门。

于 2010-12-07T01:29:01.760 回答
1

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

此外,引导加载程序并不是您真正应该开始的第一件事。你看,应该有一些东西会被它加载。而这个东西(必须开发和测试)将比引导加载程序困难得多。

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

于 2010-12-07T01:32:20.943 回答
0

一本关于操作系统的理论书操作系统概念会真正帮助你。任何操作系统都需要一个调度程序来处理任务切换、上下文切换、陷阱等。

于 2010-12-07T01:28:44.270 回答
0

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

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

于 2010-12-07T01:54:46.860 回答
0

研究 Linux 和 Minix 的更好的部分,如果你按照这里的一些建议使用现成的引导加载程序,我会使用 LILO 而不是 GRUB(这些只是个人偏好,当然)。

于 2010-12-07T03:48:19.883 回答
0

Pritam Zope 和 theMike97 在 Youtube 上有关于从头开始编写操作系统的精彩教程。theMike97 有一个关于编写自己的引导加载程序的 loong 系列,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

于 2019-07-01T18:15:16.220 回答