Common Intermediate Language и системное программирование в Microsoft.Net. Макаров А.В - 41 стр.

UptoLike

Если некоторый бит установлен, это означает, что соответству-
ющая куча адресуется 32-разрядными индексами. В противном
случае куча адресуется 16-разрядными индексами.
char Valid[8];
Размер этого поля – 64 бита. При этом каждый бит соответствует
одной таблице метаданных. Если некоторый бит установлен, зна-
чит, соответствующая ему таблица присутствует в метаданных.
unsigned long Rows[7];
Массив 32-разрядных целых чисел, содержащих количество за-
писей в каждой из присутствующих таблиц метаданных. В на-
шем учебном примере этот массив имеет размер 7, так как мы
используем семь таблиц.
На рис. 2.10 представлено распределение элементов метаданных, ис-
пользуемых в учебном примере, по таблицам метаданных. При этом каж-
дая таблица имеет порядковый номер, который соответствует номеру опи-
сывающего ее бита в массиве Valid.
Давайте подробнее рассмотрим каждую из семи используемых в при-
мере таблиц метаданных.
2.2.3.1. Таблица сборок (Assembly – 0x20)
В этой таблице содержится только одна запись, описывающая нашу
сборку. В этой записи для нас интерес представляют следующие поля:
Структура программных компонентов
69
char Name[x];
ASCIIZ-строка, содержащая имя потока метаданных. Это поле
имеет переменную длину.
В спецификации CLI определено пять видов потоков метаданных.
Четыре потока метаданных представляют собой так называемые кучи, то
есть хранилища однородных объектов, таких как строки и GUID'ы, и один
поток метаданных имеет реляционную структуру и содержит таблицы ме-
таданных. В таблице 2.2 приведено описание каждого из пяти потоков.
Таблица 2.2. Потоки метаданных
2.2.3. Таблицы метаданных
В спецификации CLI определены несколько десятков видов таблиц
метаданных. Мы ограничимся рассмотрением только тех из них, которые
используются в нашем учебном примере.
На рис. 2.9 представлена структура потока таблиц метаданных для
учебного примера. Поток таблиц начинается с заголовка таблиц, непо-
средственно после которого следуют сами таблицы.
Заголовок таблиц метаданных содержит большое количество полей,
из которых нас интересуют в первую очередь три поля:
char HeapSizes;
Различные биты этого поля задают размеры индексов, исполь-
зуемых для адресации куч метаданных. Бит 0 соответствует куче
строк, бит 1 – куче GUID'ов, бит 3 – куче двоичных данных.
68
CIL и системное программирование в Microsoft .NET
Поток Имя потока Описание
Куча GUID'ов “#GUID” Представляет собой
последовательность 128-битных
глобальных уникальных
идентификаторов
Куча пользовательских ”#US” Содержит строковые константы,
строк определенные в программе
Куча строк “#Strings” Содержит названия элементов
метаданных (типов, методов,
полей и т.п.)
Куча двоичных данных “#Blob” Содержит двоичные данные,
описывающие метаданные
(например, сигнатуры методов)
Таблицы метаданных ”#~” Содержит физическое
представление таблиц метаданных
AssemblyRef Table – 0x23
Assembly Table – 0x20
ModuleRef Table – 0x0A
Method Table – 0x06
TypeDef Table – 0x02
TypeRef Table 0x01
Module Table – 0x00
Заголовок таблиц
struct MetadataTables
{
...
long HeapSizes;
...
char Valid[8];
...
unsigned long
Rows[7];
}
01000111 0000100 00000000 00000000 00000011 00000000 00000000 00000000
Рис. 2.9. Структура потока таблиц метаданных
0816 2432404856
68                            CIL и системное программирование в Microsoft .NET   Структура программных компонентов                                                      69


     char Name[x];
          ASCIIZ-строка, содержащая имя потока метаданных. Это поле                                 AssemblyRef Table – 0x23
          имеет переменную длину.
     В спецификации CLI определено пять видов потоков метаданных.                                       Assembly Table – 0x20
Четыре потока метаданных представляют собой так называемые кучи, то                                     ModuleRef Table – 0x0A
есть хранилища однородных объектов, таких как строки и GUID'ы, и один
поток метаданных имеет реляционную структуру и содержит таблицы ме-                                      Method Table – 0x06
                                                                                                                                                 struct MetadataTables
таданных. В таблице 2.2 приведено описание каждого из пяти потоков.                                                                              {
                                                                                                         TypeDef Table – 0x02
                                                                                                                                                   ...
     Таблица 2.2. Потоки метаданных                                                                       TypeRef Table 0x01                       long HeapSizes;
                                                                                                                                                   ...
Поток                  Имя потока       Описание                                                         Module Table – 0x00                       char Valid[8];
                                                                                                                                                   ...
Куча GUID'ов           “#GUID”          Представляет собой                                                                                         unsigned long
                                        последовательность 128-битных                                     Заголовок таблиц                           Rows[7];
                                        глобальных уникальных                                                                                    }
                                        идентификаторов
Куча пользовательских ”#US”             Содержит строковые константы,             01000111    0000100     00000000   00000000   00000011   00000000   00000000   00000000

строк                                   определенные в программе                          0         8          16          24        32          40        48            56
Куча строк            “#Strings”        Содержит названия элементов                    Рис. 2.9. Структура потока таблиц метаданных
                                        метаданных (типов, методов,                         Если некоторый бит установлен, это означает, что соответству-
                                        полей и т.п.)                                       ющая куча адресуется 32-разрядными индексами. В противном
Куча двоичных данных “#Blob”            Содержит двоичные данные,                           случае куча адресуется 16-разрядными индексами.
                                        описывающие метаданные                         char Valid[8];
                                        (например, сигнатуры методов)                       Размер этого поля – 64 бита. При этом каждый бит соответствует
Таблицы метаданных     ”#~”             Содержит физическое                                 одной таблице метаданных. Если некоторый бит установлен, зна-
                                        представление таблиц метаданных                     чит, соответствующая ему таблица присутствует в метаданных.
                                                                                       unsigned long Rows[7];
                                                                                            Массив 32-разрядных целых чисел, содержащих количество за-
2.2.3. Таблицы метаданных                                                                   писей в каждой из присутствующих таблиц метаданных. В на-
     В спецификации CLI определены несколько десятков видов таблиц                          шем учебном примере этот массив имеет размер 7, так как мы
метаданных. Мы ограничимся рассмотрением только тех из них, которые                         используем семь таблиц.
используются в нашем учебном примере.                                                  На рис. 2.10 представлено распределение элементов метаданных, ис-
     На рис. 2.9 представлена структура потока таблиц метаданных для              пользуемых в учебном примере, по таблицам метаданных. При этом каж-
учебного примера. Поток таблиц начинается с заголовка таблиц, непо-               дая таблица имеет порядковый номер, который соответствует номеру опи-
средственно после которого следуют сами таблицы.                                  сывающего ее бита в массиве Valid.
     Заголовок таблиц метаданных содержит большое количество полей,                    Давайте подробнее рассмотрим каждую из семи используемых в при-
из которых нас интересуют в первую очередь три поля:                              мере таблиц метаданных.
     char HeapSizes;
          Различные биты этого поля задают размеры индексов, исполь-              2.2.3.1. Таблица сборок (Assembly – 0x20)
          зуемых для адресации куч метаданных. Бит 0 соответствует куче                В этой таблице содержится только одна запись, описывающая нашу
          строк, бит 1 – куче GUID'ов, бит 3 – куче двоичных данных.              сборку. В этой записи для нас интерес представляют следующие поля: