4

我是一名中级(抽象)程序员,几个月前我开始考虑是否应该减少或增加抽象(我选择减少)。

现在,我想我已经完成了大部分关于我需要什么的“研究”,但仍然存在一些问题。

现在,虽然我“实际上什么也没做”,但我只是加强了我的 C 技能(购买了“K&R C Programing Lang”),并且我想(在感到舒服之后)开始学习操作系统(如 minix)只是为了学习目的,但我有一个想法卡在我的脑海里,我真的不知道我是否应该在意。

理论上(我认为,不确定),高级语言不能直接引用硬件(如寄存器、内存位置等),因此基础的“完美语言”将是汇编。

我已经研究过汇编(前段时间)只是为了看看它是怎么回事(由于本书使用的过时的调试器(Assembly Language Step By Step,for Linux!),我停在了书的中间!)但是从我读过,我不太喜欢这种语言。

所以问题很简单:操作系统(引导加载程序/内核)是否可以在不涉及一条组装线的情况下进行编程,并且仍然有效?

就算可以,也不会是“跨架构”吧?(i386/arm/mips 等...)

谢谢你的支持

4

3 回答 3

4

您无需组装即可完成大量工作。Linux 或 NetBSD 不必为它运行的众多目标中的每一个都完全重写或修补。大多数代码是可移植的,然后有抽象层,在抽象层之下,您可以找到目标特定层。即使在目标特定层内,大多数代码也不是 asm。我想打消这个错误的想法,即为了为设备驱动程序编写寄存器或内存,例如您需要 asm,您不要将 asm 用于此类事情。您将 asm 用于 1) 处理器具有的指令,您无法使用高级语言生成这些指令。或 2) 高级语言生成的代码太慢。例如,在 ARM 中启用或禁用中断有一条特定指令用于访问您必须使用的处理器状态寄存器,所以需要asm。但是中断控制器的编程都是用高级语言完成的。第二点的一个例子是你经常在 C 库中发现 memcpy 和其他类似的大量使用的库函数是手工编码的 asm,因为它的速度要快得多。

虽然您当然可以在 ASM 中编写和执行任何您想做的事情,但您通常会发现高级语言用于直接访问“硬件(如寄存器、内存位置等)”。您应该继续加强您的 C 技能,不仅要使用 K&R 书,还要浏览各种 C 标准,您可能会发现有多少“实现定义”项目令人不安,例如位域、如何提升可变大小等. 仅仅因为您在 10 年前编写的程序一直在使用一个/一个特定品牌的编译器(msvc、gcc 等)进行编译和工作,并不意味着代码是干净的、可移植的并且将继续工作。

于 2012-08-16T19:50:53.783 回答
2

您已经用“高级语言不能直接引用硬件”自己回答了您的问题。

无论您是否愿意,如果您想制作操作系统,在某些时候您将不得不处理汇编/机器代码。

中断和异常处理程序中必须包含一些汇编代码。所以需要调度程序(如果不是直接的,间接的)。以及系统调用机制。和引导加载程序。

于 2012-08-16T07:20:02.093 回答
0

我在过去阅读网站和书籍中学到的是: a) 许多程序员不喜欢汇编语言,原因我们都知道。b) 操作系统的主要编程语言似乎是 C 甚至 C++ c) 在用 C 或 C++ 分析源代码后,汇编语言可用于“加速代码”(实际上语言无关紧要)

因此,在某些情况下,中级语言和低级语言的结合是不可避免的。例如,为了等待用户输入而加速代码是没有用的。如果为特定范围的计算机(AMD、INTEL、ARM、DIGITAL-ALPHA,...)构建最短和最快的代码很重要,那么您应该使用汇编程序。我的意见...

于 2012-08-17T09:11:41.713 回答