如何给ARM-linux移植桌面系统?哪款桌面系统适合入门移植?

发布时间 2023-07-15 22:46:14作者: MaxBruce
原文:https://www.zhihu.com/question/23660593

如何给ARM-linux移植桌面系统?哪款桌面系统适合入门移植?

 
如题。比如 ubuntu 看网上介绍 是 Unity 还是 Gnome 的,但是搜了一下好像移植桌面环境这方面的资料很少。有没有做过类似工作的大神指明学习的道路呢?

还有 GUI 与 桌面系统 是什么关系呢?

既然你在搞arm-linux,那么相信你对于linux内核应该不陌生,

也应该知道在没有桌面环境的时候linux内核和其他软件包共同组成的系统的用户界面是纯命令行的。

首先我们考虑直接为arm芯片写裸机代码,此时假设你需要图形界面,怎么办?显然,我们需要某种在屏幕上进行绘图的能力,这样就能画出我们熟悉的标题栏,熟悉的菜单,构成每天都在用的窗口。怎么进行绘图呢?传统的做法是在芯片的地址空间(32位的芯片通俗来讲地址空间有4G,我相信你一定熟悉这个)中分配出一段区域作为显存地址空间,然后某种电路(比如LCD驱动电路,显卡)通过某种神秘的方式连接这段显存与显示器。往显存中写不同的内容,显示器中就可能会出现不同的画面。你可以想象一下烂大街的LED点阵屏幕的原理。如果你写过arm的裸机代码的话,就会发现,妈蛋,好麻烦,写了好多代码才把ram驱动起来,还不知道malloc这等函数啥时候才移植的过来,LCD驱动程序更是遥遥无期,看文档眼睛都看瞎了还不一定搞得好。so,你需要linux内核来做这些基础工作。由此你的内存有linux帮你管理了,IO也有linux帮你管理了,顺带的,LCD驱动它也可以有。不知道你有没有听说过framebuffer这个东西。简单的说,这个驱动能够将显示器上的每一个像素映射到一段内存,这段内存使用起来与其他用malloc直接分配的内存完全没有区别,神奇的是,你按照某种规则往其中写内容,显示器就会按照某种规则重现内容。这与之前在使用arm裸机绘图中说的情况类似。好了,总结下我们现在拥有了什么。arm芯片以及配套的ram等外围芯片,已经有了LCD驱动的的linux内核,framebuffer驱动,LCD显示器。linux内核是自带字符界面来闯荡江湖的,当然,如果不是通过串口或者其他的什么口来得到眼睛可以看到的字符界面,这些字符还是需要绘制在屏幕上,显示原理本质上与窗口系统也没有区别,无非后者要复杂的多。在稍作配置之后,linux内核就能通过framebuffer将字符界面绘制到屏幕上,就得到了最简单的人机接口。你想要的是图形界面,我们可以按照之前说的,自己往framebuffer上一个点一个点的绘制标题栏,菜单栏,xxxx。理论上最终可以得到一个完备的GUI。但是实际上呢。。这不太科学。一是太难,二是没有必要,都到了arm-linux这个层次,我们无需像单片机那样从头搞。在使用现成的GUI系统后,绘制的单位可能就变成了一个控件一个控件,而且还附带布局管理等诸多高级技能。你知道gnome,kde也应该是了解的,还有个不容忽视的东西就是Qt。Qt与前两个东西之间容易既区别又联系,很容易引起困惑,还有个流传很久的qt qtpia,以及后来新出的qt embedded。这里要分清楚的是,gnome,kde,Qt qtpia,Qt Extended这四个是同一种东西,即桌面环境。而Qt库,是GUI图形包,它是桌面环境的子集。实际上Qt库也可以编译成arm-linux的版本,与我们之前的arm-linux-lcd驱动-framebuffer驱动组合起来,就成为了一个带GUI图形包的系统,此时我们写一个Qt程序,在系统启动时启动这个程序,我们就可以进入一个图形程序。想象一下,这个效果大概就是你得到了一个全屏的firefox浏览器,你没有传统意义上的桌面,没有开始菜单,也没有其他程序,你就只有一个firefox浏览器。你只能用firefox这么一个程序。可能你在想,如果我再写一个Qt程序,也启动它呢。嗯,linux是多进程多线程系统。。你这样当然是可以的,Qt也具备了简单的窗口管理功能,但是你还是没有开始菜单,你还是没有任务栏,你强迫症犯了想右键刷新一个也不行。坚毅的你肯定是不服输的,你又想,这些开始菜单啊之类的,说白了不还是程序么。你对了,你当然可以再写若干Qt程序来完成这些任务,好了,开始菜单有了,任务栏也有了,xx也有了,连oo都有了。然后你发现,妈蛋,这些程序的文件都好乱,浏览器放在这个位置,其他的程序又放在其他位置。洁癖犯了,你搞了个规章制度,规定了配置文件要放在/etc,xxx文件要放在ooo。最后呢。。你就得到了一个桌面环境,这个环境本质上与Qt Qtpia和Qt extended是一样的,再复杂一些,就是kde,gnome这种样子了。

 

这是Qt Qtpia的经典界面<

 

 

 

这是Qt extended的界面,楼主感受

 

这是meego,本质上也是同一类东西,不过meego似乎是指带了整个系统,而不仅仅是桌面环境回头移植桌面环境的话题上来。希望你能确定一点:你的应用场景是什么,是需要一个像桌面PC一样的那种界面,是上面我贴的图这种界面,还是系统一启动直接进入一个应用,就像ATM机的那种界面?对于第一种场景,如果你的arm芯片够强劲,直接移植debia就可以了,这货是有arm的分支的对于第二种,移植qtpia或者qt extended对于第三种,移植qt,minigui或者其他的什么(我是qt脑残粉),然后自己基于这个图形包写个程序