从头开始编程

时间:2010-12-03 23:12:16

标签: c++ c computer-science

我想知道的是从头开始编程而不需要任何操作系统和类似的东西。

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

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

感谢您的每一个答案!

13 个答案:

答案 0 :(得分:16)

Noam Nisan和Shimon Schocken有一本名为The Elements of Computing Systems: Building a Modern Computer from First Principles伟大的教科书,作为作者所教授的大学课程的基础,名为计算机构建工作坊 - 来自通过12个步骤{/ 1}}向俄罗斯方块提供。本课程也以其他名称在其他大学讲授。

YouTube上有10 minute introduction,Google视频上有1 hour Google TechTalk,作者本人也是。

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

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

这本书/课程教你

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

答案 1 :(得分:10)

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

您可以使用C语言或其各自的instruction sets编程这些微控制器。

Hook up an LCD display到那个MCU板,你有一台显示器。 Hook up a keyboard and mouse它和你有控制权。 (您甚至可以编写自己的trap handlers来写入LCD并从键盘和鼠标读取输入,以了解中断和异常如何在低电平工作。如果您想降低,则必须查看MCU引脚 - 中断控制线和时序图的输出。)

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

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

答案 2 :(得分:8)

你所说的曾经被称为'监视'程序。你可以在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或其他东西。

答案 3 :(得分:4)

您所描述的问题最常被称为bootstrapping(及其与chicken and egg problem的关系)。这个特定链接适用于编译器,但是在许多方面存在同样的问题 - 硬件,操作系统等,具有类似的解决方案。

答案 4 :(得分:4)

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

答案 5 :(得分:3)

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

答案 6 :(得分:3)

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

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

答案 7 :(得分:2)

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

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

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

答案 8 :(得分:2)

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

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

答案 9 :(得分:1)

AFAIK,现代计算机中没有任何描述。如今,您将始终遇到各种操作系统,引导,甚至可能在您和硬件之间进行虚拟化。

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

答案 10 :(得分:1)

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

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

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

答案 11 :(得分:0)

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

  

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

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

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

答案 12 :(得分:0)

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

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

CHEERS

相关问题