【问题标题】:OS from Scratch从零开始的操作系统
【发布时间】:2011-05-21 07:57:22
【问题描述】:

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

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

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

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

【问题讨论】:

  • 你有什么样的编码经验?
  • 我已经编码好几年了,可以流利地使用 C++ 和 Java 相当流利(节省一些东西)。而且我在装配方面做了一些工作(尽管我想做更多。这很有趣。)。

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


【解决方案1】:

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

我建议你先阅读操作系统——试试 Tanenbaum 的书,并OSDev.org 快速参考。

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

【讨论】:

  • 肯定会考虑使用 GRUB 引导加载程序。
【解决方案2】:

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

【讨论】:

  • 嗯,哈哈,我想简单在这里是一个相对的术语。
  • 我的建议是向 Tanenbaum (ast) 学习,他是迄今为止最容易理解的作者。如果您想快速入门,这里有一个考试链接,上面有我的操作系统教授的答案,ece.uprm.edu/~noack/icom5007/exams
  • P.S.在考试中,Noack 使用了很多“避免 RADQ”,这意味着避免针对不同问题的正确答案。
【解决方案3】:

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

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

所以我提出了一些更简单的建议:如果您只是追求内存算法,也许您可​​以编写一个小型可测试、可调整的应用程序,让您直接跳到您想要做的事情,而不必担心“其他操作系统的东西” " 否则你就得写了。

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

【讨论】:

  • Hrm... 你的帖子给了我一些想法(这可能是你得到的)。我可以创建一个程序,在内存中保留大量空间,然后使用 __asm{} 指令,我可以使用我分配的内存并使用它。
  • 对。模拟的另一个好处是针对不同类型的应用程序(具有不同的内存使用情况)进行测试。您可以编写一个模拟应用程序的使用情况。但模拟的缺点是它没有在真实世界的应用程序中进行测试。再说一次,如果您对结果进行基准测试,也许这足以证明您的算法的改进(或非改进)。
【解决方案4】:

这不是一项简单的努力,但您会从中学到很多东西。我建议您前往http://wiki.osdev.org/Main_Page,因为该网站有很多教程,肯定会让您入门。

【讨论】:

  • 谢谢,我一定会看看的。
【解决方案5】:

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

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

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

【讨论】:

  • 如何在已经运行的操作系统范围内测试内存管理器?这不会与操作系统的经理冲突吗?还是我只是走错路了?另外,如何为 cmets 添加中断?我试过 shift+enter 和 html break,但都没有成功。
  • 你的意思是虚拟内存管理器?嗯..通过在虚拟机中启动 DOS 并执行跳转到保护模式,您也可以使用它。问题是您将需要 很多 精心编写的代码。
  • @Nicholas:我想您可以创建一个大大简化的虚拟机,让您测试不同的内存管理器方案并提取统计信息。此外,您不能在 cmets 中添加换行符。
【解决方案6】:

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

【讨论】:

    【解决方案7】:

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

    祝你好运。我是认真的,祝你好运。

    【讨论】:

      【解决方案8】:

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

      【讨论】:

        【解决方案9】:

        Pritam Zope 和 theMike97 在 Youtube 上有关于从头开始编写操作系统的精彩教程。 theMike97 有一个关于编写自己的引导加载程序的 loong 系列,Pritam zope 教你如何用 asm 和 c 编写自己的内核。如果你想开始的话,这是我当前的引导加载程序。它只是打印 hello world。

        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运行它

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-04-08
          • 2015-05-28
          • 1970-01-01
          • 2012-07-11
          • 1970-01-01
          • 1970-01-01
          • 2018-08-04
          • 2019-08-12
          相关资源
          最近更新 更多