dotnet core 在 MIPS 下的移值进度
本文仍处于修订中
写在开始前
我们的主要业务基于 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 运行,这里有若干层意义:
- dotnet 提供了 Host(宿主/主机)能力,因为依赖于运行时(runtime-dependent)的 dotnet core 应用并不是可执行文件,需要类似 JVM 的机制运行起来
- 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/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 下的移值进度的更多相关文章
- dotnet core调试docker下生成的dump文件
最近公司预生产环境.net core应用的docker容器经常出现内存暴涨现象,有时会突然吃掉几个G,触发监控预警,造成容器重启. 分析了各种可能原因,修复了可能发生的内存泄露,经测试本地正常,但是发 ...
- 【dotNet Core】Swagger下简单的给WebApi分组
Startup.cs下ConfigureServices代码 这里主要在DocInclusionPredicate控制输出那些api. Startup.cs下Configure代码 给Controll ...
- spring cloud+dotnet core搭建微服务架构:服务发现(二)
前言 上篇文章实际上只讲了服务治理中的服务注册,服务与服务之间如何调用呢?传统的方式,服务A调用服务B,那么服务A访问的是服务B的负载均衡地址,通过负载均衡来指向到服务B的真实地址,上篇文章已经说了这 ...
- ubuntu15.10 或者 16.04 或者 ElementryOS 下使用 Dotnet Core
这里我们不讲安装,缺少libicu52自行安装. 安装完成后使用dotnet restore或者build都会失败,一是报编译的dll不适合当前系统,二是编译到ubuntu16.04文件夹下会产生一些 ...
- 边缘化搭建 DotNet Core 2.1 自动化构建和部署环境(下)
写在前面 本篇文章是上一篇边缘化搭建 DotNet Core 2.1 自动化发布和部署(上)的后续操作,本文主要讲解如何开启Docker Remote API,开启Remote API后的权限安全问题 ...
- 支付宝AopSdk在dotnet core下的实现
随着项目都迁移到了dotnet core下,阿里的支付宝也需要随着项目迁移.之前在.Net Framework下用到了阿里提供的AopSdk和F2FPay两个程序集,支付宝官方提供的只支持Framew ...
- dotnet core 用值初始化整个数组
如果想要创建一个数组,在这个数组初始化一个值,有多少不同的方法? 本文告诉大家三个不同的方法初始化 在开发中,会不会用很多的时间在写下面的代码 var prime = new bool[1000]; ...
- 【Step By Step】将Dotnet Core部署到Docker下
一.使用.Net Core构建WebAPI并访问Docker中的Mysql数据库 这个的过程大概与我之前的文章<尝试.Net Core—使用.Net Core + Entity FrameWor ...
- 解决 dotnet core 1.x 命令行(cli) 下运行路径错误
环境: Windows 10,Visual Studio 2017 centos 7,nginx,supervisor,dotnet core 1.1 问题: 在 Linux 配置 superviso ...
随机推荐
- 计算从1到n中,出现某位数字的次数
出现1-9中某位数字次数的算法 /** * @param input 整数n(1 ≤ n ≤ 1,000,000,000) * @return 1-9中某个数字在数列中出现的次数 */ public ...
- 使用WPF实现的 喜马拉雅FM 资源下载工具
因为喜马拉雅pc网站上没有提供下载功能,之前有个同事问我有没有办法将资源下载到本地,当然通过浏览器F12也能找到下载地址,但挺麻烦.正好最近想学wpf,周末在家也没事,于是对着百度撸了下代码.当然只能 ...
- Python--函数&过程
函数式编程与过程式编程打的区分:过程是没有返回值的函数,过程在python3中也有返回值,为None 函数的作用:代码复用.保持代码的一致性.使代码更容易扩展 过程的定义与调用: 1 def func ...
- Python 抓取网页tag操作
1. 获取操作tag 获取操作tag的接种方式: soup.find_all(name=None, attrs={}, recursive=True, text=None, limit=None, * ...
- Java StringTokenizer 类使用方法,字符串分割
Java StringTokenizer 属于 java.util 包,用于分隔字符串. StringTokenizer 构造方法: StringTokenizer(String str) :构造一个 ...
- UI 小白设计常用的Website
网址 设计师导航网址(其实这个用好了,enough) 设计导航1 设计导航2 icon 阿里巴巴Iconfont flaticons icomoon Noun Project 图片(有时候就是灵魂) ...
- <WP8开发学习笔记>修改panorama全景控件的标题的大小
panorama(全景)控件非常具有WinPhone特色,但是那个巨大的标题许多时候会让人觉得违和.怎么修改它呢? 最开始想到的是加一个FontSize,结果毫无影响.╮(╯-╰)╭ <phon ...
- [ARC060D] 最良表現
题目 点这里看题目. 分析 由于 KMP 的失配数组有着天然的找循环节的功能,因此我们不难想到对原串进行两次 KMP ,一正一反. 可以发现如下的规律: 1. 原串无循环节,这个时候 ...
- Microsoft SQL Server Migration Assistant for MySQL(从MySQL迁移表数据到MSSQL2008R2)_3
环境: 英文版(Windows7 64 bit + MySQL8.0.18 64 bit + MSSQL2008R2 64 bit) Microso ...
- # 详细了解HTML5中的form表单
4.规范使用 <form>元素用于组织所有表单部件(也称为控件或字段),负责告诉浏览器把数据提交到哪里,方法是在action属性中提供一个URL.加入你只是想在客户端使用JavaScrip ...