domain create分析

来源:互联网 发布:魔兽2.43数据库 编辑:程序博客网 时间:2024/05/23 20:57

struct domain *domain_create(domid_t dom_id, unsigned int cpu)

分配一个struct domain空间,并初始化此空间

之后执行construct_dom0

int construct_dom0(struct domain *d,

                    unsigned long guest_start, unsigned long guest_size,

                    unsigned long image_start, unsigned long image_size,

                    unsigned long initrd_start, unsigned long initrd_size,

                    char *cmdline)

模拟器启动参数都保存在domain_addrs[]中,其中domain0的相关属性为:

        {               
                MEMMAP_GUEST_0_START_PADDR,                 // guest memory start  0x00200000
                0x05e00000,//MEMMAP_GUEST_0_SIZE,         // guest memory size   0x05e00000
                MEMMAP_GUEST_0_ELF_IMAGE_PADDR,          // elf image address     0x01c00000
//              _binary_mini_start,
                MEMMAP_GUEST_0_ELF_MAX_SIZE,                // elf image size            0x00400000
                MEMMAP_GUEST_0_RAMDISK_IMAGE_PADDR,//0,     // ramdisk image address    0x00800000
                0x00046daf,//MEMMAP_GUEST_0_RAMDISK_SIZE,//0,          // ramdisk image size   0x00046daf
                0,                                   // commandline
                0 
        }
要想指定Xen ARM的启动位置,需要修改此数据结构。当然,首先要将domain镜像加载如内存。

附domain和domain_addrs的定义

 

struct domain

{

    domid_t          domain_id;

 

    shared_info_t   *shared_info;     /* shared data area */

 

    spinlock_t       big_lock;

 

    spinlock_t       page_alloc_lock; /* protects all the following fields  */

    struct list_head page_list;       /* linked list, of size tot_pages     */

    struct list_head xenpage_list;    /* linked list, of size xenheap_pages */

    unsigned int     tot_pages;       /* number of pages currently possesed */

    unsigned int     max_pages;       /* maximum value for tot_pages        */

    unsigned int     xenheap_pages;   /* # pages allocated from Xen heap    */

 

    /* Scheduling. */

    int              shutdown_code; /* code value from OS (if DOMF_shutdown) */

    void            *sched_priv;    /* scheduler-specific data */

 

    struct domain   *next_in_list;

    struct domain   *next_in_hashbucket;

 

    struct list_head rangesets;

    spinlock_t       rangesets_lock;

 

    /* Event channel information. */

    struct evtchn   *evtchn[NR_EVTCHN_BUCKETS];

    spinlock_t       evtchn_lock;

 

    grant_table_t   *grant_table;

 

    /*

     * Interrupt to event-channel mappings. Updates should be protected by the 

     * domain's event-channel spinlock. Read accesses can also synchronise on 

     * the lock, but races don't usually matter.

     */

#define NR_PIRQS 256 /* Put this somewhere sane! */

    u16              pirq_to_evtchn[NR_PIRQS];

    u32              pirq_mask[NR_PIRQS/32];

 

    /* I/O capabilities (access to IRQs and memory-mapped I/O). */

    struct rangeset *iomem_caps;

    struct rangeset *irq_caps;

         struct rangeset *dma_caps;

    
    unsigned long    domain_flags;
    unsigned long    vm_assist;
    atomic_t         refcnt;
    struct vcpu *vcpu[MAX_VIRT_CPUS];
    /* Bitmask of CPUs which are holding onto this domain's state. */
    cpumask_t        domain_dirty_cpumask;
    struct arch_domain arch;
    void *ssid; /* sHype security subject identifier */
    /* Control-plane tools handle for this domain. */
    xen_domain_handle_t handle;
        uint32_t store_port; //for xenstore kcr
        unsigned long store_mfn; //for xenstore kcr
        uint32_t console_port; //for console ldh
        unsigned long console_mfn; //for console ldh
        /* For ACM */
        unsigned long scid;
        uint8_t acm_batterylife;
        uint16_t acm_battery_save_mode;
        uint16_t acm_shutdown;
        u32 *status;
        void *scan_code;
};
struct domain_addr_set domain_addrs[4]= {
        {               
                MEMMAP_GUEST_0_START_PADDR,             // guest memory start
                0x05e00000,//MEMMAP_GUEST_0_SIZE,                    // guest memory size
                MEMMAP_GUEST_0_ELF_IMAGE_PADDR,         // elf image address
//              _binary_mini_start,
                MEMMAP_GUEST_0_ELF_MAX_SIZE,              // elf image size
                MEMMAP_GUEST_0_RAMDISK_IMAGE_PADDR,//0,     // ramdisk image address
                0x00046daf,//MEMMAP_GUEST_0_RAMDISK_SIZE,//0,          // ramdisk image size
                0,                                   // commandline
                0 
        },      
        {               
                MEMMAP_GUEST_1_START_PADDR,             // guest memory start
                MEMMAP_GUEST_1_SIZE,                    // guest memory size
                MEMMAP_GUEST_1_ELF_IMAGE_PADDR,         // elf image address
                //_binary_mini_start,
                MEMMAP_GUEST_1_ELF_MAX_SIZE,              // elf image size
                0,     // ramdisk image address
                0,          // ramdisk image size
                0,                                   // commandline
                0 
        },
        {
                MEMMAP_GUEST_2_START_PADDR,             // guest memory start
                MEMMAP_GUEST_2_SIZE,                    // guest memory size
                MEMMAP_GUEST_2_ELF_IMAGE_PADDR,         // elf image address
                MEMMAP_GUEST_2_ELF_MAX_SIZE,              // elf image size
                0,     // ramdisk image address
                0,          // ramdisk image size
                0,                                   // commandline
                0
        },
        {
                MEMMAP_GUEST_3_START_PADDR,             // guest memory start
                MEMMAP_GUEST_3_SIZE,                    // guest memory size
                MEMMAP_GUEST_3_ELF_IMAGE_PADDR,         // elf image address
                MEMMAP_GUEST_3_ELF_MAX_SIZE,              // elf image size
                0,     // ramdisk image address
                0,          // ramdisk image size
                0,                                   // commandline
                0
        },
};

 

原创粉丝点击