【问题标题】:Planning on writing operating system in Objective-C [closed]计划在 Objective-C 中编写操作系统 [关闭]
【发布时间】:2011-03-22 00:40:39
【问题描述】:

目前我正在学习objective c 2.0,很快我计划学习汇编语言,这样我就可以编写一个操作系统。我知道这并不容易,而且我知道这需要几个月甚至几年的时间和耐心。但是,我计划用 Objective-C 编写大部分内容(不包括你必须用汇编编写的东西),因为我不仅比我对 C 的了解更好(我几乎不知道任何 C),而且我,个人而言,也更喜欢objective-c。这可能吗??如果不是,我需要知道多少 C?我应该通过一本书对C有很好的了解吗?还是只是在线学习基础知识?

【问题讨论】:

  • 祝你好运。只是想到了一句话:那些不懂 UNIX 的人注定要重新发明它,很糟糕。 – Henry Spencer
  • Miku,太棒了,我爱亨利·斯宾塞。 :) 但即使是对 Unix 的糟糕重新实现也是一个极好的学习机会。
  • @sarnold:学习这一切可能都很好——我只是不希望(至少 me =)能够提出一个平台,我实际上可以每天使用。而且:喜欢粗体!
  • Miku,太真实了——仅磁盘驱动程序就足以让我无法从头开始。祝尼克好运。 :)
  • 一般osdev的一些入口点:reddit.com/r/osdev

标签: c operating-system objective-c-2.0


【解决方案1】:

嗯,我也有一些类似的计划,所以也许合作?我想开源我的项目,所以如果你也愿意...

这是一个大项目。我最好的建议是坚持使用带有 GNUstep 的 OS X 或 Linux。但如果你坚持,我确实有一个计划,一个微内核:

  • 整个东西都是用 clang/LLVM 构建的,只要有可能就启用 ARC。

  • 内核本身是最小的。它的唯一目的是加载使其工作的 kext。内核中内置了一些功能:

    • ELF 二进制文件支持。还没有动态链接。

    • GNU tar 的“文件系统”驱动程序。这对于一个合理的 ramdisk 来说已经足够了。

    • 部分libc(系统调用)和libobjc2足以运行带有ARC的Objective-C和加载kexts所需的一些反射。还没有内置其他花哨的功能。

    • 部分Foundation 将允许通过路径加载NSBundles 并加载它们的类和内核命令行处理。

    • 所有内核提供的功能都将在用户空间中重新实现。

  • 早期的 kext(在 ramdisk 中的),包括文件系统驱动程序和终端驱动程序。

  • 加载FS和终端kext后,内核将继续并从那里安装root FS和loadkexts,包括:

    • Foundationlibobjc2libc 的剩余部分。系统调用由分布式对象通过套接字实现。

    • POSIX 系统调用。

    • 多线程和调度程序(基于libdispatch 的接口,如果您愿意,也可以使用 GCD)

    • 硬件抽象层将枚举具有最少可加载驱动程序的所有设备,并将它们公开为低延迟设备节点。 (这是向用户空间公开硬件访问权限的微内核 - 守护进程是新的驱动程序。)

在用户区:

  • Userland libc(调用通过内核分布式对象接口公​​开的系统调用)

  • 一个完整的用户态 GNUstep

  • 一个动态链接器,可与 Apple 风格的 ELF 一起使用(例如尊重框架、库注入等)

  • 已启动,谁想要 sysvinit?

还有什么想法吗?

【讨论】:

    【解决方案2】:

    如果不是,我需要知道多少 C?

    全部。 Objective-C C,然后是一些,所以在你了解 C 之前,你真的不能声称自己了解 Objective-C。

    【讨论】:

      【解决方案3】:

      有可能……

      您将遇到的最大问题是运行时。

      操作系统需要组装,没错。 引导加载程序、HAL、GDT 等...

      然后你可以使用另一种编程语言。

      C 很好,因为它不需要运行时,所以你可以直接编码。

      Objective-C 依赖于巨大的运行时,用于消息传递、多态性等......

      恕我直言,用 C++ 编写操作系统会更容易,因为运行时不像在 Objective-C 中那么重要...

      也就是说,有可能……

      我自己用 C 写了一个小操作系统,作为一个 Objective-C 爱好者,我也想用 Objective-C... 它是开源的,顺便说一句,如果你想看看: http://www.eosgarden.com/en/opensource/xeos/

      但请记住,Objective-C 是基于 C 的。这意味着您必须在编写 Objective-C 代码之前编写一个标准 C 库,因为它只是依赖于它。这是一件很难的事情,即使可能......

      这意味着你必须编写 stdlib、stdio 等代码......

      您也可以尝试移植现有的标准 C 库。 然后你可以看看 GNUStep,如果你不想重新编码所有 Objective-C 的东西......

      祝你好运:)

      【讨论】:

        【解决方案4】:

        您可以使用GRUB's multiboot environment 最大限度地减少简单操作系统所需的汇编代码量。 GRUB 可以为您将 CPU 带入 32 位保护模式(或在较新的芯片上为 64 位模式 :),并轻松将控制权交给您的内核代码。

        如果您的 Objective C 工具链可以准备 ELF 对象,那么 Objective C 应该可以用于内核,尽管您可能需要自己提供一些“免费”服务。 (例如,C标准规定free()用于分配内存,但在内核内部分配内存不能只使用标准库——因此内核必须提供自己的内存分配例程。)

        当然,在某些时候,您需要使用汇编来编写用于自旋锁、互斥锁、页表映射、PCI 总线配置等的工具,但希望到那时您将拥有学到了很多关于更简单的操作系统设计的知识。

        【讨论】:

          【解决方案5】:

          看看 Julien Le Comte 的博客。他开始编写 Simplix 以“提高他的核心 CS 技能”。 http://www.julienlecomte.net/blog/category/system-programming/

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-10-07
            • 2011-11-19
            • 2011-08-26
            • 2013-08-18
            • 2011-10-31
            • 2012-04-09
            • 2022-01-05
            相关资源
            最近更新 更多