是否严格要求组装成为操作系统的“最低”部分?

时间:2012-08-16 07:13:41

标签: c assembly operating-system processor-architecture

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

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

现在我正在“无所事事”,我只是加强了我的C技能(买了“K& RC编程郎”),我想(感觉舒服之后)开始学习操作系统(如minix)只是为了学习目的,但我有一个想法卡在我的脑海里,我真的不知道我是否应该关心。

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

我已经研究过汇编(前一段时间)只是为了看看它是怎么回事(由于本书使用了过时的调试器(对于Linux来说,汇编语言一步一步!),我已经停在本书的中间)但是从我读过的内容来看,我不太喜欢这门语言。

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

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

感谢您的支持

3 个答案:

答案 0 :(得分:4)

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

虽然您当然可以在ASM中编写并执行任何操作,但您通常会发现使用高级语言直接访问“硬件(如寄存器,内存位置等)”。您应该继续重新强调您的C技能,不仅仅是使用K& R书,而且还要浏览各种C标准,您可能会发现它有多少“实现定义”项目,如位域,如何提升可变大小等等。仅仅因为你10年前编写的程序不断编译和使用一个特定品牌的编译器(msvc,gcc等),并不意味着代码干净,便携,并将继续工作。不幸的是,gcc教会了许多非常糟糕的编程习惯,当他们发现他们在未来十年左右不知道语言并且必须重做他们如何使用该语言来解决问题时,会震惊用户。

答案 1 :(得分:2)

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

无论您是否需要,如果您想制作操作系统,您将不得不处理装配/机器代码。

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

答案 2 :(得分:0)

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

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