aarch64的操作系统。 第0周。

让它成为我有史以来最雄心勃勃的项目。 我感觉未来的IT世界将发生许多变化。 我可以尝试预测其中一些,甚至可以做到。 在我看来,未来应该是多事的,这需要表现。 它应该是安全的,这意味着涉及加密和隐私。 而且,它应该是环保的,并且能耗低。

我想将这三个概念放在使用低级工具从头开始编写的新的ARMv8操作系统操作系统的基础上。 我相信这种架构是当今最有前途的,并且我想以最佳方式使用硬件来实现最高性能。 我计划在手机,平板电脑,笔记本电脑和小型计算机等便携式设备上运行它。 对于开发平台,Raspberry Pi 3因其开放性而被选中。 但是,第一步将在QEMU下完成。

我每周都会发布有关开发过程,解决方案和算法的注释。 项目本身和文档由GitHub托管在“ lowenware / os”存储库中。

架构aarch64,也称为ARMv8,是一个相对较新且非常有吸引力的。 对于那些熟悉x86汇编语言的开发人员,我可以说这是非常不同的。 例如,ARMv8不提供惯用的push / pop命令,但是您将拥有一组功能强大的工具来从内存中加载和存储寄存器。 就像我讲过“推入和弹出”一样,例如,您可以仅使用一个命令将两个寄存器存储在堆栈中: STP x0,x1,[sp,-16]! 简而言之,它将来自寄存器x0x1的值存储在sp寄存器的地址处,并将其值减去16个字节,这是两个64位寄存器的大小。 命令LDP x0,x1,[sp],16将从堆栈中加载值,从而更改其指针。 我可以说不是sp可以是其他任何寄存器吗? 另一个有趣的功能是,当您调用子例程时,返回地址未存储在堆栈中。 ARMv8为此提供了特殊的寄存器lr (链接寄存器)。 只要寄存器比内存快得多,您就可以在不调用内部子例程的子例程上节省CPU时间。 还有很多事情(我很确定)是,许多开发人员将重视的是,您可以为所有算术命令的所有操作数和目标指定寄存器,而不是记住应该在哪里存储它们以及在哪里找到所有结果。时间。 例如, ADD x0,x1,x2将计算x1x2之和并将结果存储到x0中 。 甜蜜,不是吗?

我发现所有这些功能和差异都实现了调试输出。 在我可以在屏幕上输出任何内容之前,将花费一些时间,但是现在有更好的可能性。 QEMU仿真器可以将从来宾OS发送到UART0的所有数据输出到您的HOST计算机的终端。 说到Raspberry Pi 3,如果您通过零调制解调器电缆将开发板连接到PC,则也是可能的。 QEMU虚拟设备的实现非常简单。 UART0输入端口映射到地址0x09000000,无需等待端口准备就绪。 您只需要将调试数据逐字节存储在此地址。 现在,我有三个过程_uart_putc,_uart_putx和_uart_puts来打印字符,十六进制整数和以空值终止的字符串。 也许以后我还需要例程来输出n个字节。

但是仅打印一些输出并不总是足以进行调试,并且我已经为GNU调试器(gdb)准备了一个环境,该环境可以通过TCP端口与QEMU连接,以逐步执行控制。

我希望这很有趣。 实现和编写的下一个功能是内存分配。 敬请关注!