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

徐家乐 等: 操作系统内核权能访问控制的形式验证                                                        3579


                 4.3   权能内部函数和   API 函数的规范与验证
                    操作系统内核的正确性可以归结为, API 函数的实现是其高层规范的精化, 其中高层规范定义相应函数的功
                 能正确性需求. 在实现中, API 函数会调用内核中的内部函数, 因此                 API 函数的正确性依赖于内部函数的正确性.
                 我们本节将介绍      API 函数和内部函数在      CSL-R  中不同的证明模式.
                    下面的章节中, 我们将分别选择          grant_cap_kernel 和  cnode_revoke 作为代表, 来介绍我们的验证过程. 前者是
                 为任务赋予新的权能的内部函数, 包含对某个具体任务的权能进行赋值的操作, 这些操作在其他权能函数中也广
                 泛存在; 后者是递归删除某个任务及其所有后代的某个给定权能, 涉及递归不变式的定义和递归函数的验证.

                 4.3.1    grant_cap_kernel 的建模、规范和验证
                    如代码   1  所示, grant_cap_kernel 赋予任务  destTask  一个新的  CATEGORY  类型的权能  (class, right), 作为内核
                 函数, 它具有对任务权能数据结构进行访问和修改的权利. 它首先检查参数的合法性, 若不满足, 将返回                                grant_
                 failure; 若满足, 那么将进行下面一系列的赋值操作: 从          CSpacePrioTbl 出发, 先到达任务   destTask  所对应的权能空
                 间, 然后到达   class 索引的  slot, 最后将对应的权能类型置为       CATEGORY, 内容置为     class, 权能值修改为原来的值
                 与参数   right 的或, 即添加  right 这个权能. 代码中“→”和“..”分别表示指针取值和结构体成员访问. 以下               grant_cap_
                 kernel 函数的实现在   Coq  中定义. 我们不难发现, CSL-R    所定义的    C  语言子集语法, 其外观与      C  语言基本类似, 增
                 强了模型的可读性, 简化了从         C  代码实现到   Coq  模型的翻译过程.

                 代码  1. 内核函数  grant_cap_kernel 代码.
                 Int8u grant_cap_kernel·(Int8u destTask; Int32u class; Int32u right){
                 1. if(…){
                 2. return grant_failure;
                 3. }
                 4. …
                 5. CSpacePrioTbl[destTask]→cnode..slots[class]..capability..type = CATEGORY;
                 6. CSpacePrioTbl[destTask]→cnode..slots[class]..capability..content..category..content =class;

                 7. CSpacePrioTbl [destTask]→cnode..slots[class]..capability..content..category..right &=4095; s
                 8. CSpacePrioTbl[destTask]→cnode..slots[class]..capability..content..category..category..right  ⊨ right;
                 }
                    内核函数的功能正确性由前后条件             (pre-/post-conditions) 规范定义, 其中前条件描述该函数顺利执行需要拥
                 有的资源以及各种类型变量的值, 而后条件描述内核函数执行后对资源的修改. 对于                          grant_cap_kernel 成功执行的
                 情况, 它的功能正确性需求由以下前/后条件规范定义                (仅列出主要的断言).

                 { CSpacePrioTbl l ptrvl vl cspacels ** … }
                   grant_cap_kernel
                 {CSpacePrioTbl l ptrvl vl' cspacels ** [|vl' = (update_nth_cspace_slots_cap destTask class priotbl
                   (CATEGORY, (class, (Right &4095) | right, z))|] **… }

                    前条件表示当前内核函数获得了权能空间资源的访问权限, 对应于                       CSpacePrioTbl 断言表示的所有已有任务
                 的权能空间; 后条件表示执行该操作后, 依旧持有权能资源的使用权限, 而且将权能值序列                            vl 修改为  vl', 其中  vl'
                 和  vl 满足  [|…|] 内定义的纯断言关系, update_nth_cspace_slots_cap  表示  vl'由  vl 更改对应权能得到, 它将任务
                 destTask  的权能空间中槽   class 对应的权能根据函数传入的参数进行权能类型、内容和值的修改. Right 和                   z 都表
                 示在初始   vl 中对应的权能值, 这里的      z 是占位符, 对   category  类型权能不起作用.
                    在  Coq  中对以上规范进行验证时, 需要按照第           4.1  节定义权能结构断言      CSpacePrioTbl 的顺序, 逐层按照参
   151   152   153   154   155   156   157   158   159   160   161