本文仍处于修订中

写在开始前

我们的主要业务基于 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 由以下若干部分组成:

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 应用有以下选择

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

龙芯团队的工作

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

原仓库 移值仓库 功能 释出 变更
dotnet/coreclr gsvm/coreclr 运行时源码 合并入 dotnet/runtime
dotnet/corefx gsvm/corefx 标准库源码 2020/7/7 合并入 dotnet/runtime
dotnet/core-setup gsvm/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

编译耗时不多,但链接步骤需要使用大量的内存,作者最初使用了一台腾迅云低配主机,重复编译若干次都是如此,更换使用了一台更高配置服务器后编译成功,相关讨论可见于 cross compile failed ...

交叉编译 gsvm/corefx

7月7日龙芯团队释出了 dotnet/corefx 和 dotnet/corefx 仓库,编译方法如下,参考 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

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

dotnet core 在 MIPS 下的移值进度的更多相关文章

  1. dotnet core调试docker下生成的dump文件

    最近公司预生产环境.net core应用的docker容器经常出现内存暴涨现象,有时会突然吃掉几个G,触发监控预警,造成容器重启. 分析了各种可能原因,修复了可能发生的内存泄露,经测试本地正常,但是发 ...

  2. 【dotNet Core】Swagger下简单的给WebApi分组

    Startup.cs下ConfigureServices代码 这里主要在DocInclusionPredicate控制输出那些api. Startup.cs下Configure代码 给Controll ...

  3. spring cloud+dotnet core搭建微服务架构:服务发现(二)

    前言 上篇文章实际上只讲了服务治理中的服务注册,服务与服务之间如何调用呢?传统的方式,服务A调用服务B,那么服务A访问的是服务B的负载均衡地址,通过负载均衡来指向到服务B的真实地址,上篇文章已经说了这 ...

  4. ubuntu15.10 或者 16.04 或者 ElementryOS 下使用 Dotnet Core

    这里我们不讲安装,缺少libicu52自行安装. 安装完成后使用dotnet restore或者build都会失败,一是报编译的dll不适合当前系统,二是编译到ubuntu16.04文件夹下会产生一些 ...

  5. 边缘化搭建 DotNet Core 2.1 自动化构建和部署环境(下)

    写在前面 本篇文章是上一篇边缘化搭建 DotNet Core 2.1 自动化发布和部署(上)的后续操作,本文主要讲解如何开启Docker Remote API,开启Remote API后的权限安全问题 ...

  6. 支付宝AopSdk在dotnet core下的实现

    随着项目都迁移到了dotnet core下,阿里的支付宝也需要随着项目迁移.之前在.Net Framework下用到了阿里提供的AopSdk和F2FPay两个程序集,支付宝官方提供的只支持Framew ...

  7. dotnet core 用值初始化整个数组

    如果想要创建一个数组,在这个数组初始化一个值,有多少不同的方法? 本文告诉大家三个不同的方法初始化 在开发中,会不会用很多的时间在写下面的代码 var prime = new bool[1000]; ...

  8. 【Step By Step】将Dotnet Core部署到Docker下

    一.使用.Net Core构建WebAPI并访问Docker中的Mysql数据库 这个的过程大概与我之前的文章<尝试.Net Core—使用.Net Core + Entity FrameWor ...

  9. 解决 dotnet core 1.x 命令行(cli) 下运行路径错误

    环境: Windows 10,Visual Studio 2017 centos 7,nginx,supervisor,dotnet core 1.1 问题: 在 Linux 配置 superviso ...

随机推荐

  1. 嵌入式Linux内核开发工程师必须掌握的三十道题

    如果你能正确回答以下问题并理解相关知识点原理,那么你就可以算得上是基本合格的Linux内核开发工程师. 1. Linux中主要有哪几种内核锁?(进程同步与互斥) (1)自旋锁:非睡眠锁 (2)信号量: ...

  2. 【Spring注解驱动开发】使用@Scope注解设置组件的作用域

    写在前面 Spring容器中的组件默认是单例的,在Spring启动时就会实例化并初始化这些对象,将其放到Spring容器中,之后,每次获取对象时,直接从Spring容器中获取,而不再创建对象.如果每次 ...

  3. mysql安装过程以及遇到问题的解决方法

    因为工作原因,配备了新电脑,需要装mysql,今天给大家分享一下安装的过程以及遇到的问题(在此仅介绍压缩包解压方式的安装) 1.准备mysql的压缩包(我使用的是5.7经典版本) 2.配置环境变量,这 ...

  4. mail邮件操作

    目录 1. 概念 1.1. 常见的类型 1.2. 相关协议 1.3. SMTP协议 2. python::smtplib 1. 概念 1.1. 常见的类型 Mail User Agent 收发邮件用的 ...

  5. MySQL——事务(Transaction)详解

    原文:https://blog.csdn.net/w_linux/article/details/79666086

  6. Android开发Fragment的使用学习

    基本概念 Fragment是Android3.0(API11)提出的概念,support-v4库中也开发了一套Fragment API,最低兼容Android 1.6.所以在开发中要注意不要导错包 导 ...

  7. ca73a_c++_流的条件状态

    /*ca73a_c++_流的条件状态strm::iostate strm::badbit //流的状态strm::failbit //输入的状态,应该输入数字,结果输入为字符,strm::eofbit ...

  8. 常见CSS选择器的权重和优先级

    一.常见CSS选择器 [元素选择器] 1.通配选择器:*(匹配所有元素) a.效率不高,页面上的标签越多,效率越低,所以页面上最好不要出现这个选择器 2.标签选择器:li(匹配标签为li的元素) a. ...

  9. Oracle SQL调优系列之SQL Monitor Report

    @ 目录 1.SQL Monitor简介 2.捕捉sql的前提 3.SQL Monitor 参数设置 4.SQL Monitor Report 4.1.SQL_ID获取 4.2.Text文本格式 4. ...

  10. Scrapy学习1:安装

    Install Scrapy 熟悉PyPI的话,直接一句 pip install Scrapy 但是有时候需要处理安装依赖,不能直接一句命令就安装结束,这个和系统有关. 我用的Ubuntu,这里仅介绍 ...