xen的授权表提供的是域间通信(传递消息,页面的共享)的功能.
为了使叙事的清晰,我们按照对象和方法来介绍授权表的组成,按照功能的完成过程来理解工作的方式
授权表的组成
对象:grant_table
struct grant_table { /* Table size. Number of frames shared with guest */ unsigned int nr_grant_frames; /* Shared grant table (see include/public/grant_table.h). */ union { void **shared_raw; struct grant_entry_v1 **shared_v1; union grant_entry_v2 **shared_v2; }; /* Number of grant status frames shared with guest (for version 2) */ unsigned int nr_status_frames; /* State grant table (see include/public/grant_table.h). */ grant_status_t **status; /* Active grant table. */ struct active_grant_entry **active; /* Mapping tracking table. */ struct grant_mapping **maptrack; unsigned int maptrack_head; unsigned int maptrack_limit; /* Lock protecting updates to active and shared grant tables. */ spinlock_t lock; /* The defined versions are 1 and 2. Set to 0 if we don't know what version to use yet. */ unsigned gt_version; };
domain这个结构中有一个指向这个结构的指针.nr_grant_frames是授权表中的总页数.union是共享页面信息(共享的标志,目标domid,页号等)的数组.nr_status_frames不太清楚.status应该是每个页面的状态和union对应.active记录的是页面使用相关信息(页面的引用计数,目标domain,页号等).还有一个maptrack和2个指标,另外还有一个grant_table的自旋锁. 这个地方可能有很多疑问,比如为什么会有2个共享页面的信息,maptrack是干啥的?这个会在功能的实现上来说.方法:HYPERVISOR_grant_table_op超级调用,超级调用需要3个参数,cmd,结构体指针,和操作的次数
/* ` enum grant_table_op { // GNTTABOP_* => struct gnttab_* */ #define GNTTABOP_map_grant_ref 0 #define GNTTABOP_unmap_grant_ref 1 #define GNTTABOP_setup_table 2 #define GNTTABOP_dump_table 3 #define GNTTABOP_transfer 4 #define GNTTABOP_copy