~james/split

feat(isolation): refine shared storage to private byte memories

commit
087436dffa8c479396bd36f7908df837ba49f487 browse tree
parent
8607a1f0203849a9b6c9c17c2abccc1ea56220fd
author
james <j@cpl0.zip>
signature
Verified ~james signed with a key registered by ~james
date
2026-05-14 19:37 UTC

2 files changed, +90 −0

Isolation.thy added

@@ -0,0 +1,89 @@
1+theory Isolation
2+ imports Model
3+begin
4+
5+lemma write_target:
6+ assumes "bounded n s" "k < n"
7+ shows "view (store s k offset byte) k = (view s k)(offset := byte)"
8+ using prepare_view[OF assms, of k]
9+ by (simp add: view_def store_def Let_def)
10+
11+lemma write_other:
12+ assumes inv: "invariant n s" and valid: "k < n" "j < n" and different: "j \<noteq> k"
13+ shows "view (store s k offset byte) j = view s j"
14+proof -
15+ have prepared: "invariant n (prepare s k)"
16+ using inv by (rule prepare_invariant)
17+ have distinct: "ptable (prepare s k) j \<noteq> ptable (prepare s k) k"
18+ using writable_unique[of n "prepare s k" k j] prepared valid different
19+ by (auto simp: invariant_def)
20+ have preserved: "view (prepare s k) j = view s j"
21+ using prepare_view[of n s j k] inv valid by (auto simp: invariant_def)
22+ show ?thesis
23+ using distinct preserved by (simp add: store_def view_def Let_def)
24+qed
25+
26+theorem write_refinement:
27+ assumes "invariant n s" "k < n" "j < n"
28+ shows "view (store s k offset byte) j =
29+ (if j = k then (view s k)(offset := byte) else view s j)"
30+ using assms write_target write_other by (auto simp: invariant_def)
31+
32+corollary read_after_write:
33+ "invariant n s \<Longrightarrow> k < n \<Longrightarrow>
34+ view (store s k offset byte) k offset = byte"
35+ using write_refinement[of n s k k offset byte] by simp
36+
37+corollary other_offset:
38+ "invariant n s \<Longrightarrow> k < n \<Longrightarrow> address \<noteq> offset \<Longrightarrow>
39+ view (store s k offset byte) k address = view s k address"
40+ using write_refinement[of n s k k offset byte] by simp
41+
42+definition reference_write :: "memory \<Rightarrow> nat \<Rightarrow> nat \<Rightarrow> nat \<Rightarrow> memory" where
43+ "reference_write m k offset byte = m(k := (m k)(offset := byte))"
44+
45+definition represents :: "nat \<Rightarrow> pager \<Rightarrow> memory \<Rightarrow> bool" where
46+ "represents n s m \<longleftrightarrow> (\<forall>k<n. view s k = m k)"
47+
48+lemma represents_initial:
49+ "represents n (initial pages contents) (\<lambda>k. contents (k mod pages))"
50+ by (simp add: represents_def)
51+
52+theorem simulation:
53+ assumes "invariant n s" "represents n s m" "k < n"
54+ shows "represents n (store s k offset byte) (reference_write m k offset byte)"
55+ using assms write_refinement[of n s k]
56+ by (auto simp: represents_def reference_write_def)
57+
58+lemma prepared_exclusive:
59+ "invariant n s \<Longrightarrow> k < n \<Longrightarrow> j < n \<Longrightarrow> j \<noteq> k \<Longrightarrow>
60+ ptable (prepare s k) j \<noteq> ptable (prepare s k) k"
61+ using prepare_invariant writable_unique prepare_writable
62+ unfolding invariant_def by blast
63+
64+lemma writable_no_copy:
65+ "writable s k \<Longrightarrow> frontier (store s k offset byte) = frontier s"
66+ by (simp add: prepare_def)
67+
68+lemma readonly_one_copy:
69+ "\<not> writable s k \<Longrightarrow> frontier (store s k offset byte) = Suc (frontier s)"
70+ by (simp add: prepare_def)
71+
72+lemma subsequent_write_no_copy:
73+ "frontier (store (store s k a x) k b y) = frontier (store s k a x)"
74+ by (rule writable_no_copy) simp
75+
76+lemma write_writable_target [simp]: "writable (store s k offset byte) k"
77+ by simp
78+
79+lemma write_writable_other:
80+ "j \<noteq> k \<Longrightarrow> writable (store s k offset byte) j = writable s j"
81+ by (simp add: prepare_def)
82+
83+lemma write_preserves_unallocated:
84+ "f > frontier s \<Longrightarrow> physical (store s k offset byte) f = physical s f"
85+ if "bounded n s" "k < n" for f s k n offset byte
86+ using that bounded_frame[OF that]
87+ by (auto simp: store_def prepare_def detach_def Let_def split: if_splits)
88+
89+end

ROOT modified

@@ -2,3 +2,4 @@ session Split = HOL +
22 options [document = false]
33 theories
44 Model
5+ Isolation