• No results found

Caml Virtual Machine File & data formats Document version: 1.4

N/A
N/A
Protected

Academic year: 2021

Share "Caml Virtual Machine File & data formats Document version: 1.4"

Copied!
5
0
0

Loading.... (view fulltext now)

Full text

(1)

Caml Virtual Machine — File & data formats

Document version: 1.4

http://cadmium.x9c.fr

Copyright c 2007-2010 Xavier Clerc – [email protected]

Released under the LGPL version 3 February 6, 2010

Abstract: This document describes the binary formats used by Caml1 in its “3.11.2” version for both bytecode files and marshalled data. This document is structured in two parts: the first one exposes the format of bytecode files, and the second one exposes the format of marshalled data.

Bytecode file format

The format of bytecode files is summarized by figure1. Unused header is commonly os-executable code that looks for ocamlrun executable and launch it on the file. Trailer identifies the file as a caml bytecode file by magic (“Caml1999X008”) and indicates the number of sections in the file. One should notice that datas and descriptors of sections do not need to be in the same order. All character and string values use the ISO-8859-1 encoding. The remainder of this section lists possible sections with their contents.

”CODE” section (mandatory) contains the bytecode to be executed. Its size must be a multiple of 4, as the code is composed of 4-byte integers (in little-endian representation). These integers are either insctructions bytecodes or instructions arguments. The list of intructions with related arguments is given in another document “Caml Virtual Machine – Instruction set” that can be downloaded at http://cadmium.x9c.fr.

” DATA ” section (mandatory) contains the global data for the program, in the format defined in the second part of this document.

” PRIM ” section (mandatory) contains a terminated list of null-character-terminated strings. Each string is the name of a primitive requested for program execution. The order of these strings defines the primitive integer identifiers: the first requested primitive is given the ” 0” integer identifier, the second one is given the ”1” integer identifier,etc.

” DLLS ” section contains a null-character-terminated list of null-character-terminated strings. Each string is the name of a linked library requested for program execution.

1

The official Caml website can be reached atcaml.inria.frand contains the full development suite (compiler, tools, virual machine,etc.) as well as links to third-party contributions.

(2)

unused header data for section 1

... data for section N

descriptor for section 1 ...

descriptor for section N

trailer

table of contents

actual data

File format:

name length

four 8-bit chars one 32-bit integer (unsigned)

Section description format:

# of sections magic one 32-bit integer

(unsigned)

twelve 8-bit chars

Trailer format:

Figure 1: File format.

” DLPT ” section contains a null-character-terminated list of null-character-terminated strings. Each string is a path for linked library search.

” DBUG ” section contains an unsigned 32-bit integer indicating the number of debug elements. Elements follow, each being a couple containing an offset (as an unsigned 32-bit integer) and a marshalled value representing anInstruct.debug-event instance.

Marshalled data format

The format of marshalled values is summarized by figure 2. The following paragraphs give some precisions about particular data formats.

Integer values are stored in big-endian format. They encode values of the int type (int32, int64and nativeint types are coded as custom values).

String values are stored using ISO-8859-1 encoding.

Float values are stored using IEEE 754 encoding. According to code, values may be either big-endian (0x0B,0x0D, and 0x0F codes) or little-endian (0x0C,0x0E, and 0x07 codes).

Code offset values (0x10) consist in the offset of a code address, relative to code start. Block values are serialized as shown in figure3. For atoms, no additional data needs to be stored as the tag is given by the header. Other blocks are stored by serializing their fields in ascending order, the size (number of blocks) being given by the header. Color is used by garbage collector and is set to zero in serialized data.

(3)

code value

signed 8-bit integer signed 16-bit integer signed 32-bit integer 0x00

0x01 0x02

0x03 signed 64-bit integer supported only on 64-bit architectures

0x08

0x09 0x0A

0x0B 0x0C 0x0D 0x0E 0x07 0x0F

0x10 0x11 0x12 0x13

unsigned 8-bit length unsigned 32-bit length

sequence of 8-bit characters (ISO-8859-1 encoding) sequence of 8-bit characters (ISO-8859-1 encoding)

64-bit float (IEEE 754 encoding)

unsigned 8-bit length sequence of 64-bit floats (IEEE 754 encoding)

unsigned 32-bit length sequence of 64-bit floats (IEEE 754 encoding) 0x04

0x05 0x06

unsigned 8-bit offset unsigned 16-bit offset unsigned 32-bit offset

32-bit header (unsigned)

64-bit header (signed) supported only on 64-bit architectures

integers

shared elements

blocks

strings

floats

miscellaneous 0-terminated string (8-bit ISO-8859-1 characters) custom data block

block

unsigned 32-bit offset unsigned 32-bit offset

closure 16-byte checksum

(4)

size = 0 size > 0

nothing — atom index is given by tag

field 0 field 1 ... field size - 2 field size - 1

32-bit header:

64-bit header:

Block content:

(color) tag size

0 7

8 9 10 31

(color) tag size

0 7

8 9 10 63

Figure 3: Block values.

Custom values are stored in two parts: the first one is the custom identifier (as a null-character-terminated string, using ISO-8859-1 encoding), the second one is custom-specific data.

Shared values are references to elements already (de)serialized of the current value. The offset defines this reference, zero pointing to the last read object, one pointing to the preceding object, etc.

Small elements are used to shorten value representation. They are stored using the specific encodig depicted in figure 4. A code from0x20 to0x3F indicates a small string value, a code from 0x40 to 0x7F indicates a small int value, and a code from 0x80 to 0xFF indicates a small block value.

(5)

0x20

0x3F

...

0x40

0x7F

...

0x80

0xFF

...

code value

sequence of 8-bit characters (ISO-8859-1 encoding) length = code & 0x1F

value = code & 0x3F

size = (code >> 4) & 0x07 tag = code & 0x0F block

Figure

Figure 1: File format.
Figure 2: Data format.
Figure 3: Block values.

References

Related documents

En efecto, así como los libertarianos ven en cual- quier forma de intervención del Estado una fuente inevitable de interferencias arbitrarias –con la excepción de aquella acción

We consistently find that cross-national measures of corruption perceptions, as well as measures of direct experience with corruption are negatively correlated with growth in

showed that there was a small and not significant correlation (ñ = .18, sig = .23) between the degree of profile of advanced vocabulary and the over- all quality of the

For each RB block size we compute the area overhead and simulate the system throughput; this operation starts with the streaming buffer depth D s = 1 and, if the throughput is not

For problems where divisors and dividends begin with whole numbers: The process of predetermining the unit rod is very much the same as it is for multiplication in that it

From Jan-4-2010 to Present: Tick Data’s historical futures data contains level 1 quote data (bid/ask price with size), time stamped to the millisecond (HH:MM:SS.000), and

Abstract In this paper the well-known minimax theorems of Wald, Ville and Von Neumann are generalized under weaker topological conditions on the payoff function ƒ and/or extended

• By establishing a neighborhood clinic, with a comprehensive health program, the farm seeks to improve the overall health of the residents by providing preventative and