请问如何移植GBA移植mysql到arm平台台?

WP473  Zynq(R) UltraScale+ (TM) MPSoC 的核心 ARM(R)v8 架构使系统设计人员只需极少量修改就可以快速启用并运行现有的 ARMv7 代码。这种架构兼容性使设计人员可以提高生产力,加速产品上市进程,同时减少开发成本和工程设计投资。WP473  软件设计人员运用基于新一代 ARMv8 架构的赛灵思 Zynq UltraScale+ MPSoC,不仅可以充分利用其先进性能,同时还能保持现有软件投资。  在美国计算机学会杂志《美国计算机协会通讯全集》的一篇专栏中,Steve Furber 指出,32 位 ARMv7 SoC(例如 Zynq UltraScale+ MPSoC)是最丰富和最受欢迎的 SoC 产品。[ 参考资料 1]&另一层隐含的意义是:ARMv7 SoC 的用户群很大,意味着软件---- 从简单的库、工具一直到完整操作系统---- 的用户群更为庞大。最近,随着向 64 位平台的移植持续加速,系统设计人员面临的问题在于:是花大力气将现有软件移植到新架构,还是简单地在新平台上重新开始开发软件。[ 参考资料 2]  任何一个具有一定规模的软件项目都需要投入大量的人力和软件架构。损失这些投资无论从短期还是长期看对项目都有毁灭性影响。因此,SoC 平台之间的软件移植会带来很大不确定性。移植不当很容易导致功能和性能不理想。在这个需要缩减设计预算和加速产品上市进程的时代,不允许有太多的不确定性。  赛灵思 Zynq 产品组合的最新成员 Zynq UltraScale+ MPSoC 采用新一代 ARMv8 架构,其精湛的设计可解决上述种种问题。ARMv8 采用设计人员熟悉的 CPU 架构和软件开发流程,使他们能够立即着手进行项目移植,且可将现有软件基础架构投资损失降至最低。  Zynq UltraScale+ MPSoC 中的 ARMv8 架构与前代 ARMv7 架构兼容,同时可扩展支持最新特性与功能,因此能够从根本上简化软件移植。这样可创建熟悉的开发环境,让软件开发人员在移植过程伊始就能专注于代码本身。ARMv8 架构通过两种基本方式实现这种深度兼容:ARMv8 架构支持两种不同执行状态:AArch32,本机 32 位状态AArch64,本机 64 位状态AArch64 状态中的 64 位 ARMv8 指令集是 ARMv7 中指令集的自然延伸;AArch32 状态中的 32 位指令集直接兼容于 ARMv7 中的指令集。  AArch64 执行状态是本机 ARMv8 执行环境。它支持 ARMv8 架构的完整特性集与功能。相反,AArch32 执行状态提供与 ARMv7 环境的本机向后兼容。从软件执行角度来看,该状态为本机 ARMv7 环境。开发人员可选择让代码在编译时间内在哪种执行状态下运行。正常运行时间内,CPU 可在 AArch64 和 AArch32 这两种执行方式之间即时切换,以提供软件所要求的执行环境。这些上下文变化发生在异常边界,无需用户或软件设计人员进行输入;32 位代码和64 位代码高效并行执行。  当在 AArch64 状态下运行时,提供完整的 64 位 ARMv8 指令集。很大程度上,64 位 ARMv8 指令集是ARMv7 中指令集的延伸。只需对指令集在语法和行为上稍加修改,就能支持 32 位指令以及 32 位与 64 位混合寄存器。当在 AArch32 状态下运行时,处理器使用标准 32 位指令以及 32 位寄存器;软件设计人员处理指令集的方式与使用其他 ARMv7 处理器时相同。WP473  低层裸机和 RTOS 代码开发人员是受低层处理器架构差别影响最多的人。当开始移植软件时,最佳方式是启用编译器中所有警告和错误消息,使用 ARMv8 编译器重新简单编译软件,不做修改。对这种方式下生成的警告或错误信息进行分析,这样软件开发团队可以确定哪些错误可以忽略,以及哪些需要在移植过程中加以注意。  ARMv8 编译器本机支持标准高级代码,例如 C 和 C++ ;当有合适的 ARMv8 板支持包 (BSP) 时,可编译和运行这类代码。相比之下,汇编代码时则需要特别注意如何使用代码。尽管 ARMv8 中依然存在诸多 ARMv7 汇编指令,但是它们的语法或行为存在微秒的变化。有些编码结构的编译或行为与 ARMv7 不同,其中包括:硬编码存储器位置( 适用任何软件移植项目)、对 ARMv7 协处理器( 例如 CP15) 和寄存器名称的访问,以及数据对齐。由ARM 发布的ARM(R) Cortex (TM) -A 程序员ARMv8-A 使用指南 (DEN0024A) 对移植问题进行了详细的分析。  我们不妨看看容易移植的代码实例以及会产生问题的代码,这样有助于我们从概念上讨论架构之间的区别。  有的指令只需很少的操作就可从 ARMv7 转换为 ARMv8 语法,ADD 指令就是个很好的例子。ARMv7 中的寄存器的命名方案为 Rn,其中 n 是寄存器的个数。这样命名直接了当,因为 ARMv7 中所有寄存器都是 32 位。在 ARMv8 中,寄存器既可以是 32 位也可以是 64 位。32 位寄存器的命名方案为 Wn,而 64 位寄存器的命名方案则为 Xn。这样软件设计人员必须根据正在考虑的操作对象的尺寸,对现有的代码进行评估并适当地修改。见表 1。表 1 :ADD 各种环境中指令命名方案ARMv7ARMv8 A32ARMv8 A64(32位)ARMv8 A64(64 位)ADD Rd, RnADD Rd, RnADD Wd, WnADD Xd, Xn  移植 ADD 这样的指令不仅需要评估代码的最终用途,还要相应地改变寄存器名称。根据整个代码库的复杂程度,甚至可以自动执行移植。  其他情况下,例如访问 ARMv7 协处理器,可能需要更全面的代码分析。这种分析被认为是最佳方法,因为协处理器控制很多针对整个处理器的系统级属性和功能,而且控制协处理器是针对ARMv7 的常见操作。  当在 AArch64 状态下运行时,无法直接访问 CP15 寄存器,因为它们不在 ARMv8 架构中。当在 AArch32 状态下运行时,则可通过概念协处理器访问它们。这是由 AArch32 执行状态提供的结构,用于为原有的 32 位代码提供一致的执行环境。  例如,假设一个程序需要 Main ID Register ---- 协处理器 CP15 中 c0 寄存器的一部分---- 的内容。使用 ARMv7 的专用 MRC 指令和 ARMv8 的 AArch32 执行状态访问这个值:MRC p15, 0, r1, c0, c0, 0  直接在 AArch32 状态运行的原有代码无需修改;但移植到 AArch64 状态的代码需要根据新架构的要求进行调整。  在本机 AArch64 执行状态下,Main ID Register 值位于名为 MIDR_Eln 的新专用寄存器中。该寄存器可方便地通过系统寄存器访问指令来访问。MRS: & & & & & & & & & & &MRS x1, MIDR_EL1  因此,开发人员应该知道这种专用操作和调用,以便相应地更改汇编指令。同样,这是单行修改,不会影响周围软件代码的整体结构。此外,还要注意源寄存器和目标寄存器都是本机 64 位寄存器,与 64 位架构的其余部分一致。WP473  对基于 Linux 操作系统的软件而言,移植条件通常比 RTOS 或裸机代码更直接。底层的 Linux 操作系统可通过抽象消除很多底层硬件中的差异。大多数情况下,只需使用 64 位 Linux 编译器进行重新编译就可以让代码运行在 64 位 Linux 上。赛灵思 PetaLinux 工具可针对64 位 Linux 环境在本机中整合和重新编译代码,从而自动执行该过程。  其他情况下,开发人员可能需要使代码保持为 32 位二进制数。软件可能需要与只有 32 位形式的外部库链接;或者包含需要花时间转换的 32 位汇编代码。移植这类软件时,可利用很多现代 Linux 版本中都有的 multiarch 或 multib 功能实现显著加速。尽管不是完全一样,但这些经常可以互换使用。  Multiarch 是一种系统和文件系统布局的配置方法,以便运行 32 和 64 位动态链接程序。原来的32 位 ARMv7 Linux 程序无需修改,可直接导入,并与新的 64 位程序共存。该功能可用来快速建立并运行系统,同时移植特定的 32 位应用程序并针对底层 64 位架构进行微调。  支持Multiarch 的版本将 32 位和64 位库纳入相同 Linux 文件系统中,以实现这种兼容性。当执行 64 位应用时,使用本机 64 位库;32 位应用则使用 32 位库。  创建和维护 multiarch 操作系统需要投入不少时间。幸好,开源项目,例如 Yocto Project、Canonical 和 Linaro,提供易于集成的内容。Yocto Project 提供完整的端对端构建系统;Canonical 和 Linaro 提供现成可用的参考文件系统,使开发人员快速取得进展。赛灵思答复66636 详细介绍了如何在 ZCU102 评估平台上集成 Ubuntu Core 14.04 文件系统。  默认情况下,这些 multiarch 文件系统只使用 64 位应用程序。由于它们基于 dpkg 管理工具,因此只需简单的命令行接口即可添加更多架构:# dpkg -add-architecture armhf  配置 dpkg 工具以支持 32 位架构( 例如 armhf),然后,使用更高级的封装管理工具,例如 apt-get,就像在 Linux 的 Intel x86 兼容版本上一样。  对于有些系统来说,通过 multiarch 在 64 位主机上运行现有的 32 位应用程序就足够了,无需其他工作。对于其他系统,multiarch 可起到节省时间的作用,同时还要对软件协议栈的其他部分进行微调,并针对底层 64 位架构和操作系统来优化它们。WP473  ARMv8 为软件开发人员提供很多性能、安全和架构方面的新功能,但是,如果软件开发人员因担心丢掉现有的软件架构而不愿意使用它,那么这些新功能也就无用武之地。ARMv8 可从硬件和软件接口实现处理器架构的自然演进,从而消除这种顾虑。将开发人员熟悉的指令集实现自然演进,以此简化低级代码的移植。此外,还可以回退到 AArch32 状态,这样开发人员就能够快速运行现有的32 位代码,以最少的时间和精力在新硬件上评估代码。最后,multiarch Linux 允许将一些代码不经任何修改直接运行,这样就可以显著减少整体系统集成。ARMv8 处理器,例如 Zynq UltraScale+ MPSoC 允许开发人员利用新一代功能并保持原有软件投资。  如需了解有关 Zynq UltraScale+ MPSoC 的更多信息,敬请访问:
也可以查看 ARM 的官方移植指南。Jason Fitzpatrick, “Steve Furber访谈”《 美国计算机协会通讯全集》第54 卷,编号:5 :David Brash, “ARMv8-A 架构演进” ARM Connected Community, 2016 年 1 月 5 日:关注我们此方需要你的加入此方智能交互(cfznsh) 
 文章为作者独立观点,不代表微头条立场
的最新文章
一套可以被规划师、城市设计师、建筑师与景观设计师用来重新定义公共与私人边界的策略本周二之前,苹果涉嫌逃税的涉案金额还只是10亿欧元的“小钱儿”。没想到过堂之后欧盟狮口大张,裁定苹果需补缴1摘 要WP473 Zynq(R) UltraScale+ (TM) MPSoC 的核心 ARM(R)v8 架构使系统设计转自此方供应合作方硬蛋网上帝说,要有光,世界便有了光。当我们在享受电灯带来的各种便利时,身处在发展中国家贫困来源:拉勾网作为一名设计师,最重要的几点特质是:逼格高,审美强,品味好。设计师的品味,真是体现在了日常生活中的方方面面。扫除大家对“编程”的刻板影响,一路玩转编程。腾讯QQ推出AR传火炬功能。《什么是iBeacon?》行业解读视频短片如期与大家见面了,无论你对iBeacon有怎样的理解,听听企业大佬们怎么说!去年年底,伦敦的动画师James Curran在纽约长住了一阵子,激发了他如鸡血一般的创作灵感。于是他把纽约“一项十亿美元的大事业不会来自你最糟糕的一段时光,它只会发生在你处于最佳状态的日子里。设计师脑洞大开,电线塔也跳起了华尔兹~来看一看这位美女机器人吧~霍金教授于今天上午10时12分发出第一条微博,1小时内就破了30万人~戴上VR眼镜,让你身临其境逛淘宝~准备剁手吧...四个步骤,你的手机也可以立体成像~专属软妹的智能"防狼"好物~创意!体验!目前中国新建建筑中,智能建筑比例已达到40%,而智能建筑究竟是什么呢?应该怎样智能布点呢?cfznsh此方打造市政空间、商业空间、办公空间及居住空间等环境下的智能交互系统服务。此方,为您营造。热门文章最新文章cfznsh此方打造市政空间、商业空间、办公空间及居住空间等环境下的智能交互系统服务。此方,为您营造。如何将需要***到linux的程序移植到arm中_百度知道收藏(24)
(讲嵌入式移植的一篇非常好的文章,原文出自《基于arm+uClinux的嵌入式系统的开发》,这是节选了其中讲移植的这一段)
不同平台间程序的移植--简单程序的移植
研究程序移植的那两周是最痛苦的两周,没有太多可以借鉴的东西,只能摸黑向前走,于是更加坚定决心要整理些东西给后来的弟兄。不过话说回来,各位弟兄别被我前面说的吓倒,只要搞清你要作什么,程序移植其实是比较简单的事情。
首先列出一些问题:
(1) X86上运行的程序能不能在51单片机上运行,为什么,有没有可能,如果可以,应该做哪些工作才可以实现。
相同CPU平台,DOS的程序为什么可以在windows下运行,能不能在linux下运行,为什么,作什么工作可能实现。
为什么可以移植程序,为什么要移植程序?
程序可以移植首先要感谢开发出高级语言的大牛们,记住,无论多么漂亮的代码经过编译以后都要变成CPU可以识别的机器语言,而几乎一千种CPU说着一千种语言。为保证大家有共同语言,规定一种高级语言——高级语言。每一个CPU派出自己的翻译——编译器。这个翻译精通两国语言,高级语言和自己的语言。(由此已经可以看出编译工具在程序移植中的重要性)。只要程序没有硬件上的约束,可以说这种沟通是无极限的,甚至于不同操作系统平台。(操作系统也是程序,也可以移植喽)举例:在x86的windows下用VC(或TC,BC)编一个c程序实现i=i+1,丝毫不改就可以用51的C编译器重新编译并在51单片机上运行。一次小型的移植就结束了。
可以移植已有的程序还要感谢开放源代码的弟兄,没有这些C文件和***件让你重新编译一下,怎么在你的CPU上跑?其实不止这些,后面还会看见开源组织的牛人专为程序可移植性所作的专门的工作。
那么为什么要移植程序?
问这问题就像问地上有个钱包为什么要捡一样,***不言而喻。现成的东西为什么不要。当然,移植程序可没有捡钱包那么简单,尤其是第一次,后面会说一些移植之前应该考虑的问题。(就像现在地上有个钱包也千万别上去就揣自己兜里,说不定就是套)。另一方面,你给我你写好的程序让我拿去用,我还要考虑一下,或许里头问题多的还不如自己写一个。我这里所说的可移植的程序应该是维护比较好,比较成熟的源代码(像我后面的所说的UCD-SNMP),目前的开放源代码运动决不仅仅是把自己的程序公开就行了,而是有了一套成熟完整的版本控制,BUG报告和PATCH提交流程。
这样的代码才有更大的使用价值。
什么时候可以考虑移植程序?在基于嵌入式操作系统进行开发时,具有一定规模的程序都可以到网上查一查都没有成熟的源代码可用。前面已经说到,程序的移植最终只针对CPU,其实和操作系统没什么关系,但另一方面,因为代码中可能会使用一些库函数,这些库会包括C语言标准库和操作系统提供的API(应用程序接口)库。假设源代码中只包括
C标准库,那么该程序就可以跨操作系统去移植。例如hello
world程序中使用了printf,因为该函数是C标准函数,所以在X86上使用TC(BC或VC)可以直接编译运行,在ARM+uClinux平台下也一样,但如果程序中调用了vfork函数,那么只有
linux一脉相承的操作系统支持这种特殊服务了,在window或dos操作系统下无法直接编译该程序了。只能找该操作系统支持的类似的功能来实现。再进一步,硬件上的生理缺陷也会为移植带来麻烦,S3C4510B不支持MMU,在其上运行的uClinux也不提供和MMU有关的服务(其实
uClinux本身可以支持MMU),于是在移植前相关的函数(比如FORK)都要被替代掉(使用VFORK)。好在uClinux和linux提供的应用接口大部分还是相同的。所以这样的工作还可以承受。
由上可知,如果是在各种嵌入式linux(除了uClinux以外,还有好几种)平台上开发,那么针对该平台以及linux平台上的源代码都可以使用,但是要牢记他们之间的差异。在我的系统中需要实现网络监控,所以想使用snmp协议,该协议和http,ftp一样属于应用层的成熟协议,专用于网络管理。目前已经有一些针对该协议成熟的代码,最有名的是ucd-snmp,不光软件本身功能强大,可移植性也比较好,在linux,unix等平台上都可以移植,于是决定将它移植到ARM+uClinux平台上(别看现在说的这么轻松,当时接这活时都有点哆嗦)。
简单总结一下,移植应用程序的前提是有源代码,移植的关键工具是编译器,源代码中和硬件平台相关的东西越少越好(这里主要指使用了汇编,或做了针对自己平台的事,比如将指针指向特定地址然后操作),另一方面,如果该程序是基于某个操作系统(利用了操作系统提供的特殊服务,即
API),要看自己的操作系统是否提供了相关服务。
下面简单列出一些我认为移植时需要考虑的问题:
自己的操作系统的特点以及在当前版本下支持的特性。
例如:uClinux不支持MMU,同样就无法支持相应的特性。
(2) 硬件资源。
因为嵌入式系统资源比较紧张,硬件资源考虑必须要周全:
(1) 软件存储空间的大小
这一般要等用目标编译器重新编译完以后可能才会知道,所以只能大概估算,但千万不要看这个程序在linux下只有几十k,就认为程序很小,这是因为linux下程序多时使用动态库,而在嵌入式系统中,很有可能是把用到的库都链接在一起,所以程序的尺寸会大大增加。
(2) 程序运行空间。.
(3) 硬件以及相应的驱动是否完备
以上工作应该尽量做,但有时事先无法把握,只能听天由命了(有没有搞错!!)
可能有人已经要晕菜了,振奋一下大家,如果找到了好的源代码(可移植性好),那么剩下的如要工作就是玩转你的编译器,只要你能顺利的把源代码用你的编译器重新编译一下。90%的工作就完成了(不是吗)
上回已经介绍了一些编译器方面的东西,下面针对我的ARM编译器的具体参数来讲解一些编译器主要参数的设置。
加入我已经有了hello.c,在x86的linux平台下编译链接一下。
gcc &c hello.c 产生.o
gcc &o hello
hello.o 产生可执行文件,上回说过,主机编译器参数都有环境变量保存,所以看起来很简单。这里我故意分两个步鄹。
下面看一下用我的编译器编这个程序(心脏不好的先吃药)。
arm-elf-gcc -Iroot/uClibc/include
-msoft-float -mcpu=arm7tdmi -fomit-frame-pointer -fsigned-char -mcpu=arm7tdmi
-Os &Wall -DEMBED -D_uClinux_ -c hello.c
这只是编译,将参数逐一讲解。
Arm-elf-gcc 是gnu的arm编译工具
1)Include地址:参数:-I
值:root/uClibc/include(这是在主机上我的uClinux的头文件路径) 用法:-I root/uClibc/include
-I参数保证后面的头文件路径在搜索系统头文件路径前被搜索从而有可能替代系统的头文件,如果有多个这样的参数,则搜索的顺序是从左到右,然后是系统的头文件。
2)-m 是针对CPU的选项。
-mcpu=arm7tdmi 说明CPU类型
-msoft-float 产生包含浮点库的输出
-fsigned-char 让char类型有符号
-fomit-frame-pointer 对所有不需要帧指针的函数都不将其保存在寄存器中。
3) -Os &Wall
-Wall:所有警告都显示
Os:优化尺寸,该选项使能所有所有不增加尺寸的O2优化,并且进一步根据尺寸优化
4) = -DEMBED -D_uClinux_
-D: 将-Dmacro 后的macro定义为字符串1。
以下是链接:
arm-elf-ld -L/root/uClibc/lib -L/usr/local/gnu/arm-elf/lib
-L/usr/local/gnu/lib/gcc-lib/arm-elf/3.0.1 -elf2flt &o hello
/root/uClibc/lib/crt0.o /usr/local/gnu/lib/gcc-lib/arm-elf/3.0.1/crtbegin.o
/usr/local/gnu/lib/gcc-lib/arm-elf/3.0.1/crtend.o -lc -lgcc &lc
1) 链接工具: arm-elf-ld
2) -L指明需要链接的库的路径,用法和-I一样,自己的库的路径也可以在这里加入。
-L/root/uClibc/lib -L/usr/local/gnu/arm-elf/lib
-L/usr/local/gnu/lib/gcc-lib/arm-elf/3.0.1
3) &o 后面紧跟生成的最终的文件名
4)/root/uClibc/lib/crt0.o
/usr/local/gnu/lib/gcc-lib/arm-elf/3.0.1/crtbegin.o OBJECTS.o
/usr/local/gnu/lib/gcc-lib/arm-elf/3.0.1/crtend.o
这是需要链接在一起的.o文件
-lc -lgcc &lc -l
后面紧跟的是需要链接的库的名字,一般库的名字是libxxx.a,使用时为-lxxx即可,不加lib和.a。还要注意位置,自己的库文件应该加在他的库前面。
编译通过后,移植就算完成了,对于比较小的源代码都可以这样,即先分析他的编译选项(用到了那些头文件,库文件等),然后用自己的编译器对照相应参数重新编译一下就行了。
当然这只是简单程序的移植,复杂案例在下一次讲吧。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:25302次
排名:千里之外
转载:29篇
(1)(1)(1)(2)(1)(10)(5)(1)(2)(2)(2)(1)基于ARM的平台设计和系统移植_图文_百度文库
两大类热门资源免费畅读
续费一年阅读会员,立省24元!
基于ARM的平台设计和系统移植
上传于||暂无简介
阅读已结束,如果下载本文需要使用2下载券
想免费下载本文?
定制HR最喜欢的简历
下载文档到电脑,查找使用更方便
还剩72页未读,继续阅读
定制HR最喜欢的简历
你可能喜欢2710人阅读
Lua/LuCI(5)
Lua是一门很小巧的语言,为保证良好的可移植性,Lua使用ANSI C编写。因此Lua的移植灰常简单,只需要使用正确的交叉编译器就好了。
本文介绍如何将Lua移植到ARM平台,分x个步骤,并使用如下环境:
1. 操作系统:Ubunt10.04
2. 交叉编译器:arm-linux-gcc 4.3.2版本(如果你不知道怎么搭建交叉编译环境,可以参考我的另一篇文章:&)
3.Lua5.1版本源码
移植步骤:
1下载Lua源代码:
2 解压并进入目录,如图:
3修改并保存Makefile文件(共两处):第一处:第8行PLAT= none修改为PLAT= ansi
第二处:第10行CC= gcc 修改为CC= arm-linux-gcc
&&&& 4执行make命令,如图:
生成很多.o库文件,一个lua可执行文件(解释器)和一个luac可执行文件(编译器,产生中间代码)。
&&&& 5如果不打算在你的ARM开发板上使用那些库而只是想运行Lua脚本,则只需要将lua文件复制到开发板即可。写个简单的脚本试试吧:
--[测试脚本: test.lua--]
name = &Tom&,
eat = function(self, food)
&&&& food = food or &unknown food&
&&&& print(&My name is & .. self.name .. &\nI eat & .. food)
Animal:eat(&fish&)
执行:./lua test.lua
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:181219次
积分:2041
积分:2041
排名:第14038名
原创:38篇
转载:76篇
评论:12条
(2)(1)(1)(3)(3)(3)(1)(2)(4)(2)(5)(2)(9)(5)(10)(30)(6)(7)(9)(8)

参考资料

 

随机推荐