Page 155 - 《软件学报》2025年第8期
P. 155

3578                                                       软件学报  2025  年第  36  卷第  8  期



                  | (cap_type, (x, y, z)) =&
                  let (b, i) := l in
                   PV (b, i)@Tint32 | → (Vint32 cap_type) **
                   PV (b, i + 4) @ Tint32 | → Vint32 x **
                   PV (b, i + 8) @ Tint32 | → Vint32 y **
                   PV (b, i + 12) @ Tptr Tvoid | → z
                  end
                    需要说明的是, CSL-R     不允许一块内存上同时存放不同类型的数据, 这与                C  语言中  union  的定义不同. 所以在
                 定义  Cap  断言的时候, 我们将    category  和  object 的第  2  分量  (第  1  分量类型相同) 分开定义. 上述定义如果适用于
                 category  权能, 那么  (x, y) 构成有效值对, z 为无效值; 如果适用于      object 权能, 那么  (x, z) 构成有效值对, y  为无
                 效值.
                    至此为止, 我们定义了系统的权能数据结构. 它由多个数组、结构体、联合体嵌套而成, 中间还包括权能有关
                 的基本数值. 前面我们提到, CSL-R       中提供了结构体和数组的一般性递归断言. 然而, 为了证明更加容易进行, 我们
                 将权能有关的各个结构体和数组定义为具体的断言, 从而在证明时可以根据断言的具体情况进行权能数据结构的
                 展开和合并, 来完成断言中权能的修改.
                    除了权能空间数据结构的断言, 我们还定义了与权能有关的其他断言, 来记录权能空间链表、各任务的父任
                 务信息以及权能空间的空闲槽           slot 信息.
                    以上我们描述了操作系统内核权能模块底层实现的权能数据结构. 相对应地, 我们将底层权能数据结构抽象
                 化, 定义高层的抽象数据状态         acspace, 类型为任务优先级到三元组的映射, 如下所示.
                                           priority → ((list slot_val_type) * (list childs) * parent),
                 其中, 三元组包括: 该任务所有        slots 中存储的权能值构成的链表, 每个权能值定义和底层一致, 包括                  slot 类型, 权
                 能类型和权能的取值; 该任务所有子任务构成的链表                 childs; 以及该任务的父亲    parent. 与底层相比, 具体的数据结
                 构实现被抽象, 而保留了权能值以及任务之间的父子关系的信息.

                 4.2   权能全局不变式
                    权能的全局不变式描述与权能有关的所有共享资源, 以及不同资源之间的一致关系、底层和高层资源之间的
                 一致关系. 以下    CapabilityInv  定义了权能不变式, 其中高层抽象状态        acspace 作为不变式的参数, 用于与其他功能
                 模块内核层面的交互. 前两行的断言描述了底层的权能数据结构, Hcapspace 描述高层数据状态, 其余纯断言公式
                 定义一致关系.
                 Definition CapabilityInv acspace :=
                  EX l ptrvl vl cspacels pl objvl,
                   CSpacePrioTbl l ptrvl vl cspacels ** CSpaceObjectPointer objvl **
                   //分别为任务权能空间指针数组和任务权能空间                 slot 空位置的数组
                   CSpaceCapParent pl ** CSpaceGVars ** // 任务父亲信息数组, 权能全局变量
                   Hcapspace acspace ** //高层权能数据状态
                   [|RL_consistent(ptrvl, pl, vl)|] ** //底层各数据结构之间的一致性
                   [|RLH_consistent(ptrvl, vl, acspace)|] **//底层和高层数据状态的一致性
                   [|capability_wellform_descendents vl cspacels|].
                    最后一个断言表示, 每个权能节点与其后代子孙节点无环, 构成树状结构. 这既符合权能模块的设计需求, 又
                 保证了递归操作的可终止性. 由于全局不变式定义内核共享资源, 因此只有在临界区内可以展开, 否则是保持封闭
                 的形式, 也就是    CapabilityInv acspace.
   150   151   152   153   154   155   156   157   158   159   160