SOM*_*OMN 5 c assembly operating-system cpu-architecture
我是一名中级(抽象)程序员,几个月前我开始思考是否应该减少或增加抽象(我选择减少)。
现在,我想我已经完成了大部分关于我需要的“研究”,但仍然存在一些问题。
现在,虽然我“实际上什么也没做”,但我只是加强我的 C 技能(购买了“K&R C Programing Lang”),并且我想(在感觉舒服之后)开始学习操作系统(如 minix)只是为了学习目的,但我我脑子里有一个想法,但我真的不知道我是否应该关心。
理论上(我认为,不确定),高级语言不能直接引用硬件(如寄存器、内存位置等),因此基础语言的“完美语言”将是汇编。
我已经学习了汇编(前段时间)只是为了看看它是怎样的(由于这本书使用的过时的调试器(汇编语言一步一步,适用于 Linux!)),我在书的中间停了下来,但是从我的角度来看读过,我不太喜欢这门语言。
所以问题很简单:操作系统(引导加载程序/内核)是否可以在不接触一行汇编的情况下进行编程,并且仍然有效?
即使可以,也不会是“跨架构”吧?(i386/arm/mips 等...)
感谢您的支持
您无需组装即可完成大量工作。Linux 或 NetBSD 不必针对其运行的众多目标中的每一个完全重写或修补。大多数代码都是可移植的,然后有抽象层,在抽象层下面您可以找到目标特定层。即使在目标特定层内,大多数代码也不是 asm。我想消除这种错误的想法,即为了对设备驱动程序的寄存器或内存进行编程,例如您需要 asm,您不应该使用 asm 来做这样的事情。您可以将 asm 用于 1) 处理器具有但无法使用高级语言生成的指令。或 2) 高级语言生成的代码太慢。例如,在 ARM 中,要启用或禁用中断,必须使用特定的指令来访问处理器状态寄存器,因此需要 asm。但中断控制器的编程都是用高级语言完成的。第二点的一个例子是,您经常在 C 库中发现 memcpy 和其他类似的频繁使用的库函数是手工编码的 asm,因为它的速度要快得多。
虽然您当然可以在 ASM 中编写和执行任何您想要的操作,但您通常会发现高级语言用于直接访问“硬件(如寄存器、内存位置等)”。您应该继续强化您的 C 技能,不仅要通过 K&R 书,还要浏览各种 C 标准,您可能会发现有多少“实现定义”项目令人不安,例如位域、如何提升变量大小等仅仅因为您 10 年前编写的程序一直使用一个特定品牌的编译器(msvc、gcc 等)进行编译和工作,并不意味着该代码是干净的、可移植的并且将继续工作。不幸的是,gcc 教会了许多非常糟糕的编程习惯,当用户发现他们在十年左右的时间里并不了解该语言并且不得不重新使用该语言解决问题时,这些习惯会让用户感到震惊。