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 ...
随机推荐
- [C#.NET 拾遗补漏]03:你可能不知道的几种对象初始化方式
阅读本文大概需要 1.2 分钟. 随着 C# 的升级,C# 在语法上对对象的初始化做了不少简化,来看看有没有你不知道的. 数组的初始化 在上一篇罗列数组的小知识的时候,其中也提到了数组的初始化,这时直 ...
- Springboot 的单元测试
1 测试基础类 @RunWith(SpringRunner.class) @SpringBootTest(webEnvironment = SpringBootTest.WebEnvironment. ...
- 问题解决:psql: could not connect to server: No such file or directory Is the server running locally and accepting connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?
错误提示: psql: could not connect to server: No such file or directory Is the server running locally and ...
- 【Navicat】Navicat for MongoDBv15.0.6破解版(附破解教程)
安装包下载链接:https://download.csdn.net/download/l1028386804/12519681 Navicat for MongoDB 15是一款功能十分强大的数据库管 ...
- Charles抓包2-Charles抓包https请求
目录 1.开启SSL代理 2.安装证书 3.导出证书 4.浏览器安装证书 1.开启SSL代理 菜单,代理-->SSL代理设置 勾选启用SSL代理 在包括选项,添加主机:*,端口:443 确定保存 ...
- python中的bytes和str类型
经过一上午的查找资料.大概理清楚了bytes类型和str类型的区别. bytes类型和str类型在呈现形式有相同之处,如果你print一个bytes类型的变量,会打印一个用b开头,用单引号括起来的序列 ...
- 《MySQL技术内幕:InnoDB存储引擎》读书笔记
一.Mysql体系结构和存储引擎 1. 概念: 数据库:物理操作系统文件或其他形式文件类型的集合.(是文件的集合,是依照某种数据模型组织起来并存放于二级存储器中的数据集合.) ...
- cb38a_c++_STL_算法_transform
cb38a_c++_STL_算法_transformtransform()算法有两种形式:transform(b1,e1,b2,op);//b1(源区间)的数据通过op函数处理,存放在b2(目标区间) ...
- MFC中窗口启动后,CEdit编辑框默认光标位置设置,顺序的调节方法
MFC中窗口启动后,CEdit编辑框默认光标位设置,顺序的调节方法 在编辑界面按下ctrl+D键,就会出现所有控件的Tab键顺序,按照自己想要的顺序依次点击控件,就可以重新安排顺序.数值1就是默认停留 ...
- Spring系列.SpEL表达式
Spring表达式语言 SpEL语言是一种强大的表达式语言,支持在运行时查询和操作对象.SpEL表达式不一定要创建IOC容器后才能使用.用户完全可以单独调用SpEL的API来独立的使用时SpEL表达式 ...