在我阅读 Singularity 史前活动的代码时,这个 BootInfo 结构多次出现在代码中,并且来回传递与 C 与 Asm 之间。所以单独提出来方便查阅。

\base.obj\Boot\Prototype.x86\halclass.h[530] & halclass.inc[715]

   1: struct Struct_Microsoft_Singularity_BootInfo
   2: {
   3:  
   4:     uint32                      RecSize;                                      //  0
   5:     Struct_Microsoft_Singularity_X86_IDTP BiosIdtPtr;                         //  4
   6:     uint16                      BiosPicMask;                                  // 12
   7:     uint8                       BiosWarmResetCmos;                            // 14
   8:     int8                        __padding000[1];                              // 15
   9:     uint32                      BiosWarmResetVector;                          // 16
  10:     uint32                      Info16;                                       // 20
  11:     uint16                      DebugBasePort;                                // 24
  12:     int8                        __padding001[2];                              // 26
  13:     uint64                      IdtEnter0;                                    // 28
  14:     uint64                      IdtEnter1;                                    // 36
  15:     uint64                      IdtEnterN;                                    // 44
  16:     uint64                      IdtTarget;                                    // 52
  17:     uint64                      Info32;                                       // 60
  18:     uint64                      Kill32;                                       // 68
  19:     uint32                      KillAction;                                   // 76
  20:     uint64                      MpEnter32;                                    // 80
  21:     uint32                      MpCpuCount;                                   // 88
  22:     uint32                      MpStatus32;                                   // 92
  23:     uint64                      MpStartupLock32;                              // 96
  24:     uint64                      MpBootInfo32;                                 // 104
  25:     Struct_Microsoft_Singularity_CpuInfo Cpu0;                                // 112
  26:     uint64                      Pdpt32;                                       // 228
  27:     uint64                      Undump;                                       // 236
  28:     uint64                      DumpAddr32;                                   // 244
  29:     uint32                      DumpSize32;                                   // 252
  30:     uint64                      DumpRemainder;                                // 256
  31:     uint64                      DumpBase;                                     // 264
  32:     uint64                      DumpLimit;                                    // 272
  33:     uint64                      Heap32;                                       // 280
  34:     uint32                      PciBiosAX;                                    // 288
  35:     uint32                      PciBiosBX;                                    // 292
  36:     uint32                      PciBiosCX;                                    // 296
  37:     uint32                      PciBiosEDX;                                   // 300
  38:     uint64                      AcpiRoot32;                                   // 304
  39:     uint64                      PnpNodesAddr32;                               // 312
  40:     uint32                      PnpNodesSize32;                               // 320
  41:     uint64                      SmbiosRoot32;                                 // 324
  42:     uint64                      DmiRoot32;                                    // 332
  43:     uint32                      IsaCsns;                                      // 340
  44:     uint16                      IsaReadPort;                                  // 344
  45:     int8                        __padding002[2];                              // 346
  46:     uint32                      Ebda32;                                       // 348
  47:     uint32                      MpFloat32;                                    // 352
  48:     uint32                      SmapCount;                                    // 356
  49:     uint64                      SmapData32;                                   // 360
  50:     uint64                      Ohci1394Base;                                 // 368
  51:     uint64                      Ohci1394BufferAddr32;                         // 376
  52:     uint32                      Ohci1394BufferSize32;                         // 384
  53:     uint64                      FileImageTableBase32;                         // 388
  54:     uint32                      FileImageTableEntries;                        // 396
  55:     uint64                      CmdLine32;                                    // 400
  56:     uint32                      BootCount;                                    // 408
  57:     // bartok layout dataSize = 412
  58:  
  59:     static Struct_Microsoft_Singularity_BootInfo * g_HalGetBootInfo();
  60: };

这两个文件是 Bartok 自动生成的。.h 文件用于 C 语言代码,而 .inc 文件用于汇编语言代码。

Bartok 是一个类似于 JIT 的东东,负责把 IL 代码编译为本机可执行代码。

真正的 BootInfo 在 \base\Kernel\Singularity\BootInfo.cs 文件中定义。

   1: //
   2: // Copyright (c) Microsoft Corporation.  All rights reserved.
   3: //
   4:  
   5: using System;
   6: using System.Runtime.InteropServices;
   7: using System.Runtime.CompilerServices;
   8:  
   9: namespace Microsoft.Singularity
  10: {
  11:     [StructLayout(LayoutKind.Sequential, Pack=4)]
  12:     [CLSCompliant(false)]
  13:     public struct BootInfo
  14:     {
  15:         //
  16:         // These constants control the gross layout of physical memory.
  17:         //
  18:         // Physical Addresses
  19:         // 00000000..000fffff    Reserved for boot loaders
  20:         // 00007000..00017fff    16-bit segment
  21:         // 00007b00..0000efff    16-bit real-mode code
  22:         // 0000f000..00017fff    16-bit stack
  23:         // 00018000..0005ffff    boot heap
  24:         // 00060000..000affff    32-bit boot loader code (undump)
  25:         //
  26:         // 00100000..001fffff    Reserved for ? (1MB..)
  27:         //
  28:         // 00200000..002fffff    Kernel stack   (1MB..2MB)
  29:         // 00310000..004fffff    Kernel code & static Data (2MB..4MB...)
  30:         //
  31:         // 00500000..??          Mp ABI stub (haryadi)
  32:         //
  33:         // 04000000..07ffffff    Runtime heaps preferred memory (64MB..128MB)
  34:         //
  35:         // top-size..top ram     minidump load.
  36:         //
  37:         // fe000000..ffffffff    Uncached mapped memory
  38:  
  39:         // Memory Layout Constants
  40:         [AccessedByRuntime("referenced in c++")]
  41:         // 4KB is currently the only supported size
  42:         internal const uint PAGE_SIZE           = 0x00001000; // 4KB
  43:  
  44:         // Make sure zero through this address is always unmapped
  45:         [AccessedByRuntime("referenced in c++")]
  46:         internal const uint PHYSICAL_DISABLED   = 0x00004000;
  47:  
  48:         [AccessedByRuntime("referenced in c++")]
  49:         internal const uint REAL_CODE_BASE      = 0x00007b00;
  50:         [AccessedByRuntime("referenced in c++")]
  51:         internal const uint REAL_STACK          = 0x00017FF0;
  52:         [AccessedByRuntime("referenced in c++")]
  53:         internal const uint REAL_PBOOTINFO      = 0x00017FF8;
  54:         [AccessedByRuntime("referenced in c++")]
  55:         internal const uint REAL_HEAP           = 0x00018000;
  56:  
  57:         [AccessedByRuntime("referenced in c++")]
  58:         internal const uint DUMP_CODE_BASE      = 0x00060000;
  59:  
  60:         // Addresses for hypervisor overlay pages
  61:         [AccessedByRuntime("referenced in c++")]
  62:         internal const uint HYPERCALL_PAGE      = 0x00100000;
  63:         [AccessedByRuntime("referenced in c++")]
  64:         internal const uint HYPERVISOR_SIM_PAGE = 0x00101000;
  65:         [AccessedByRuntime("referenced in c++")]
  66:         internal const uint HYPERVISOR_SIEF_PAGE= 0x00102000;
  67:  
  68:         [AccessedByRuntime("referenced in c++")]
  69:         internal const uint KERNEL_LOGREC_BEGIN = 0x00200000;
  70:         [AccessedByRuntime("referenced in c++")]
  71:         internal const uint KERNEL_LOGREC_LIMIT = 0x00220000;
  72:         [AccessedByRuntime("referenced in c++")]
  73:         internal const uint KERNEL_LOGTXT_BEGIN = 0x00220000;
  74:         [AccessedByRuntime("referenced in c++")]
  75:         internal const uint KERNEL_LOGTXT_LIMIT = 0x00240000;
  76:  
  77:         [AccessedByRuntime("referenced in c++")]
  78:         internal const uint KERNEL_STACK_BEGIN  = 0x00240000;
  79:         [AccessedByRuntime("referenced in c++")]
  80:         internal const uint KERNEL_STACK        = 0x002ff000;
  81:         [AccessedByRuntime("referenced in c++")]
  82:         internal const uint KERNEL_STACK_LIMIT  = 0x00300000;
  83:  
  84:         [AccessedByRuntime("referenced in c++")]
  85:         internal const uint KERNEL_BASE         = 0x00310000;
  86:  
  87:         // haryadi -- this is the ABI Stub (MpSyscalls.x86)
  88:         [AccessedByRuntime("referenced in c++")]
  89:         internal const uint MP_ABI_BASE         = 0x00600000;
  90:  
  91:         // The physical address and extent of the high-memory
  92:         // range to map into the Kernel space, and mark
  93:         // "uncached". This window is for communicating with
  94:         // hardware.
  95:         [AccessedByRuntime("referenced in c++")]
  96:         internal const uint UNCACHED_PHYSICAL   = 0xFE000000;
  97:         [AccessedByRuntime("referenced in c++")]
  98:         internal const uint UNCACHED_MAPPED     = 0x02000000;
  99:  
 100:         // This is the amount of *contiguous, physical* memory
 101:         // to reserve at boot for use as I/O memory
 102:         internal const uint IO_MEMORY_SIZE      = 0x00800000; // 8MB
 103:  
 104:         //
 105:         // These constants control the gross layout of *virtual*
 106:         // memory
 107:         //
 108:  
 109:         // This is the maximum size of a communication-heap
 110:         // (used to reserve enough space in virtual address
 111:         // spaces to map in communication heaps as necessary)
 112:         // For ease of mapping, this should be a multiple of 2MB
 113:         internal const uint COMM_HEAP_MAX_SIZE  = 0x02000000; // 32MB
 114:  
 115:         // This determines where the kernel/user boundary is.
 116:         // Currently, it needs to be multiple of 1GB.
 117:         internal const uint KERNEL_BOUNDARY     = 0x40000000; // 1GB
 118:  
 119:         // This determines the maximum virtual address
 120:         // we will use. Setting this to less than the
 121:         // machine's maximum pointer size can reduce the
 122:         // overhead of paging structures.
 123:         //
 124:         // NOTE we are not currently safe to use the top
 125:         // bit of addresses (because of the "mark" bit in the
 126:         // multi-use word header), so restrict ourselves to the
 127:         // bottom 2GB.
 128:         [AccessedByRuntime("referenced in c++")]
 129:         internal const uint MAX_VIRTUAL_ADDR    = 0x80000000; // 2GB
 130:  
 131:         // Exit Codes:
 132:         [AccessedByRuntime("referenced in c++")]
 133:         internal const int EXIT_AND_RESTART     = 0x1fff;
 134:         [AccessedByRuntime("referenced in c++")]
 135:         internal const int EXIT_AND_SHUTDOWN    = 0x1ffe;
 136:         [AccessedByRuntime("referenced in c++")]
 137:         internal const int EXIT_AND_WARMBOOT    = 0x1ffd;
 138:         [AccessedByRuntime("referenced in c++")]
 139:         internal const int EXIT_AND_HALT        = 0x1ffc;
 140:  
 141:         // Sanity Check
 142:         [AccessedByRuntime("referenced in c++")]
 143:         internal uint       RecSize;
 144:  
 145:         // IDT and PIC
 146:         [AccessedByRuntime("referenced in c++")]
 147:         internal X86.IDTP   BiosIdtPtr;
 148:         [AccessedByRuntime("referenced in c++")]
 149:         internal ushort     BiosPicMask;
 150:         [AccessedByRuntime("referenced in c++")]
 151:         internal byte       BiosWarmResetCmos;
 152:         [AccessedByRuntime("referenced in c++")]
 153:         internal uint       BiosWarmResetVector;
 154:         [AccessedByRuntime("referenced in c++")]
 155:         internal uint       Info16;
 156:  
 157:         // Debug Stub Information
 158:         [AccessedByRuntime("referenced in c++")]
 159:         internal ushort     DebugBasePort;
 160:  
 161:         // Temporary IDT
 162:         [AccessedByRuntime("referenced in c++")]
 163:         internal ulong    IdtEnter0;
 164:         [AccessedByRuntime("referenced in c++")]
 165:         internal ulong    IdtEnter1;
 166:         [AccessedByRuntime("referenced in c++")]
 167:         internal ulong    IdtEnterN;
 168:         [AccessedByRuntime("referenced in c++")]
 169:         internal ulong    IdtTarget;
 170:  
 171:         // Self-descriptive information
 172:         [AccessedByRuntime("referenced in c++")]
 173:         internal ulong    Info32;
 174:         [AccessedByRuntime("referenced in c++")]
 175:         internal ulong    Kill32;
 176:         [AccessedByRuntime("referenced in c++")]
 177:         internal uint       KillAction;
 178:  
 179:         // MP specific variables
 180:         [AccessedByRuntime("referenced in c++")]
 181:         public   ulong    MpEnter32;          // Entry point
 182:         [AccessedByRuntime("referenced in c++")]
 183:         public   uint       MpCpuCount;         // No of AP's booted
 184:         [AccessedByRuntime("referenced in c++")]
 185:         public   uint       MpStatus32;         // Error indicator
 186:         [AccessedByRuntime("referenced in c++")]
 187:         public   ulong    MpStartupLock32;    // Pointer to MP init lock var
 188:         [AccessedByRuntime("referenced in c++")]
 189:         public   ulong    MpBootInfo32;       // Pointer to MpBootInfo
 190:  
 191:         // Per CPU state - in initialization order (CPU0 = BSP, CPUX = AP)
 192:         [AccessedByRuntime("referenced in c++")]
 193:         public   CpuInfo    Cpu0;
 194: #if SINGULARITY_MP
 195:         [AccessedByRuntime("referenced in c++")]
 196:         public   CpuInfo    Cpu1;
 197:         [AccessedByRuntime("referenced in c++")]
 198:         public   CpuInfo    Cpu2;
 199:         [AccessedByRuntime("referenced in c++")]
 200:         public   CpuInfo    Cpu3;
 201: #  if !MAX_CPU2 && !MAX_CPU3 && !MAX_CPU4
 202: #    error "MAX_CPUx value is either not defined or not supported."
 203: #  endif // MAX_CPUx
 204: #endif // SINGULARITY_MP
 205:  
 206:         [AccessedByRuntime("referenced in c++")]
 207:         internal ulong Pdpt32;
 208:  
 209:         [AccessedByRuntime("referenced in c++")]
 210:         internal ulong    Undump;
 211:  
 212:         // Location (in high memory) of the executable
 213:         // images
 214:         [AccessedByRuntime("referenced in c++")]
 215:         internal ulong    DumpAddr32;
 216:  
 217:         // Extent of that data
 218:         [AccessedByRuntime("referenced in c++")]
 219:         internal uint       DumpSize32;
 220:  
 221:         [AccessedByRuntime("referenced in c++")]
 222:         internal ulong    DumpRemainder;
 223:  
 224:         // Start of the undumped kernel image
 225:         [AccessedByRuntime("referenced in c++")]
 226:         internal ulong    DumpBase;
 227:  
 228:         // Marks the highest address used by the
 229:         // kernel image (undumped from high memory)
 230:         [AccessedByRuntime("referenced in c++")]
 231:         internal ulong    DumpLimit;
 232:  
 233:         //
 234:         [AccessedByRuntime("referenced in c++")]
 235:         internal ulong    Heap32;
 236:  
 237:         // PCI Information (V2.0+)
 238:         [AccessedByRuntime("referenced in c++")]
 239:         internal uint       PciBiosAX;
 240:         [AccessedByRuntime("referenced in c++")]
 241:         internal uint       PciBiosBX;
 242:         [AccessedByRuntime("referenced in c++")]
 243:         internal uint       PciBiosCX;
 244:         [AccessedByRuntime("referenced in c++")]
 245:         internal uint       PciBiosEDX;
 246:  
 247:         // BIOS Information
 248:         [AccessedByRuntime("referenced in c++")]
 249:         public   ulong    AcpiRoot32;
 250:         [AccessedByRuntime("referenced in c++")]
 251:         internal ulong    PnpNodesAddr32;
 252:         [AccessedByRuntime("referenced in c++")]
 253:         internal uint       PnpNodesSize32;
 254:         [AccessedByRuntime("referenced in c++")]
 255:         internal ulong    SmbiosRoot32;
 256:         [AccessedByRuntime("referenced in c++")]
 257:         internal ulong    DmiRoot32;
 258:         [AccessedByRuntime("referenced in c++")]
 259:         internal uint       IsaCsns;
 260:         [AccessedByRuntime("referenced in c++")]
 261:         internal ushort     IsaReadPort;
 262:         [AccessedByRuntime("referenced in c++")]
 263:         internal uint       Ebda32;
 264:         [AccessedByRuntime("referenced in c++")]
 265:         public   uint       MpFloat32;
 266:  
 267:         // SMAP Information
 268:         [AccessedByRuntime("referenced in c++")]
 269:         internal uint       SmapCount;
 270:         [AccessedByRuntime("referenced in c++")]
 271:         internal ulong    SmapData32;
 272:  
 273:         // 1394 Information
 274:         [AccessedByRuntime("referenced in c++")]
 275:         internal ulong    Ohci1394Base;
 276:         [AccessedByRuntime("referenced in c++")]
 277:         internal ulong    Ohci1394BufferAddr32;
 278:         [AccessedByRuntime("referenced in c++")]
 279:         internal uint       Ohci1394BufferSize32;
 280:  
 281:         // File image table
 282:         [AccessedByRuntime("referenced in c++")]
 283:         internal ulong    FileImageTableBase32;
 284:         [AccessedByRuntime("referenced in c++")]
 285:         internal uint       FileImageTableEntries;
 286:  
 287:         // BOOT Information
 288:         [AccessedByRuntime("referenced in c++")]
 289:         internal ulong    CmdLine32;
 290:         [AccessedByRuntime("referenced in c++")]
 291:         internal uint       BootCount;
 292:  
 293:         [MethodImpl(MethodImplOptions.InternalCall)]
 294:         [StackBound(8)]
 295:         [NoHeapAllocation]
 296:         internal static unsafe extern BootInfo * HalGetBootInfo();
 297:  
 298:         [NoHeapAllocation]
 299:         public static unsafe BootInfo GetBootInfo()
 300:         {
 301:             BootInfo *ptr;
 302:  
 303:             ptr = HalGetBootInfo();
 304:             return *ptr;
 305:         }
 306:  
 307:         [NoHeapAllocation]
 308:         public unsafe CpuInfo GetCpuInfo(int processorId)
 309:         {
 310:             fixed (CpuInfo* ci = &Cpu0)
 311:             {
 312:                 return *(ci + processorId);
 313:             }
 314:         }
 315:     }
 316: }

转载于:https://www.cnblogs.com/eclairs/archive/2008/10/15/1313121.html

Singularity 代码阅读笔记[结构: Struct_Microsoft_Singularity_BootInfo]相关推荐

  1. [置顶] Linux协议栈代码阅读笔记(一)

    Linux协议栈代码阅读笔记(一) (基于linux-2.6.21.7) (一)用户态通过诸如下面的C库函数访问协议栈服务 int socket(int domain, int type, int p ...

  2. linux 协议栈 位置,[置顶] Linux协议栈代码阅读笔记(一)

    Linux协议栈代码阅读笔记(一) (基于linux-2.6.21.7) (一)用户态通过诸如下面的C库函数访问协议栈服务 int socket(int domain, int type, int p ...

  3. BNN Pytorch代码阅读笔记

    BNN Pytorch代码阅读笔记 这篇博客来写一下我对BNN(二值化神经网络)pytorch代码的理解,我是第一次阅读项目代码,所以想仔细的自己写一遍,把细节理解透彻,希望也能帮到大家! 论文链接: ...

  4. leveldb代码阅读笔记(一)

    leveldb代码阅读笔记 above all leveldb是一个单机的键值存储的内存数据库,其内部使用了 LSM tree 作为底层存储结构,支持多版本数据控制,代码设计巧妙且简洁高效,十分值得作 ...

  5. C++ Primer Plus 6th代码阅读笔记

    C++ Primer Plus 6th代码阅读笔记 第一章没什么代码 第二章代码 carrots.cpp : cout 可以拼接输出,cin.get()接受输入 convert.cpp 函数原型放在主 ...

  6. ORB-SLAM2代码阅读笔记(五):Tracking线程3——Track函数中单目相机初始化

    Table of Contents 1.特征点匹配相关理论简介 2.ORB-SLAM2中特征匹配代码分析 (1)Tracking线程中的状态机 (2)单目相机初始化函数MonocularInitial ...

  7. P2PNet(代码阅读笔记)

    P2PNet 代码阅读笔记 一.主干网络 主干网络采用的是VGG16 class BackboneBase_VGG(nn.Module):def __init__(self, backbone: nn ...

  8. VITAL Tracker Pytorch 代码阅读笔记

    VITAL Tracker Pytorch 代码阅读笔记 论文链接:https://arxiv.org/pdf/1804.04273.pdf 代码链接:https://github.com/abner ...

  9. ffmpeg 代码阅读笔记1/2

    ffmpeg 代码阅读笔记1/2 ============================================================ 0. ffmpeg 主流程 ======== ...

  10. ffmpeg中的http协议相关代码阅读笔记

    ffmpeg中的http协议相关代码阅读笔记 今天闲来无事,尝试看了下ffmpeg中的相关http协议传输处理代码 先简单说下这个代码在整个仓库里面的位置: ffmpeg/libavformat/ht ...

最新文章

  1. div在最顶层显示----弹出框效果
  2. cad pu插件下载lisp_【技巧】cad计算面积、周长方法汇总
  3. Python:python语言中与时间有关的库函数简介、安装、使用方法之详细攻略
  4. Excel表格复制到word中
  5. 肖婧医生直播讲稿整理
  6. python输入一个人的名字_怎样用c语言做到输入一个人的名字才会输出一个心?
  7. Mysql的命令行操作
  8. java scanner_Java Scanner radix()方法与示例
  9. python读写ini文件的库支持unicode_Python读写unicode文件的方法
  10. 【 Codeforces Round #301 (Div. 2) D】Bad Luck Island【概率DP】
  11. RTL8305NB傻瓜式交换机无法工作
  12. 思科asa5515端口映射_思科防火墙ASA端口映射
  13. 使用微PE工具箱制作U盘启动盘
  14. is_file(): open_basedir restriction in effect.
  15. 详解C语言中的指针类型
  16. 【转】“弱水三千 只取一瓢”(出处就不去考证了)
  17. matlab eigs 求特征值函数
  18. 使用shell比较两个文本的差异
  19. react native的WebView报错: Unable to open URL:****
  20. idea去掉不想commit的文件

热门文章

  1. 边境的悍匪—机器学习实战:第十九 大规模训练和部署TensorFlow模型
  2. 三星计算机用户的密码忘了,三星平板电脑忘记开机密码解决方法
  3. IDEA: 遇到问题Error during artifact deployment. See server log for details,解决
  4. 输入框限制规则 只能输入数字 只能输入字母数字 等等
  5. 爱你却不能长相厮守痛楚等你殊不知道终局
  6. 百度搜索框代码,实现回车点击,跳转到新页面,简单
  7. 清华数为DWF低代码平台使用感悟
  8. css段落首行缩进,文字间距
  9. 201871010133-赵永军《面向对象程序设计(java)》第二周学习总结
  10. VIJOS P1540 月亮之眼