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

何韬 等: GhostFunc: 一种针对  Rust 操作系统内核的验证方法                                         3499


                 一个表达式    (或操作), 第  2  个元素表示一个状态      (如内存状态). 在操作语义中, 这种表示方式用来描述程序在某个
                                                                               .
                 状态下执行某个表达式的过程, 例如           ⟨expr,σ⟩ 表示在内存状态    σ 下执行操作    expr σ 表示内存状态, 通常是内存地
                 址到值的映射.     p 为内存地址即指针.      σ[p 7→ v] 表示更新内存状态, 将新分配的内存地址          p 映射到值.   → 表示状态
                 转变.   p ∈ dom(σ) 表示地址   p 存在于内存状态  σ 的域中.  unit 表示释放操作的返回值, 通常为单位类型           (无意义值),
                                              p h ⊢ v 1 = v 2  表示在内存状态
                 σ−{p} 表示从内存状态     σ 中移除地址  .                        h 下,  v 1  等于  . 在判断操作语义中  1  表示  true,
                                                                              v 2
                 0  表示  false.
                    E-Z  表示常量   z  在任何状态   σ  下都保持不变, 即不引起状态的改变, E-VAR           表示为变量     x  添加内存映射.
                                               ′          ′                     ′               ′
                 E-ADD1 表示当   e 2  在状态  σ 下化简为   e  且状态变为  σ  时, 表达式  e 1 + e 2  化简为   e + e 2 , 状态也变为  σ . E-ADD2
                                                                                1
                                               2
                 跟  E-ADD1  类似, E-ADD3  表示当两个值    v 1  和  v 2  相加时, 结果为  , 且状态  σ 保持不变. E-ALLOC, E-FREE, E-
                                                                    v 3
                 LOAD, E-STORE  这  4  个操作是有关内存方面的操作. E-ALLOC       表示当在内存状态       σ 下分配一个值   时, 如果     p
                                                                                               v
                 是一个新地址, 则结果状态为新地址           p 和更新后的内存状态       σ[p 7→ v]. E-FREE  表示当在内存状态  σ 下释放地址    p
                 时, 如果   p 存在于  σ 中, 则结果状态为单位类型和更新后的内存状态              (移除了 p). E-LOAD  表示当在内存状态      σ 下
                 从地址   p 读取值时, 如果   p 存在于   σ 中, 则结果状态为读取的值       σ(p) 和未改变的内存状态       σ. E-STORE  表示当在
                                v
                 内存状态   σ 下将值   写入地址    p 时, 如果   p 存在于  σ 中, 则结果状态为单位类型和更新后的内存状态             σ[p 7→ v].
                    下面介绍求值评估操作语义之外的拓展操作语义部分.
                    定义  3. 拓展操作语义.

                                         ′  ′
                                 ⟨e,σ⟩ → ⟨e ,σ ⟩
                                                           [O-IF]
                                                        ′
                                           ′
                      ⟨if e then s 1 else s 2 ,σ⟩ → ⟨if e then s 1 else s 2 ,σ ⟩
                                                                                ′
                                        ′
                            ⟨e,σ⟩ → ⟨true,σ ⟩                      ⟨e,σ⟩ → ⟨false,σ ⟩
                                                 [O-IF-TRUE]                             [O-IF-FALSE]
                                                                                      ′
                                              ′
                      ⟨if true then s 1 else s 2 ,σ⟩ → ⟨s 1 ,σ ⟩  ⟨if false then s 1 else s 2 ,σ⟩ → ⟨s 2 ,σ ⟩
                                             ′  ′
                                     ⟨e,σ⟩ → ⟨e ,σ ⟩
                                                                  [O-WHILE]
                                                               ′
                      ⟨while e do s,σ⟩ → ⟨if e then (s; while e do s) else skip,σ ⟩
                                                           [O-CALL]                       [O-RET]
                      ⟨call f(¯x) ret k,σ⟩ → ⟨let cont k(¯x) := F 1 in F 2 ,σ⟩  ⟨ret v,σ⟩ → ⟨v,σ⟩
                                            [O-FORK]                                     [O-LOCK]
                      ⟨fork {e},σ⟩ → ⟨e,σ⟩ | ⟨e,σ⟩          ⟨lock(p),σ⟩ → ⟨unit,σ[p 7→ locked]⟩
                               h(ℓ) = (reading 0,v )
                                            ′
                                                         [O-CAS-SUCCESS]
                      ⟨CAS (ℓ,v 1 ,v 2 ),h⟩ → ⟨1,h[ℓ ← (reading 0,v 2 )]⟩
                                   ′  ′
                      h(ℓ) = (reading 0,v )∗v , v 1
                                            [O-CAS-FAIL]
                      ⟨CAS (ℓ,v 1 ,v 2 ),h⟩ → ⟨0,h⟩
                                                                                     ′
                                                     ′
                    O-IF  当条件表达式    e 在状态  σ 下简化为   e  时, 条件语句  if e then s 1 else s 2  简化为  if e then s 1 else s 2 , 状态也变
                    ′
                 为  e . O-IF-TRUE  表示在当条件表达式    e 在状态  σ 下化简为   true 时, 条件语句  if true then s 1 else s 2  化简为  s 1  同时
                         ′
                 状态变为   e . O-IF-FALSE  和  O-WHILE  与  O-IF-TRUE  的条件判断类似.
                      call f(¯x) ret k  表示调用函数   f  并返回给  k. [O-CALL] 表示当调用函数   f  时, 将函数体  F 1  和  F 2  放入上下文中,
                            σ 下继续执行. [O-RET] 表示当执行返回操作时, 返回值   并且内存状态保持不变. [O-FORK] 表示
                                                                        v
                 并在内存状态
                 当创建一个新的并发线程时, 结果状态包含两个线程各自执行表达式                      e 的状态, 而内存状态     σ 被共享.
                    CAS  操作在并发环境下是原子的, 所以要确保            CAS  操作不能被打断. 我们定义        CAS (ℓ,v 1 ,v 2 ) 表示比较并交换
                                                                                 ℓ
                                                                                             ′
                 操作, 将地址   ℓ 上的值从   v 1  更新为  ,            ′              h 中, 地址   的当前值为   v  并且没有读写
                                           v 2 h(ℓ) = (reading 0,v ) 表示在内存状态
                                                        ℓ
                 锁.  h[ℓ ← (reading 0,v 2 )] 表示更新内存状态, 将地址   的值设置为  . [O-CAS] 表示当执行比较并交换操作时, 如果
                                                                   v 2
                                           v 2  并返回 1 表示成功; 如果地址   上的值不为  , 则返回        0  表示失败, 内存状态
                                                                    ℓ
                 地址   ℓ 上的值为  , 则将其更新为                                         v 1
                              v 1
                 保持不变.

                 4   任务管理与调度验证实例
                    本节将以任务管理模块验证为例, 以第             3  节和第  4  节为基础形式化任务管理模块中的          unsafe 代码部分, 并同
   71   72   73   74   75   76   77   78   79   80   81