【问题标题】:Is assembly strictly required to make the "lowest" part of an operating system?组装是否严格要求成为操作系统的“最低”部分?
【发布时间】:2012-08-12 12:25:37
【问题描述】:

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

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

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

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

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

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

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

感谢您的支持

【问题讨论】:

  • 仅使用 C,如何在 x86 上首先更改 Real Mode?打个BIOS interrupt 电话怎么样?
  • 我不知道。我在阅读 Jeff Duntemann 的书时已经研究过记忆模型,但我真的不知道如何应用它们。
  • 这样的操作超出了C语言规范/stdlib的范围。尔格..
  • 这样说 - 处理器总是通过在某些硬件定义的模式下从某个硬件定义的地址获取它的第一条指令来启动。数据/堆栈段寄存器、堆栈指针等可能指向非法/不存在的内存,需要使用有效值进行初始化。没有外围芯片在工作——没有内存管理,没有中断,没有定时器,只有引导代码。实际上,它将是汇编程序。
  • @MartinJames 感谢您的回答。事实上,这种方式很有意义;)

标签: c assembly operating-system cpu-architecture


【解决方案1】:

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

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

【讨论】:

  • 我还建议你学习一些 asm,而不是 X86!从别的东西开始。手臂、拇指、msp430、avr 等。稍后再做 mips 只是因为 mips 也有一种不同的方式来做一些非常好的事情,但与世界其他地方不同,所以最好学习一种方式,而不必花费你的一生来从极端案例转化为规范.
  • 为什么不是 x86?我只有 x86 硬件。 qemu 是一个有效的解决方案吗?你说的 gcc 是什么意思?它经常更新语言内部的东西,使它们变得不同?那是你的意思吗?是否有任何免费资源(或任何知名书籍)来学习(例如)ARM ASM?你说的那些拱门的主要区别是什么? Wikipedia 主要说,RISC 和 CISC 之间的区别,但是有很多 RISC 和很多 CISC。
  • "不是 X86!"有点夸大其词。这绝对是古怪的,而且它的复杂性确实让学习你的第一门汇编语言有点糟糕。但它也比目前地球上的任何其他东西更容易获得。试验它只需要一个汇编程序 (free)、一个现有的操作系​​统(你已经拥有)和一个 x86 处理器(你已经拥有——通常甚至是方便的开发机器形式——除非你很穷,受虐狂或时髦)。如果您正在使用操作系统,VM (also free) 也可能会有所帮助。
  • 有更多的工具和模拟器同样适用于非 x86 和 x86,并且您不会遇到 vm 问题,因为它试图限制您正在运行的内容。看看人们在这个级别学习时会挂断的事情,x86 的限制和怪癖以及更重要的是尝试在硬件而不是模拟器上运行会导致很高的失败率和放弃率。仅仅因为他们选择不当,从哪里开始,就永远暴露在这个世界上的人少了。
  • 不确定你在说什么虚拟机问题;我还没有遇到过。我只知道模拟器,即使是完美的模拟器,对我来说也不一样。当我制作的东西第一次在真机上运行时,它永远不会给我带来那种快感。那种感觉就是我的动力;没有它,我很快就会非常失去兴趣。为了用 ARM 获得它,我必须要么购买更多的东西,要么冒着让手机变砖的风险。而对于 x86,我可以随时运行程序——或者对于操作系统,重新启动。
【解决方案2】:

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

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

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

【讨论】:

  • 所以,当网上有人问是否某种语言适合制作操作系统(C++、VB、JAVA、C#等)时,他们也必须使用汇编来制作较低的等级?
  • @Claudiop 是的。一切都需要一个“引导程序”。它技术上不一定是汇编(因为可以假设通过其他方式生成机器指令),但这是迄今为止“最简单”/公认的路线..
  • "汇编/机器代码" 这是“异或”还是“与”?如果汇编是“丑陋的”,我真的无法想象机器代码......
  • 不,机器码很漂亮。它仅由数字组成,没有“xor”,没有“and”,没有类似的东西。数字很​​漂亮。除非你想ugly numbers。开玩笑。 :) 你应该阅读汇编语言和机器代码。
  • 机器码和通常用于生成机器码的程序集几乎总是被假定的。当您说 C/C++ 或其他语言时,涉及到 asm。不是JAVA你说是vm? vm是用某种针对机器的语言编写的,意思是asm到机器代码或直接机器代码。直接编译为机器代码是例外而不是规则,因为它更难调试。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-29
    • 2021-08-24
    相关资源
    最近更新 更多