【问题标题】:Programming from scratch [closed]从头开始编程[关闭]
【发布时间】:2011-05-20 01:01:24
【问题描述】:

我想知道的是在没有任何操作系统和类似的东西的情况下从头开始编程。

我知道 Windows 和 Mac 以及几乎任何东西,甚至 DOS 都是用 C、C++ Pascal 等编写的,所以我认为我应该知道其中一种语言,但为此我需要一个可以编写代码的程序,并且还要编译它但没有操作系统和程序怎么能做到这一点?他们是怎么做到的?

但这还远远不够,C是怎么写的?在什么?因此,当我指的是从头开始时,我的意思是,从基础开始构建一切。也许从0,1,0,1 现在我认为这是确切的起点。但是我该怎么做,我应该拥有什么以及我应该从哪里开始?

感谢您的每一个回答!

【问题讨论】:

  • 你只需要一根磁针和一只稳定的手:xkcd.com/378
  • 操作系统是用 Pascal 编写的?
  • @John:是的。苹果系统。 (嗯,比任何其他操作系统都多)
  • @neo2862:太棒了。 XKCD 是网络上最棒的页面......当然除了 StackOverflow。
  • 如果你想从零开始做苹果派,你必须先创造宇宙 -- Carl Sagan [这可以扩展到任何你想从零开始制作的东西,并且这个真的是一个答案]

标签: c++ c computer-science


【解决方案1】:

您所说的曾经被称为“监控”程序。您可能会在 osdev.org 上获得一些有趣的信息并查看 colorforth。

[事后思考] google Rick Hohensee 在 comp.lang.forth 上的漫谈也是。

[事后深思熟虑]真正了解基础知识,获得一个插件电路面包板,一些旧的 EPROM,一个 5VDC 电源和一个 25VDC 电源(24 应该可以工作,它更常见)。在地址和数据线上使用上拉或下拉电阻,并使用开关为地址和数据线提供接地或电源。使用开关遍历地址,并在数据总线上以 1 和 0 的形式输入数据,使用 25V 的脉冲对每个地址进行编程。我从来没有真正手动完成过这项工作,但我曾经写过一个程序 (http://jc.unternet.net/hacks/?1994-01-01-01) 从 Centronics 端口执行此操作,并烧毁了几个程序大大地。回到那个年代,英特尔会免费向您发送有关其所有处理器和辅助芯片的书籍,并附有详细的指令集和时序。

完成后,将您的处理器连接到 EPROM,给它一些汁液,然后观察会发生什么。在您开始尝试集成键盘和显示器之前,可能会使其频闪一些 LED 或其他东西。

【讨论】:

  • 非常感谢@jcomeau_ictx osdev.org 看起来很有趣!我也会照顾这第四种语言
  • 我很想看到基于 LED 的自焊显示器!我其实很久以前就看到过类似的东西......
【解决方案2】:

您所描述的问题通常被称为bootstrapping(以及它与chicken and egg problem 的关系)。该特定链接适用于编译器,但您在许多领域(硬件、操作系统等)都有相同的问题,但具有类似的解决方案。

【讨论】:

  • 是的,就是这样,鸡和蛋:D,非常感谢引导词和链接,因为我什至不知道这个词存在
【解决方案3】:

大多数 C 编译器可以生成并非设计为在操作系统上下文中运行的代码(例如,参见 memtest86+ 代码库),但这将严重限制任何这些编译器提供的功能集。 (特别是,你不会得到像 malloc 这样的东西)。

【讨论】:

  • 谢谢我会照顾这些!
【解决方案4】:

从基础开始是10。您需要知道您的处理器支持哪些指令以及存在哪些寄存器和缓存等。然后用机器代码编写一个小的汇编编译器会很方便(用于可读的10)。如果你有这个,你可以为简单的高级语言编写第一个真正的编译器,依此类推(每个都使用较低级别的“语言”构建)。但是,您应该知道,创建一个简单的操作系统可能需要数年的计划,甚至需要更多的时间来开发、调试等(所有这些,您甚至还没有想到在屏幕上看到有用的东西)。而且该操作系统将无法在您的处理器之外的任何其他处理器上运行。然后你需要驱动程序等硬件的每一位。从这里开始还有很多步骤。从10 级别开始并不是很有收获,因为很长一段时间内你都看不到任何东西。只是不要。

【讨论】:

  • 我不会说不要这样做;我只是建议不要期望任何惊人的结果:)
  • @SimpleCoder:我仍然认为你不应该这样做,除非你知道确切你在做什么。不过,我添加了该建议;)
  • 好吧,我认为没有什么是不可能的。学习永远不会心;)但是你用你的话推动了我,所以谢谢你!
  • @CIRK:是的。祝你的操作系统好运:) 我很想看看结果!随时给我寄一份。我自愿进行 beta 测试!
  • CIRK 的问题是我发现的更有趣的问题之一。 @elusive:你的回答很好地解释了我想知道的问题......我正在研究操作系统,但我一直在考虑这个鸡和蛋的问题,没有书解释这个! (或者直到我当然红了哈哈)我为我的英语道歉:P
【解决方案5】:

AFAIK,现代计算机中不存在您所描述的任何内容。如今,您总是会在您和硬件之间遇到多层操作系统、引导,甚至可能是虚拟化。

如果您真的想了解编程的深层秘密以及应用程序如何在硬件上运行,我建议您参加操作系统课程或阅读它们的工作原理。例如,Andy Tanenbaum 的《操作系统设计与实现》一书可能就是门票。

【讨论】:

  • 在现代,一切都建立在过去的基础上,而在过去,老家伙们是从零开始的;)现在是时候了解他们做了什么以及为什么世界在运作这样 ;) 感谢您的回答!
【解决方案6】:

您可以在没有操作系统 (OS) 的情况下进行编程,但操作系统会为您完成繁重的工作。例如,对于 C(你想知道),魔法不是语言本身,而是编译器。基本上它的作用是这样的:

C 源代码 -> 未优化 中间代码 -> 优化 中间码 -> 机器码

现在,机器代码进入操作系统,它自己使用自己的Kernel 将机器代码翻译成二进制形式,以便硬件本身可以理解您想要做什么。

所以基本上在你编写一个在没有操作系统的情况下运行的程序之前,你需要为你的机器创建自己的编译器和内核来运行它。

【讨论】:

  • 好吧,你在第一行说没有操作系统我无法编程,但在最后几行你说我需要创建一个编译器和一个内核,我应该如何在没有编程的情况下制作它们他们?:O ;)
  • 你会在玩具、计算器、咖啡机等中找到什么样的操作系统?您绝对不需要操作系统,或者编写自己的编译器和内核来执行它。您可以将您的程序写入十六进制编辑器并将其放入复位向量指向的内存中,然后拉动复位引脚以执行您的程序。
  • 对不起,如果我没记错的话,你所说的重置向量点是图片,这是一个完全不同的架构。这就是为什么玩具、计算器等使用 PIC 并不是真正在 vohn neumann 架构下...@CIRK 对不起,我没有想清楚,你可以在没有操作系统的情况下编程我的意思是操作系统让一切变得更容易给你。
【解决方案7】:

如果您想深入了解硬件,请尝试查看 PIC 和 AVR 等微控制器。我最近有机会使用其中一些平台,您编写的代码(用 C 或汇编程序)实际上在裸机上运行。

当然,这仅意味着您必须自己实现一些核心操作系统服务,例如处理输入的中断例程。其中大部分都可以作为示例代码获得,但仍然足够小以阅读和理解整个系统。

就计算机考古学而言,请尝试在离您最近的大学学习数字电路、计算机体系结构和编译器技术的基础课程。这满足了我的好奇心,也满足了我用原始二进制操作码编写程序的需要 :-)

【讨论】:

  • 感谢您的回答@Christoffer 我会照顾这些微控制器 ;)
【解决方案8】:

在大多数现代 PC 风格的计算机上,您无法非常方便地完成您所寻求的工作,但是有许多便宜的(低于 100 美元,甚至低于 50 美元)套件可用于对更小的单芯片微控制器进行编程。一个典型的微型计算机将有几十个引脚,这些引脚可以在程序控制下被驱动为高电平和低电平,还有一个处理器、一些 RAM(通常为 256 字节-8K 左右)和一些用于代码的闪存(通常为 8K-128K 左右) )。开发套件通常有一个处理器,其中一些引脚连接到 LED 或 LCD 显示器,其他电线连接到几个按钮。该板还将包含电路,因此您可以在 PC 上开发软件、连接 USB 电缆并将代码传输到芯片中。

嵌入式编程很有趣。给人一种“老式”编程的感觉,并带有一些较新的现代便利。

【讨论】:

  • 感谢您的回答@supercat ,是的,老派的感觉就是我现在的感觉并且真正吸引了我,硬件对我来说是一个大问题,因为我在这里有一个 MAC,并且正如我在这里听到和读到的,如果我真的想要从头开始,我需要使用处理器等等,我真的不想让我的电脑或任何东西崩溃,非常感谢你的提示!
  • @CIRK:顺便说一句,如果你真的想走老路,请访问 AtariAge.com,查找有关 Harmony 墨盒的信息。购买 Harmony 墨盒和 Atari 2600,并且(借助网站上的其他信息)您可以编写自己的游戏,这些游戏将在 1977 年制造的游戏机上运行。如果您想在该系统上显示很多东西,您需要将数据实时馈送到视频芯片。处理器甚至负责生成垂直同步(幸运的是,硬件负责水平同步)。也许我很奇怪,但我喜欢 2600 作为一个编程平台。
  • @CIRK:对于大多数视频游戏系统,视频芯片的设计控制着你可以在屏幕上放什么,除了在一切都是位图的系统上,你可以显示任何你想要的东西。 Atari 2600 非常有限,但唯一的硬性限制是每条扫描线只有 160 像素。该系统设计为每个屏幕显示两个可移动的单色形状加上几个可移动的块,但我的一个游戏有 16 个可移动的形状(一个移动到任何地方,五组三个在固定的垂直位置水平移动),每个形状每行独立着色。
【解决方案9】:

我建议你给自己弄一个小型微控制器系统来玩。 TI 有一款基于 MSP430 的小型 USB 记忆棒系统,售价 20 美元。 您不需要编译器或操作系统即可在此系统上运行代码。事实上,只有 128 字节的内存,要在上面安装操作系统是一个挑战。

如果你真的想从头开始,你可以在一张纸上用汇编代码写下你的程序,然后手动将它翻译成机器代码。然后您在十六进制编辑器中输入机器代码以获取您的 1 和 0。这真的把它发挥到了极致,你不会从手工编写机器代码中学到任何东西。不过,用汇编代码编写程序会教给你很多东西。

您确实需要一个工具来将您的程序放入闪存中以便 cpu 能够执行它,但是一旦对闪存进行了编程,就不需要任何工具、操作系统或类似的东西。

【讨论】:

    【解决方案10】:

    Noam Nisan 和 Shimon Schocken 编写了一本名为The Elements of Computing Systems: Building a Modern Computer from First Principles很棒的教科书,作为作者教授的一门大学课程的基础计算机构造研讨会 - 来自@987654326 @ 到俄罗斯方块的 12 个步骤。本课程也在其他大学以不同的名称教授。

    YouTube 上有一个10 minute introduction,Google 视频上有一个1 hour Google TechTalk,都是作者自己写的。

    官方配套网址是http://nand2tetris.org/

    不要让“计算机构造”这个标题欺骗了您。作者所说的“计算机”,不仅仅指你桌上的那个长方形塑料盒子,他指的是整个计算系统,从各个逻辑门到最高级别的应用程序编程。

    这本书/课程教你

    • 如何创建您自己的独立逻辑门
    • 如何构建自己的逻辑电路
    • 如何构建自己的 CPU
    • 如何直接用机器码编程
    • 如何在您自己的汇编程序中编程(您用机器代码编写)
    • 如何编写自己的虚拟机
    • 如何用您自己的高级语言(您用汇编程序编写)进行设计、实现和编程
    • 如何编写引导加载程序
    • 如何编写操作系统
    • 以及最终如何编写一个简单的游戏

    【讨论】:

    • 非常感谢您的回答@Jörg W Mittag 这本书看起来很有趣,您关于我可以从书中学到什么的列表看起来很酷,这正是我想要的,我希望如果我能每天拿到这本书,它会对我有所帮助!
    • Google 视频很久以前就死了。这似乎是一个有效的替代品:youtube.com/watch?v=IlPj5Rg1y2w
    【解决方案11】:

    您可以获取一个微控制器原型板,例如ArduinoBeagleboardMPLAB PIC board,然后创建一个machine monitor program,它可以在user space 中加载和执行您的其他程序。

    您可以使用 C 或它们各自的 instruction sets 对这些微控制器进行编程。

    Hook up an LCD display 到那个 MCU 板,你就有了一个监视器。 Hook up a keyboard and mouse 给它,你有控制权。 (您甚至可以编写自己的trap handlers 用于写入 LCD 并从键盘和鼠标读取输入,以了解中断和异常如何在低级别工作。如果您想降低,您将不得不查看 MCU 引脚中断控制线和时序图)。

    瞧!您已经从零开始设计了自己的计算机!

    为了回答您关于 C 的问题,第一种编程语言的编译器是用 assembly 编写的,而汇编编译器是用 machine code 编写的。

    【讨论】:

    • 酷,非常感谢您的回答@vls,非常感谢您提供大量链接和资源!
    【解决方案12】:

    我无法告诉您有关硬件的信息,但如果您想构建自己的操作系统,您可以这样做。这是很多工作,但非常有益。 jcomeau_itcx 已经提到过 osdev.org。还有 alt.os.development 新闻组,尽管在过去几年里它非常安静 - 但如果你能找到它,请查看存档。

    听起来你并没有被所有的“不要这样做!”警告...很好 :-) 您可以在几天内了解引导扇区并编写自己的引导扇区,然后您会在屏幕上看到一些内容并知道您正在路上。

    许多人建议您不要编写自己的引导扇区,因为严格来说它不是操作系统的一部分。他们建议您使用 GRUB 或类似工具进行引导。我不同意,部分原因是我想了解计算机如何启动,但部分原因是我发现编写自己的启动扇区比弄清楚如何使用 GRUB 更容易!

    C 是编写操作系统的最佳语言,因为它的高级程度足以让您提高工作效率,但又足够低级,让您可以直接在处理器上工作。许多人使用 gcc,但您也可以使用 Visual C++ 或其他任何东西(但使用 C 而非 C++ 编译,并且您确实需要一个支持内联汇编器并且可以生成没有 prolog/epilog 的函数的编译器。)您可以在您的常规 PC,然后在虚拟机中运行它 - 我更喜欢 bochs,因为它有一个内置的调试器,但还有其他的。

    一些关于开始使用操作系统的提示(在您整理好引导扇区之后)...英特尔 IA32 是最容易获得的处理器(因为它几乎在每台 PC 中都有)并且大多数操作系统开发人员更喜欢它,所以您可以获得比其他平台更多的建议。我不知道他们是否再这样做了,但英特尔给我寄来了他们的 IA32 软件开发人员手册的硬拷贝——免费,但非常宝贵。您可以在实模式下工作(16 位、分段、应用程序之间没有保护……想想 Windows 3.1),但我认为进入 32 位保护模式(相当棘手)并且更现代一点是值得的。虚拟内存(分页)是可选的,但我这样做是因为我编写操作系统的最初动机是了解 32 位保护模式如何在应用程序之间提供保护。

    这将是一段漫长的旅程。我在 2004 年开始使用我的操作系统,晚上工作,但后来我在 2006 年开始了我的业务,​​从那以后就没有任何时间了。所以距离完成还有很长的路要走!

    如果你好奇,那就去做吧。你会很享受的。如果你不这样做,你可以停下来。

    【讨论】:

    • 非常感谢你的回答,它激励了我,我很高兴听到你也在做操作系统!
    【解决方案13】:

    我用几年前设计和拼凑的计算机开始了操作系统的诞生(我认为那是大约 1985 年左右)。这很有趣,你会学到很多东西。项目取得圆满成功!

    人们一直在为您提供的有关可用于开发操作系统的平台的答案是硬件种类。您将不得不花费一些美元。假设您可以访问一台计算机,您可能会考虑使用像 QEMU 或 Oracle 的 Vbox 之类的虚拟计算机并为此开发一个操作系统。如果你有一台 mac,我真的很喜欢 Q,因为它的界面让虚拟计算机看起来像一台。我认为这里的其他帖子可能提到了 osdev.org。这是一个从其他 DIY 者那里汲取想法并获得一些帮助的好地方。祝你成功。

    干杯

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-10-06
      • 2013-01-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-04-08
      • 1970-01-01
      相关资源
      最近更新 更多