gwsystems / composite

A component-based OS
composite.seas.gwu.edu
185 stars 70 forks source link

New user-level library design for embedded MCUs #369

Open hungry-foolish opened 6 years ago

hungry-foolish commented 6 years ago

We need a new user-level library design for embedded MCUs. We probably need a custom header as well, for the following reasons:

A suggested header for the MCU applications(especially RTOS VM images): The structure to pass hypercall parameters to/from the VMM if we use shared memory to pass parameters. We can use synchronous invocation to pass parameters as well.

struct vmm_param
{
    unsigned long number;
    unsigned long param[4];
};

The page table layout is statically decided, the first one being the top-level. This is architecture-specific.

struct pgtbl_hdr
{
    /* Its parent's position in the page table array */
    unsigned long parent;
    /* The start address of the mapping <also contains where to cons it into> */
    unsigned long addr;
    /* The size order and number order, combined into one word */
    unsigned long order;
    /* The initially mapped pages' data. The only thing stored here is the Composite standard flags */
    unsigned char flags[8];
};

The VM image header structure

struct vm_image
{
    /* The magic number;always equal to VIRT(0x56495254) */
    const unsigned long magic;
    /* Name of the VM */
    char name[16];

    /* The entry, stack and stack size of the virtual machines */
    void* user_entry;
    /* The stack of this VM */
    void* user_stack;
    /* The size of the user stack */
    unsigned long user_size;
    /* The entry of the interrupt processing thread */
    void* int_entry;
    /* The stack of the interrupt processing thread */
    void* int_stack;
    unsigned long int_size;

    /* SHARED:The parameter space <if we use shared memory to pass parameters> */
    struct vm_param* param;

    /* The priority and timeslices of the VM - used in prioity RR scheduling */
    unsigned long prio;
    unsigned long slices;

    /* SHARED:The console space and size - if you wish to print something */
    unsigned long console_size;
    void* console_buf;

    /* SHARED:The interrupt flag space  - To mark an interrupt so that the VM can process it */
    unsigned long int_num;
    unsigned long* int_flags;

    /* The number of page tables in this image, and where are they stored */
    unsigned long pgtbl_num;
    const struct pgtbl_hdr* pgtbl;

    /* The number of kernel capabilities in this image, and their list, which depicts what hardware this VM have access to */
    unsigned long hwcap_num;
    const unsigned long* hwcap;

    /* Is there any other images? If there is, here is a pointer to the start
     * of the next one. This is a constant pointer to a constant pointer to a 
     * constant structure. The VMM will load the next image from here, if it wants to. */
    const struct vm_image* const * const next_image;
};

@gparmer