首页 > 编程语言 >.Net8的AOT引导程序BootStrap

.Net8的AOT引导程序BootStrap

时间:2023-07-13 10:13:26浏览次数:80  
标签:__ 初始化 void BootStrap modules AOT Net8 Main

前言

.Net8的本地预编机器码AOT,它几乎进行了100%的自举。微软为了摆脱C++的钳制,做了很多努力。也就是代码几乎是用C#重写,包括了虚拟机,GC,内存模型等等。而需要C++做的,也就仅仅是引导程序,本篇通过代码来看下这段至关重要的引导程序的运作模式。原文:.Net8的AOT引导程序BootStrap


概括

所谓的引导程序,也就是引导被ILC生成的目标文件编译成可执行文件,然后在相应的平台上(MacoS/Linux/Win)进行二进制执行。这里以微软自家的Windows平台为例来剖析下这段引导程序。

引导程序分为两个阶段,其一初始化运行时,其二运行托管的Main入口代码。分别看下,最后就是代码展示了。

1.实例化运行时
这个很好理解,你如果需要运行.Net程序那么必须有一个运行的环境,第一步就是初始化这个运行环境。它主要包括以下步骤:
一:环境变量的初始化
环境变量的初始化主要是指设置的环境变量,对于GC或者JIT的控制。在这里进行一个初始化和区分。比如开启了了内存映射的环境变量
DOTNET_EnableWriteXorExecute=1.它就是此时被AOT识别并进行区分。
二:注册AOT的模块
AOT程序需要用到哪些模块,比如

Runtime.WorkstationGC.lib
System.Globalization.Native.Aot.lib
System.IO.Compression.Native.Aot.lib
eventpipe-disabled.lib
Runtime.VxsortDisabled.lib

等一些模块需要用到,那么这里进行注册下,以便后续调用。
三:模块的初始化
这里的模块初始化实际上,R2R的部分预编译函数替代。

2.托管的Main入口
.Net里面托管的Main函数是一切托管函数的入口点,所以托管Main入口是必须设置正确,并且能够运行完整托管代码。本例展示的托管Main如下:

static void Main()
{
   Program pm=new Program();
   pm = null;
   GC.Collect();
   Console.WriteLine("This is Ce Shi");
   Console.ReadLine();
}

3.代码展示
上面只是一些概念,具体的行为落实,还得代码来。这里看下BootStrap引导程序的代码。

一:节操作:
1.节存变量
主要是在初始化运行时的模块初始化阶段需要用到

#pragma section(".modules$A", read)
#pragma section(".modules$Z", read)
extern "C" __declspec(allocate(".modules$A")) void* __modules_a[];
extern "C" __declspec(allocate(".modules$Z")) void* __modules_z[];
__declspec(allocate(".modules$A")) void* __modules_a[] = { nullptr };
__declspec(allocate(".modules$Z")) void* __modules_z[] = { nullptr };

2.节合并
这里主要是然链接器进行一个节的合并

#pragma comment(linker, "/merge:.modules=.rdata")
#pragma comment(linker, "/merge:.unbox=.text")

3.节声明函数
实例化运行时注册AOT模块的时候要用到

char _bookend_a;
char _bookend_z;

#pragma code_seg(".managedcode$A")
void* __managedcode_a() { return &_bookend_a; }
#pragma code_seg(".managedcode$Z")
void* __managedcode_z() { return &_bookend_z; }
#pragma code_seg()

4.AOT运行环境的初始化

static int InitializeRuntime()
{
    //环境变量的初始化
    if (!RhInitialize())
        return -1;
    //获取当前模块的句柄
    void* osModule = PalGetModuleHandleFromPointer((void*)&__managed__Main);

    //注册AOT模块
    if (!RhRegisterOSModule(
        osModule,
        (void*)&__managedcode_a, (uint32_t)((char*)&__managedcode_z - (char*)&__managedcode_a),
        (void*)&__unbox_a, (uint32_t)((char*)&__unbox_z - (char*)&__unbox_a),
        (void**)&c_classlibFunctions, _countof(c_classlibFunctions)))
    {
        return -1;
    }
    //初始化需要的模块
    InitializeModules(osModule, __modules_a, (int)((__modules_z - __modules_a)), (void**)&c_classlibFunctions, _countof(c_classlibFunctions));

#ifdef NATIVEAOT_DLL
    // Run startup method immediately for a native library
    __managed__Startup();
#endif // NATIVEAOT_DLL

    return 0;
}

5.托管入口

return __managed__Main(argc, argv);

以上是.Net8的AOT引导程序的完整运作模式。


结尾

作者:江湖评谈
关注下面公众号:jianghupt。后台回复暗号:AOT。获取全部以上AOT引导程序Bootstrap全部源码。
image

标签:__,初始化,void,BootStrap,modules,AOT,Net8,Main
From: https://www.cnblogs.com/tangyanzhi1111/p/17541637.html

相关文章

  • BootstrapBlazor组件库,在你的Blazor应用程序中添加一个看板娘
    BootstrapBlazor组件库,在你的Blazor应用程序中添加一个看板娘效果如图这里主要用到了BootstrapBlazor组件库的Live2D插件,本插件基于pixi-live2d-display,并且支持所有版本的Live2D模型。使用时只需要在nuget安装BootstrapBlazor.Live2DDisplay组件包,在MainLaout.razor中,添......
  • DevTools 无法加载源映射: 无法加载httplocalhost8081staticscssbootstrap.min.css.map
    DevTools无法加载源映射:无法加载http://localhost:8081/statics/css/bootstrap.min.css.map的内容:HTTP错误:状态代码404,net::ERR_HTTP_RESPONSE_CODE_FAILURE 解决办法:找到bootstrap.min.css,删除最后一行注释 注意:如果是css报错就删除:/*#sourceMappingURL=bootst......
  • Bootstrap的模态框无法弹出解决方案
     Bootstrap的模态框无法弹出的问题 今天在使用Bootstrap官网所提供的模态框插件时候发现其中的可选尺寸模态框无法弹出在模态框前使用过其他Bootstrap的js插件,可以正常使用,说明所需依赖js文件已经正常引用注意:jquery.min.js与bootstrap.min.js文件引入......
  • Bootstrap导航栏下拉菜单不生效的问题
    Bootstrap导航栏下拉菜单不生效的问题一般来来说是导入静态文件顺序的问题,解放方案:按以下顺序导入静态文件{%loadstatic%}<scriptsrc="{%static'jQuery/jQuery.js'%}"></script><scriptsrc="{%static'bootstrap/js/bootstrap.min.js'%}&quo......
  • Vue项目引入Bootstrap5步骤
    1、在工程项目下安装Bootstrap5依赖包[email protected]或者[email protected]、安装安装jqueryBootstrap有js函数,必须新引入jquerynpminstalljquery--save3、在vue.config.js配置jQuery插件的参数module.exports=......
  • kubelet 报 Failed to run kubelet" err="failed to run Kubelet: unable to load
    1、kubelet  启动报  unabletoloadbootstrapkubeconfig:stat/etc/kubernetes/bootstrap-kubelet.conf:nosuchfileordirectory",原因是kubelet.conf的证书权限有问题2、处理方法拷贝admin.conf到kubelet.conf,再重新启动kubelet服务 cp-a/etc/kubernete......
  • Bootstrap中的栅格系统是什么?它的作用和使用方法是什么?
    Bootstrap的栅格系统是一种响应式布局系统,用于在网页上创建灵活的、自适应的网格结构。栅格系统将页面水平分割成12个等宽的列,可以根据不同的屏幕尺寸和设备类型,将内容组织成不同的布局。栅格系统的作用是帮助开发人员快速实现响应式布局,使网页在不同的屏幕尺寸下都能呈现良好的......
  • bootstrap本地
    bootstrap4,把cdn换成本地的文件<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metahttp-equiv="X-UA-Compatible"content="IE=edge"><metaname="viewport&qu......
  • HTML——Bootstrapt库导入
    1.bootstrapt下载zip包https://v5.bootcss.com/2.安装nodejshttps://nodejs.cn/download/3. ......
  • Bootstrap介绍
    Bootstrap是一个流行的前端CSS框架,可以帮助开发人员快速构建响应式、移动设备优先的网站和应用程序。以下是Bootstrap的使用详细攻略:引入Bootstrap: 1、Bootstrap可以通过CDN或本地文件引入。如果通过CDN引入,只需在HTML文件中添加以下代码即可:<!--CSS文件--><l......