将操作系统移植到新的芯片架构的经验
在将嵌入式系统操作系统移植到不同的芯片架构时，RT-Thread 的维护者们从中学到了什么。曾经有人问我，为什么计算机被称为“计算机”，它们做的事情可远不止计算数字。一台现代的个人电脑可以浏览互联网、播放音频和视频、为视频游戏和电影生成漂亮的图形、模拟和预测复杂的天气模式和流行病风险、将建筑和工程蓝图变为现实等等。计算机之所以能做到这些，是因为所有这些问题都可以归结为数字方程，而计算机的 CPU —— 其中央处理单元 —— 实际上不过是一个简单的计算器。为了让 CPU 向硬盘驱动器发送信号以写入数据，或向显示器发送信号以显示图像，它必须接收指令。这些指令是以 “代码” 的形式出现的，这是一种简明的说法，即必须有人写一个 程序 ，与CPU “说” 同样的语言。CPU 理解的是 机器语言，这是一个大多数人都无法理解的比特阵列，大多数人都不可能手动写出来。相反，我们使用像 C、C++、Java、Python 等编程语言。这些语言被解析并编译成机器语言，然后交付给 CPU。如果你试图用一种它不理解的语言来指示 CPU，它不知道该怎么做。你可以通过尝试用 x86\_64 RHEL 镜像启动 树莓派 来体验这种误传尝试的尴尬结果。如果它能工作就好了，但是不能。将一个操作系统移植到一个新的架构上RT-Thread 项目 为嵌入式系统程序员提供了一个开源的操作系统（OS）。嵌入式领域是非常多样化的，有很多物联网（IoT）、定制工业和业余设备。RT-Thread 的目标是使嵌入式编程对每个人来说都很容易，无论你使用什么设备。有时，这意味着要将一个操作系统移植到一个新的架构上，不管是用于相同架构但指令集略有不同的的芯片，还是用于全新的架构。一开始处理这个问题可能会有点吓人 —— 你可能不知道从哪里开始或如何开始。这篇文章收集了 RT-Thread 维护者在将 RTOS 移植到新的芯片架构时学到的经验。你在开始之前需要知道什么这里是一个看似难以逾越的过程的高屋建瓴的观点。这对你的项目来说可能有所不同，但从概念上来说，这是相对普遍的，即使一些具体的细节是不同的：准备好一个 C 语言的执行环境确认可以通过串行端口发送和接收字符确认上下文切换代码可以工作获取支持的硬件定时器确认中断程序可以通过串口接收和解析数据执行模式对于大多数先进的体系结构，操作系统和用户应用程序运行在不同的权限级别上。这可以防止有功能故障的代码影响操作系统的集成和安全。例如，在 ARMv7-A 架构中，操作系统通常在系统模式下运行，而在 ARMv8-A 中，操作系统可以在 EL2 或 EL3 权限级别上运行。通常情况下，芯片在通电时以最高权限级别执行启动代码。但在此之后，操作系统会将特权级别切换到其目标模式。1、执行 C 代码这一步的关键动作是将 块起始符号 block starting symbol （.bss）部分设置为零，并设置堆栈指针。在 C 语言的实现中，未初始化的全局变量和静态变量通常存储在 .bss 部分，它不占用存储设备的任何空间。当程序被加载时，相应的空间被分配到内存中，并被初始化为零。当操作系统启动时，它必须自己做这项工作。另一方面，操作系统必须初始化堆栈空间并设置堆栈指针。由于 C 语言程序在进入和退出函数时在堆栈上保存和恢复局部变量，所以在调用任何 C 函数之前必须设置堆栈指针。RT-Thread 必须为每个新创建的线程做这个步骤。2、至少使用一个串行驱动器RT-Thread 通过串口输出信息和日志，这也有助于在移植过程中对代码进行调试。在这个阶段，通过串口 接收 数据是不必要的。当我们第一次在串口上看到我们友好的、熟悉的 RT-Thread 的标志时，我们就知道我们走对了路！3、确认上下文切换逻辑一个任务的上下文是它的整个执行环境，它包含通用寄存器、程序计数器、堆栈帧的位置等等。当一个新的线程被创建时，RT-Thread 必须手动分配和设置它的上下文，这样调度器就可以切换到新的线程，就像它对其他线程一样。有三件事需要注意：首先，当 RT-Thread 启动时，默认情况下中断是禁用的。当任务调度器第一次被启用时，它们就会被启用；这个过程是在上下文切换期间用汇编语言实现的。第二，当一个线程退出时，下一个调度将开始，这时拥有的资源会被空闲的线程回收。第三，数据被推入堆栈的顺序必须与从堆栈中弹出数据的顺序一致。一般来说，你希望正常进入主函数和 msh 控制台。然而，在这个阶段无法实现输入控制，因为串行输入中断还没有实现。当串行中断实现后，就可以进行 msh 输入了。4、设置定时器RT-Thread 需要一个定时器来定期产生中断；它被用来计算自系统启动以来所经过的“滴答”。计数器的编号用于提供软件中断功能，并指示内核何时开始调度一个任务。设置时间片的值可能是一件棘手的事情。它通常是 10ms 到 1ms。如果你在一个慢速的 CPU 上选择一个小的时间片，大部分时间就会花在任务切换上 —— 不利于完成其他事情。5、确认串口工作正常在这一步，我们通过串口与 RT-Thread msh 进行交互。我们发送命令，按回车键，然后看着 msh 执行命令并显示结果。这个过程通常不难实现。不过，有一点要提醒大家。在某些平台上，在处理完串口中断后，别忘了清除中断标志。一旦串口工作正常，移植过程基本上就完成了。实践为了将你的项目移植到不同的芯片架构上，你需要非常清楚地了解你所针对的芯片的架构。熟悉你的项目中最关键的部分的底层代码。通过对照芯片的手册结合大量的实际工作经验，你会了解芯片的特权模式、寄存器和编译方法。如果你没有需要移植到新芯片的项目，请加入我们；RT-Thread 项目总是需要帮助将 RTOS 移植到新的芯片上！作为一个开源项目，RT-Thread 正在改变开源嵌入式编程的面貌。请在 RT-Thread 俱乐部介绍你自己并寻求帮助!本文基于 DEV 社区上的 如何将操作系统移植到不同的芯片架构上？，并经许可转载。via: https://opensource.com/article/21/5/port-chip-architectures作者：Alan Smithee 选题：lujun9972 译者：wxy 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
为什么我们不应该接受低劣的Linux移植游戏
由于最近The Witcher 2的惨败，我想写下些想法，为什么我们不应该接受来自开发人员的品质低劣的移植游戏。最近几年在我们的Linux游戏库里面有如此多游戏，以至于你现在可以看到来自Linux玩家的评论“我们已经有很多游戏了！”可能这些声音来自很多像你一样的人。感谢Valve 和 Steam，之前我们从来没有得到过这么多的开发者的关注。同样由于开发者的推进，我们看见了伴随而来的各种移植游戏，坦率地说，它们的质量十分的低劣，或者说对于大多数人们来说根本不值得去看一眼。现在的问题就是，如果我们继续接受这种低水平质量的移植，Linux就会赢得一个游戏质量水平低的名声。请认真考虑一下这样的后果吧！再想象一下，如果那些AAA级的开发者给Linux推送了大量游戏，其中使用了The Witcher2 移植所用的“eON”技术。看起来就像我们有了大量开发者，突然之间Linux有很多大牌游戏了。然后你可以看见大量的人尝试Linux，却发现它们的游戏在同等硬件之下却有着糟糕的画面，就会给他们一个印象，Linux对游戏不友好。这对我们所有人都很糟糕。我已经看见许多人说“这个工具包用于移植没关系？”。这在我的眼里看来是一个非常天真的想法。当然，这有关系， 它意味Linux的游戏里面的光线和白天的不同品质。这就直接追溯到我上面关于Linux游戏的观点上了。你可以坚持说工具包没有关系，而且使用任何一个你想用的比较/类比的效果，但如果工具包是导致问题的根源，就像我们说的计算机占用了99%的处理能力的软件一样，是的，它当然有关系！如今，我已经看见许多来自其他主流网站发表的评论，“我们应该接受它们并且作感谢状，我们毕竟拥有了它们”。那些都是鼠目寸光的人们说的胡话！想想，那些开发者和发行商看到那些低劣的Linux移植游戏也能被接受时，他们的脑里只有钱。消费者对Linux游戏的感知就会进一步恶化，就是因为这些低劣的移植品。我可以接受这些来自开发者的移植，毕竟是我运营着这个网站（ http://www.gamingonlinux.com/ ）。但是，如果我作为一个消费者不愿意为在windows运行挺好的游戏买单，而却为在Linux慢得像蜗牛一样的游戏买单？我会么？你会么？最后附加的一点：你绝不应该攻击一个试图在社区里面解决问题的开发者，这样是不可以的。反馈是很好，骂人却是很幼稚的，这会使得Linux看起来更糟。via: http://www.gamingonlinux.com/articles/why-we-shouldnt-accept-bad-linux-ports.3765译者：Vic020 校对：wxy本文由 LCTT 原创翻译，Linux中国 荣誉推出