龙芯团队 在移值 MIPS64 下的.NET Core 进度速报

写在开始前

我们的主要业务基于 dotnet core 2.x 与 3.1 完成,目前 dotnet core 3.1 支持的 CPU 架构列表中还不包含龙芯,且在 gitlab issue 中表示官方当前没有对 MIPS 的支持计划。

更具体操作系统与 CPU 架构列表见 [Download .NET Core 3.1](https://dotnet.microsoft.com/download/dotnet-core/3.1

6月下旬,龙芯团队宣布在 dotnet/coreclr 基础上完成了MIPS64 的移植工作 Open-sourcing CoreCLR MIPS64 Port #38069,计划实现 3.x 版本并贡献到上游 dotnet/runtime。

按照相关 issue 里的指引,这里对编译了移值工作,进行了一些测试。

具体的进度

作为下游开发者,想知道距离生产环境使用还有多远,必须先提及 dotnet core 应用程序的发布/部署方式

1. dotnet core 支持两种方式的发布/部署

  • 独立应用(self-contained)

  • 依赖于运行时(runtime-dependent)

前者包含可执行文件(exe),无法跨平台;后者生成了跨平台的二进制文件(dll),需要运行环境预先安装好运行时。关于部署策略的详细信息,可以参考.NET Core application publishing overview。

发布独立应用需要针对特定操作系统及 CPU 架构编译并包含相应运行时,实际开发中我们以依赖于运行时的方式交付,配合预先准备的包含运行时(runtime)的 docker 镜像完成部署。

微软官方 aspnet core 示例中的 Dockerfile

# ...
FROM mcr.microsoft.com/dotnet/core/runtime:3.1
WORKDIR /app
COPY --from=build /app .
ENTRYPOINT ["dotnet","dotnetapp.dll"]

2. dotnet core 的组成部分

作为编译型语言,和 Java 源代码被 javac 编译为字节码再交由 JVM 运行一样,csharp/vb.net 等源代码被编译为内容主要是 IL(中间语言,平台无关)的 Windows PE 文件(可用于所有操作系统),然后交由 CLR 运行。

dotnet core 由以下若干部分组成:

  • 运行时与框架库,包含 .NET Core Runtime 与 ASP.NET Core Runtime,平台特定

  • SDK 和编译器:开发相关

  • dotnet 命令:启动 dotnet 应用及作为交互式工具链

mono,unity3d 都是运行时实现,在此略提及

由前文的 Dockerfile 可以看到,依赖于运行时的 dotnet core 应用通过 dotnet xxxx.dll 运行,这里有若干层意义:

  1. dotnet 提供了 Host(宿主/主机)能力,因为依赖于运行时(runtime-dependent)的 dotnet core 应用并不是可执行文件,需要类似 JVM 的机制运行起来

  2. dotnet 以交互式命令将 runtime 与 sdk 集合在一起,成为完整的工具链

而 dotnet/coreclr 编译结果并不包含可执行的 dotnet 命令,运行/测试已发布的 dotnet core 应用有以下选择

  • 编写本机/原生代码,参考 Write a custom .NET Core host to control the .NET runtime from your native code。

  • 使用编译得到的 corerun,参考 Using CoreRun To Run .NET Core Application。

当前的交付/部署体验都是通过 dotnet 命令进行的,获取该命令需要更多的工作,接下来是龙芯团队的移值工作的说明。

龙芯团队的工作

龙芯团队的工作在 19 年 7 月份开始,当时的 dotnet core源码结构、功能与现在的变更如下表。

原仓库移值仓库功能释出变更
dotnet/coreclrgsvm/coreclr运行时源码
合并入 dotnet/runtime
dotnet/corefxgsvm/corefx标准库源码2020/7/7合并入 dotnet/runtime
dotnet/core-setupgsvm/core-setup编译仓库2020/7/7合并入 dotnet/runtime
dotnet/cli
命令行工具链源码
合并入 dotnet/sdk

dotnet/core-setup 比较特殊,它是用来用来编译 runtime,类库和宿主程序的仓库,注意直到这一步 dotnet 命令才终于可用。

本地编译 gsvm/coreclr

龙芯团队首份释出的源码是 dotnet/coreclr。按照社区的沟通记录,由于依赖复杂,建议基于 docker 进行编译

git clone https://github.com/gsvm/coreclr.git
cd coreclr
docker run --rm -v $(pwd):/coreclr -w /coreclr aoqi/dotnet-buildtools:loongson3a-loongnix-1.0-llvm8ld ./build.sh -skiptests -ignorewarnings release

注意使用docker manifest inspect可知,镜像 aoqi/dotnet-buildtools:loongson3a-loongnix-1.0-llvm8ld 仅适用于龙芯操作系统,更多内容请参考 龙芯3A4000 开发机编译CoreCLR 环境 #6

作者使用的服务器使用 uname -p 输出的是 mips64 而不是 mips,前者会导致 gsvm/coreclr 中相关脚本对 CPU 架构的断言失败,被相关人士认为违反了分发版本的命名规则,所以后续使用了交叉编译。

交叉编译 gsvm/coreclr

如果手边已经有 x64 服务器,基于 docker 进行交叉编译也是不错的选择,我们可以将编译结果 scp/rsync 到龙芯服务器。

docker run --rm -v $(pwd):/coreclr -w /coreclr -e ROOTFS_DIR=/crossrootfs/mips64el aoqi/dotnet-buildtools:x86_64-ubuntu-16.04-c103199-20180628134544-upstream-cross-mips64el ./build.sh release ignorewarnings mips64 cross skipcrossgen

编译耗时不多,但链接步骤需要使用大量的内存,作者最初使用了一台腾迅云低配主机都在进度 87% 时失败,更换使用一台更高配置服务器后编译成功,相关讨论可见于 cross compile failed ...

交叉编译 gsvm/corefx

7月7日龙芯团队释出了 dotnet/corefx 和 dotnet/core-setup 仓库,编译方法如下,参考 cross-building.md。

git clone https://github.com/gsvm/corefx.git
cd corefx
docker run --rm -v $(pwd):/corefx -w /corefx -e ROOTFS_DIR=/crossrootfs/mips64el aoqi/dotnet-buildtools:x86_64-ubuntu-16.04-c103199-20180628134544-upstream-cross-mips64el-corefx ./src/Native/build-native.sh mips64 debug cross ignorewarnings cmakeargs -DOBJCOPY=/usr/lib/llvm-6.0/bin/llvm-objcopy

本地编译

docker run --rm -v $(pwd):/corefx -w /corefx -e ROOTFS_DIR=/crossrootfs/mips64el_loongnix aoqi/dotnet-buildtools:x86_64-ubuntu-16.04-c103199-20180628134544-upstream-cross-mips64el-corefx ./src/Native/build-native.sh mips64 debug cross ignorewarnings cmakeargs -DOBJCOPY=/usr/lib/llvm-6.0/bin/llvm-objcopy

leoninew 原创,转载请注明来自博客园

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/308884.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Adapter(适配器)--类对象结构型模式

Adapter(适配器)–类对象结构型模式 一、意图 将一个类的接口转换成客户希望的另外一个接口。Adapter模式使得原本接口不兼容而不能一起工作的那些类可以一起工作。 二、动机 1.在软件系统中,由于应用环境的变化,常常需要将“一…

如何使用ABP框架(2)三层架构与领域驱动设计的对比

本文来自长沙.NET技术社区,原创:邹溪源。全文共有8500字,读完需耗时10分钟。题图来自pixabay简述上一篇简述了ABP框架中的一些基础理论,包括ABP前后端项目的分层结构,以及后端项目中涉及到的知识点,例如DTO…

Bridge(桥接)--对象结构模式

Bridge(桥接)–对象结构模式 一、意图 将抽象部分与它的实现部分分离,使它们都可以独立的变化。 二、动机 1.由于某些类型的固有的实现逻辑,使得它们具有两个变化的维度,乃至多个纬度的变化。 2.如何应对这种“多维度…

Composite(组合)--对象结构型模式

Composite(组合)–对象结构型模式 一、意图 将对象组合成树形结构以表示“部分-整体”的层次结构。Composite使得用户对单个对象和组合对象的使用具有一致性。 二、动机 1.软件在某些情况下,客户代码过多的依赖于对象容器复杂的内部实现结构…

[SpringBoot2]ajax函数中data参数的数据设置方式

ajax函数中data参数的数据设置方式:

Blazor带我重玩前端(二)

概览Blazor目前有两种托管模式,一种是Server-Side模式,一种是WebAssembly模式。官方首先支持的是Service-Side模式,使用WebAssembly模式,需要更新到最新版VS2019。小编目前的精力是更多的专注于Blazor-WebAssembly模式的研究&…

Decorator(装饰)--对象结构型模式

Decorator(装饰)–对象结构型模式 一、意图 1.动态地给一个对象添加一些额外的职责。就增加功能来说,Decorator模式相比生成子类更为灵活。 二、动机 1.在某些情况下我们可能会“过度地使用继承来扩展对象的功能”, 由于继承为类…

Facade(外观)--对象结构型模式

Facade(外观)–对象结构型模式 一、意图 为子系统中的一组接口提供一个一致的界面,Facade模式定义了一个高层接口,这个接口使得这一子系统更加容易使用。 二、动机 1.上述左边方案的问题在于组件的客户和组件中各种复杂的子系…

.NET Core微服务开发网篇-ocelot

通过上篇我们知道,网关是外部访问的统一入口,本文采用Ocelot作为Api网关。环境要求:vs2019.NetCore3.1Ocelot16.0.1创建一个产品服务Api站点(AAStore.ProductCatalog.Api)添加一个ProductController[Route("api/[…

Flyweight(享元)--对象结构型模式

Flyweight(享元)–对象结构型模式 一、意图 运行共享技术有效地支持大量细粒度的对象。 二、动机 1.在软件系统采用纯粹对象方案的问题在于大量细粒度的对象会很快充斥在系统中,从而带来很高的运行时代价——主要指内存需求方面的代价。 2.…

IBM 声明对 Google 违背承诺未将 Istio 贡献给 CNCF 表示失望

Jason R McGee,IBM 院士,IBM 云平台副总裁兼 CTO。昨天晚上Google 宣布将 Istio 商标转让给 Open Usage Commons 组织,IBM 当即在 IBM Developer 网站上发表声明对 Google 的做法表示失望。以下为 IBM 云平台副总裁兼 CTO Jason R McGee 的声…

[mybatis]Configuration XML_properties

properties mybatis可以使用properties来引入外部properties配置文件的内容 resource:引入类路径下的资源 url:引入网络路径或者磁盘路径下的资源 process 项目结构: mybatis-config.xml: <?xml version"1.0" encoding"UTF-8" ?> <!DOCTY…

Proxy(代理)--对象结构型模式

Proxy&#xff08;代理&#xff09;–对象结构型模式 一、意图 为其他对象提供一种代理以控制对这个对象的访问。 二、动机 1.在面向对象系统中&#xff0c;有些对象由于某种原因&#xff08;比如对象创建的开销很大&#xff0c;或者某些操作需要安全控制&#xff0c;或者需要…

浅谈.Net Core DependencyInjection源码探究

前言对于IOC和DI&#xff0c;可能每个人都能说出自己的理解。IOC全称是Inversion of Control翻译成中文叫控制反转&#xff0c;简单的说就是把对象的控制权反转到IOC容器中&#xff0c;由IOC管理其生命周期。DI全称是DependencyInjection翻译成中文叫依赖注入&#xff0c;就是I…

[mybatis]Configuration XML_settings

settings settings包含很多重要的设置项 setting:用来设置每一个设置项name:设置项名value:设置项取值 mapUnderscoreToCamelCase 开启驼峰命名法 <settings><setting name"mapUnderscoreToCamelCase" value"true"/></settings>Emplo…

Chain of responsibility(职责链)--对象行为型模式

Chain of responsibility&#xff08;职责链&#xff09;–对象行为型模式 一、意图 使多个对象有机会处理请求&#xff0c;从而避免请求的发送者和接受者之间的耦合关系。将这些对象连成一条链&#xff0c;并沿着这条链传递该请求&#xff0c;直到有一个对象处理它为止。 二…

[mybatis]Configuration XML_typeAliases and Alias

There are many built-in type aliases for common Java types. They are all case insensitive, note the special handling of primitives due to the overloaded names. typeAliases typeAlias:为某个java类型起别名 type:指定要起别名的类型全类名;默认别名就是类名小写;em…

Command(命令)--对象行为型模式

Command&#xff08;命令&#xff09;–对象行为型模式 一、意图 将一个请求封装为一个对象&#xff0c;从而使你可用不同的请求对客户进行参数化&#xff1b;对请求排队或记录请求日志&#xff0c;以及支持可撤销的操作。 二、动机 1.在软件构建过程中&#xff0c;“行为请求…

实现业务数据的同步迁移 · 思路一

&#xff08;好雨知时节&#xff0c;大雨 _ _ _&#xff09;时不时的呢&#xff0c;会有小伙伴问我这样的问题&#xff1a;1、群主&#xff0c;你的.tsv文件是如何生成的&#xff1f;2、在线项目数据和种子数据的不一样&#xff0c;可以下么&#xff1f;3、如果我本地的数据开发…