背景

这篇文章主要是在和同事在一起测试过程中,文中很多内容都是同事提供,征得同事同意,把测试过程和测试结果发出来。感谢zhangjunli。

使用场景

K1 Power服务器是高端商用的服务器,与x86生态不一样的是,目前主要是面对企业,并不针对个人用户。因此在个人笔记本或者工作站方面国内很难看到有基于Power处理器。PS:美国有一家Raptor公司有台式机基于Power处理器的。

在x86硬件上交叉编译得到在Power服务器上运行的二进制文件,这样更合适不能短时间拿到基于Power硬件的系统环境的。

文章内容

主要包含两个内容:
1.在x86 环境中,交叉编译得到power上运行二进制文件。
2.在x86环境中,安装Power Linux的虚拟机,在虚拟机中完成编译等工作。

交叉编译

在x86环境操作,确认x86环境

junli@zhangjunli00:~$ uname -a
Linux zhangjunli00 4.4.0-18362-Microsoft #476-Microsoft Fri Nov 01 16:53:00 PST 2019 x86_64 x86_64 x86_64 GNU/Linux

在x86上安装自带的交叉编译工具 ,查看gcc版本。

junli@zhangjunli00:~$ sudo apt-get install crossbuild-essential-ppc64el
Reading package lists... Done
Building dependency tree
Reading state information... Done
crossbuild-essential-ppc64el is already the newest version (12.4ubuntu1).
0 upgraded, 0 newly installed, 0 to remove and 3 not upgraded.junli@zhangjunli00:~$ powerpc64le-linux-gnu-gcc -v
Using built-in specs.
COLLECT_GCC=powerpc64le-linux-gnu-gcc
COLLECT_LTO_WRAPPER=/usr/lib/gcc-cross/powerpc64le-linux-gnu/7/lto-wrapper
Target: powerpc64le-linux-gnu
Configured with: ../src/configure -v --with-pkgversion='Ubuntu 7.5.0-3ubuntu1~18.04' --with-bugurl=file:///usr/share/doc/gcc-7/README.Bugs --enable-languages=c,ada,c++,go,d,fortran,objc,obj-c++ --prefix=/usr --with-gcc-major-version-only --program-suffix=-7 --enable-shared --enable-linker-build-id --libexecdir=/usr/lib --without-included-gettext --enable-threads=posix --libdir=/usr/lib --enable-nls --with-sysroot=/ --enable-clocale=gnu --enable-libstdcxx-debug --enable-libstdcxx-time=yes --with-default-libstdcxx-abi=new --enable-gnu-unique-object --disable-libquadmath --disable-libquadmath-support --enable-plugin --enable-default-pie --with-system-zlib --enable-secureplt --with-cpu=power8 --enable-targets=powerpcle-linux --disable-multilib --enable-multiarch --disable-werror --with-long-double-128 --enable-checking=release --build=x86_64-linux-gnu --host=x86_64-linux-gnu --target=powerpc64le-linux-gnu --program-prefix=powerpc64le-linux-gnu- --includedir=/usr/powerpc64le-linux-gnu/include
Thread model: posix
gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)

在x86上可以看到在 powerpc64le-linux-gnu-gcc-7这个文件是x86上的交叉编译器

junli@zhangjunli00:~$ which powerpc64le-linux-gnu-gcc
/usr/bin/powerpc64le-linux-gnu-gcc
junli@zhangjunli00:~$ file /usr/bin/powerpc64le-linux-gnu-gcc
/usr/bin/powerpc64le-linux-gnu-gcc: symbolic link to powerpc64le-linux-gnu-gcc-7
junli@zhangjunli00:~$ file /usr/bin/powerpc64le-linux-gnu-gcc-7
/usr/bin/powerpc64le-linux-gnu-gcc-7: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=67af861df9b3f7eaa876d4eaeaa91a9f90d99a7a, stripped

在x86环境中,写两个简单的c程序,其中a.c调用 foo.c


junli@zhangjunli00:~$ cat foo.c
#include <stdio.h>
void foo(){printf("hell0\n");
}
junli@zhangjunli00:~$ cat a.c
int main(){foo();return 0;
}

编译器编译c

junli@zhangjunli00:~$ /usr/bin/powerpc64le-linux-gnu-gcc-7 -shared -fPIC foo.c -o libfoo.so
junli@zhangjunli00:~$ file libfoo.so
libfoo.so: ELF 64-bit LSB shared object, 64-bit PowerPC or cisco 7500, version 1 (SYSV), dynamically linked, BuildID[sha1]=37ef3cf76d496a7b5b18c68ab8dd8059fef0b99a, not stripped

########### 编译生成一个可执行文件a############
查看生成的可执行文件,是可以在PowerPC上运行的。

junli@zhangjunli00:~$ /usr/bin/powerpc64le-linux-gnu-gcc-7 a.o -L. -lfoo -o a
junli@zhangjunli00:~$ file a
a: ELF 64-bit LSB shared object, 64-bit PowerPC or cisco 7500, version 1 (SYSV), dynamically linked, interpreter /lib64/ld64.so.2, for GNU/Linux 3.10.0, BuildID[sha1]=e013a19ac2c3468ce9a41424172a60c127c056c3, not stripped

将可执行文件a可libfoo.so 拿到Power服务器上的系统运行,成功。

[root@localhost ~]# ls
a  anaconda-ks.cfg  initial-setup-ks.cfg  libfoo.so
[root@localhost ~]# ldd alinux-vdso64.so.1 (0x00007fffb70e0000)libfoo.so => not foundlibc.so.6 => /lib64/power9/libc.so.6 (0x00007fffb6e80000)/lib64/ld64.so.2 (0x00007fffb7100000)
[root@localhost ~]# ldd libfoo.solinux-vdso64.so.1 (0x00007fffbd830000)libc.so.6 => /lib64/power9/libc.so.6 (0x00007fffbd5d0000)/lib64/ld64.so.2 (0x00007fffbd850000)
[root@localhost ~]# LD_LIBRARY_PATH=.:$LD_LIBRARY_PATH ./a
hell0
[root@localhost ~]# uname -a
Linux localhost.localdomain 4.18.0-193.el8.ppc64le #1 SMP Fri May 8 11:19:36 UTC 2020 ppc64le ppc64le ppc64le GNU/Linux

交叉编译总结

注意在交叉编译过程中,如果x86的环境是ubuntu,那么在power服务上运行的环境也要求是Ubuntu,原因是同一系列的操作系统的GCC glic版本才能保持一致。这里建议用AT(advance toolchain)工具做交叉编译。AT工具中包含cross的安装包,runtime安装包,一方面AT工具针对Power做了优化,另一方面独立于GCC,这样就解决了ubuntu环境编译,在rhel上运行的问题。

在windows上跑Power Linux虚拟机

下载安装Windows版本的qemu软件,https://qemu.weilnetz.de/w64/

使用软件在Windows上创建Tap设备。 这部分内容因为审核原因并为标出,请自行搜索。将tap设备设备重新命名为tap0

启动PowerLinux系统

  1. 设置qemu路径
  2. 设置虚拟机名称和唯一ID
  3. 设置虚拟机处理器信息,模拟Power8处理器, 2个核
  4. 设置虚拟机内存, 4G内存
  5. 配置虚拟机模拟器属性,为纯软件模拟方式,采用pseries模式,关闭虚拟机Specture补丁
  6. 采用VGA模式,启用USB键盘,美式键盘
  7. 配置虚拟机磁盘信息,磁盘格式为raw模式
  8. 启用直接从内核启动,略掉grub扫描过程
  9. 配置虚拟机网络信息,采用桥接模式,固定PCI信息
  10. 挂载ISO介质用来在虚拟机里安装软件
  11. 取消虚拟机默认配置,仅在虚拟机中生成qemu命令行指定的设备

虚拟机运行效果



虚拟机启动之后, windows上tap0设备变为连线状态,此时观察虚拟机的网络可以看到也是连线状态。
此时可以分别在windows上将tap0设置IP地址,虚拟机里面设置eth0地址,两者同一网段,即可相互通信。

创建网桥以便虚拟机直接上网

如果想让虚拟机直接通过windows宿主机上的无线网卡来上网的话,就需要在windows上创建网桥设备。关闭虚拟机后,在windows网络连接中选择tap0和无线网卡,右键选择桥接,创建网桥。

虚拟机通过桥接上网

重新启动虚拟机,并在虚拟机中自动获取IP。可以看到,通过桥接,虚拟机就可以直接上网了,同时windows上也可以通过虚拟机的IP来ssh访问。

异构虚拟机总结

在windows运行Power Linux虚拟机后,连上网,配好yum源,就可以在虚拟机中进行软件编译工作等。这样就可以在个人PC机上,完成Power服务器上的简单实验。尽管速度会比实际Power硬件慢,但功能验证完全没有问题。

交叉编译VS异构虚拟化,在x86服务器上运行PowerPC软件相关推荐

  1. 组态软件运行在云服务器_哪些软件可以在云服务器上运行?

    哪些软件可以在云服务器上运行?可以在云服务器上运行的软件很多,使用云服务器具有完全的独立性和灵活性,用户可以根据自身需求,配置所需要的服务器环境.安装各类应用软件. 比如,Windows系统的云服务器 ...

  2. 无头虚拟化服务器,VBoxHeadless - 使用VirtualBox 4.0在无头Ubuntu 10.10服务器上运行虚拟机...

    VBoxHeadless - 使用VirtualBox 4.0在无头Ubuntu 10.10服务器上运行虚拟机 本指南介绍如何在无头Ubuntu 10.10服务器上运行VirtualBox 4.0的虚 ...

  3. 在x86服务器上 搭建基于docker的arm64程序编译和运行环境

    docker 镜像: multiarch/qemu-user-static:register arm64v8/ubuntu:18.04 必要的组件: qemu https://github.com/m ...

  4. 软件文档 服务器上,服务器上需要什么软件

    服务器上需要什么软件 内容精选 换一换 华为云帮助中心,为用户提供产品简介.价格说明.购买指南.用户指南.API参考.最佳实践.常见问题.视频帮助等技术文档,帮助您快速上手使用华为云服务. MindS ...

  5. 不需xp_cmdshell支持在有注入漏洞的SQL服务器上运行CMD命令

    我的BLOG里有一篇文章介绍了关于SQL注入的基本原理和一些方法.最让人感兴趣的也许就是前面介绍的利用扩展存储过程xp_cmdshell来运行操作系统的控制台命令.这种方法也非常的简单,只需使用下面的 ...

  6. 使用wget在linux服务器上下载oracle软件

    今天需要在远程几台服务器上安装oracle软件,本地的网络不是很好,如果同本地下载,然后再上传到服务器上比较耗时.所以就想直接在服务器上直接下载软件,这样不光速度比较快,而且还节省了很多时间. 我是这 ...

  7. python怎么输入代码-教你如何将自己的脚本代码放到服务器上运行

    原标题:教你如何将自己的脚本代码放到服务器上运行 本文授权转自 | 日常学Python 上次弄了个机器人,反响挺不错的,我也挺满意的,因为这个我也初步了解了服务器这个东西,懂得了如何将自己的脚本代码放 ...

  8. 服务器如何运行java文件_在linux服务器上运行java文件

    1.  在windows环境下编写java类,如java类是Test类. 2.  将该Test类上传到linux服务器上,命令如下: mapred@10:/bwdata168_2/hyg$rz  -b ...

  9. 教你如何将自己的脚本代码放到服务器上运行

    上次弄了个机器人,反响挺不错的,我也挺满意的,因为这个我也初步了解了服务器这个东西,懂得了如何将自己的脚本代码放到服务器上运行了,妈妈再也不怕我每天都得开着电脑才能运行脚本了,不过说实话,这个服务器真 ...

最新文章

  1. 《UNIXLinux程序设计教程》一3.7 非阻塞I/O
  2. as3.0用了视频组件,导致视频打开后就全屏,加一下代码就行
  3. Lambda expressions are not supported at language level ‘5‘
  4. 《目标检测》R-CNN、SPP-NET、Fast R-CNN、Faster R-CNN
  5. java运算符使用总结_Java运算符知识点总结
  6. Docker网络详解
  7. iOS开发中的火星坐标系及各种坐标系转换算法
  8. 算法图解笔记(附PDF下载地址)
  9. java随机数生成方法
  10. 英语b计算机考试时间2015年,2014年12月大学英语B 计算机应用基础考试工作安排...
  11. 《邪不压正》里面究竟谁是真正的隐侠,蓝青峰究竟是正是邪?
  12. 如何解除计算机上的安全警报,怎么关闭windows的安全警报
  13. WiFi、GNSS定位服务实战-OneOS位置服务组件(文末有礼品)
  14. 人生,原来是个笑话?
  15. Arqit公司将于2023年用卫星发送量子密钥;QC Ware发布量子线性代数API | 全球量子科技与工业快讯第二十六期
  16. Canvas绘制五子棋棋盘
  17. 计算机搜索功能关闭,提高电脑性能关闭Windows Search搜索功能设置技巧
  18. Multimodal Gesture Recognition Using 3-D Convolution and Convolutional LSTM
  19. 用.Net Core接入微信公众号开发
  20. atom插件默认安装目录修改

热门文章

  1. Java 自定义排序
  2. 《守塔兵团》H5游戏养成玩法攻略
  3. hadoop生态圈面试精华之Hadoop基础
  4. CSS3五颜六色的花纹图案动画js特效
  5. SPP(spatial pyramid pooling) 空间金字塔池化
  6. C#获取实体类字段信息PropertyInfo,字段名称,字段值,字段属性标签
  7. 串口通讯之createfile函数解读
  8. 1749. 阻挡广告牌 II(分类讨论+区间合并)
  9. 标志寄存器 CF PF AF ZF SF OF TF IF
  10. MindSpore论文解读 | EPRNet:应用于实时街景分割的高效金字塔表征网络