从头开始编程

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

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

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

谢谢你的每一个答案!

有一本名为“计算系统要素:由第一原理建立现代计算机”优秀教科书由Noam Nisan和Shimon Schocken编写,作为作者讲授的大学课程的基础,称为计算机构造研讨会 – 从NAND到俄罗斯方块12步骤 。 本课程也以其他名称在其他大学讲授。

作者本人在YouTube上进行了10分钟的介绍 ,在Google Video上进行了1小时的Google TechTalk 。

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

不要让“计算机建设”这个标题欺骗你。 通过“计算机”,作者并不仅仅意味着桌面上的矩形塑料盒,他的意思是整个计算系统 ,从单个逻辑门到最高级别的应用程序编程。

这本书/课程教你

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

您可以获得微控制器原型开发板,如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并从键盘和鼠标读取输入,以了解中断和exception如何在低电平工作。如果您想要降低,则必须查看MCU引脚中断控制线和时序图)。

瞧! 你从头设计了自己的电脑!

要回答关于C的问题,第一种编程语言的编译器是用assembly语言编写的, assembly编译器是用machine code

您所谈论的内容过去被称为“监控”程序。 您可以在osdev.org上获得一些有趣的信息并查看colorforth。

[afterthought] 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或其他东西。

您描述的问题通常被称为自举 (及其与鸡和蛋问题的关系)。 这个特定链接适用于编译器,但是在许多方面存在同样的问题 – 硬件,操作系统等,具有类似的解决方案。

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

大多数C编译器都可以发出不是为操作系统上下文运行的代码(例如参见memtest86+代码库),但这会严重限制任何编译器提供的function集。 (特别是,你不会得到像malloc这样的东西)。

在大多数现代PC风格的计算机上,你不能做得非常方便,但有许多便宜的(低于100美元,甚至低于50美元)的套件可用于编写较小的单片微处理器。 一个典型的micro将有几十个引脚,可以在程序控制下驱动为高电平和低电平,还有处理器,一些RAM(通常为256字节-8K左右),以及一些代码闪存(通常为8K-128K左右) )。 开发套件通常具有处理器,其中一些引脚连接到LED或LCD显示器,并且其他电线连接到几个按钮。 电路板还将包括电路,以便您可以在PC上开发软件,连接USB电缆,并将代码传输到芯片中。

嵌入式编程很有趣。 给出了一些“老派”编程的感觉,以及一些新的现代便利设施。

我建议你自己一个小型微控制器系统来玩。 TI推出基于MSP430的小型系统,价格为20美元。 您不需要编译器或操作系统来在此系统上运行代码。 事实上,只有128字节的RAM,将操作系统放到它上面是一个挑战。

如果您真的想从头开始,那么您可以在一张纸上用汇编代码写下您的程序,然后手动将其翻译成机器代码。 然后在hex编辑器中输入机器代码以获得您的1和0。 这真的是把它带到极端,你不会从手工编写机器代码中学到任何东西。 但是,用汇编代码编写程序会教你很多东西。

你需要一个工具来让你的程序进入闪存,以便cpu能够执行它,但是一旦编程了闪存,就没有工具,操作系统或类似的东西。

我无法告诉您有关硬件的信息,但如果您想构建自己的操作系统,则可以这样做。 这是很多工作,但非常有益。 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年创业并且从那以后没有任何时间。 所以离完成还有很长的路要走!

如果你很好奇,那就去做吧。 你真的很喜欢它。 如果你不这样做,你可以停下来。

AFAIK,你所描述的并不存在于现代计算机中。 如今,您将始终遇到各种操作系统,引导,甚至可能在您和硬件之间进行虚拟化。

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

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

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

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

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

C源代码 – >非优化中间代码 – >优化中间代码 – >机器代码

现在,机器代码进入操作系统,操作系统本身使用它自己的内核将该机器代码转换为二进制forms,因此硬件本身可以理解你想要做什么。

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

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

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

干杯