annotate paper/cbc_interface.tex @ 13:1ef114182e80

sources move src/ and delete par
author tobaru
date Wed, 05 Feb 2020 17:08:43 +0900
parents 9cf9e0b086c7
children 98cee2f6c919
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
8
737421115770 chapter cbc_interface and impl_paging
tobaru
parents:
diff changeset
1 \chapter{CbC インターフェース}
737421115770 chapter cbc_interface and impl_paging
tobaru
parents:
diff changeset
2
737421115770 chapter cbc_interface and impl_paging
tobaru
parents:
diff changeset
3 構造図書く(今のcbcxv6と同じか確認してから)
737421115770 chapter cbc_interface and impl_paging
tobaru
parents:
diff changeset
4
737421115770 chapter cbc_interface and impl_paging
tobaru
parents:
diff changeset
5
737421115770 chapter cbc_interface and impl_paging
tobaru
parents:
diff changeset
6 Gears OS では Meta Code Gear で Context から値を取り出し、ノーマルレベルの Code Gear に値を渡す。
737421115770 chapter cbc_interface and impl_paging
tobaru
parents:
diff changeset
7 しかし、Code Gaer がどの Data Gear の番号に対応するかを指定する必要があったり、 % ぱるすさんコード必要?
737421115770 chapter cbc_interface and impl_paging
tobaru
parents:
diff changeset
8 ノーマルレベルとメタレベルで見え方が異なる Data Gear を Meta Code Gear によって 調整する必要があったりと、 % みつきさん
737421115770 chapter cbc_interface and impl_paging
tobaru
parents:
diff changeset
9 メタレベルからノーマルレベルの継続の記述が煩雑になるため、Interface 化をしている。
737421115770 chapter cbc_interface and impl_paging
tobaru
parents:
diff changeset
10 Interface は Data Gear に対しての操作を行う Code Gear であり、実装は別で定義する。
737421115770 chapter cbc_interface and impl_paging
tobaru
parents:
diff changeset
11 % Interface で定義した Code Gear に
737421115770 chapter cbc_interface and impl_paging
tobaru
parents:
diff changeset
12
737421115770 chapter cbc_interface and impl_paging
tobaru
parents:
diff changeset
13
737421115770 chapter cbc_interface and impl_paging
tobaru
parents:
diff changeset
14 % Xv6 の書き換えは Interface を用いてモジュール化する。
737421115770 chapter cbc_interface and impl_paging
tobaru
parents:
diff changeset
15 そうすることで Gears OS の機能を置き換えることできるようになる。
737421115770 chapter cbc_interface and impl_paging
tobaru
parents:
diff changeset
16
737421115770 chapter cbc_interface and impl_paging
tobaru
parents:
diff changeset
17
737421115770 chapter cbc_interface and impl_paging
tobaru
parents:
diff changeset
18
737421115770 chapter cbc_interface and impl_paging
tobaru
parents:
diff changeset
19 \section{インターフェースの定義}
737421115770 chapter cbc_interface and impl_paging
tobaru
parents:
diff changeset
20 インターフェースはある Data Gear の定義と、
737421115770 chapter cbc_interface and impl_paging
tobaru
parents:
diff changeset
21 それに対する操作を行う Code Gear の集合を表現する Meta Data Gear である。
737421115770 chapter cbc_interface and impl_paging
tobaru
parents:
diff changeset
22 Context では全ての Code Gaer と Data Gear の集合を表現していることに対し、
737421115770 chapter cbc_interface and impl_paging
tobaru
parents:
diff changeset
23 インターフェースは一部の Code Gear と一部の Data Gear の集合を表現する。
13
1ef114182e80 sources move src/ and delete par
tobaru
parents: 12
diff changeset
24
1ef114182e80 sources move src/ and delete par
tobaru
parents: 12
diff changeset
25
8
737421115770 chapter cbc_interface and impl_paging
tobaru
parents:
diff changeset
26 インターフェースを記述することによってノーマルレベルとメタレベルの分離が可能となる。
737421115770 chapter cbc_interface and impl_paging
tobaru
parents:
diff changeset
27
12
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
28 Paging のインターフェースを記述したコードを ソースコード \ref{interface} に示す。
8
737421115770 chapter cbc_interface and impl_paging
tobaru
parents:
diff changeset
29
13
1ef114182e80 sources move src/ and delete par
tobaru
parents: 12
diff changeset
30 \lstinputlisting[label=interface, caption={\footnotesize vm のインターフェースの定義(vm.h)}]{./src/vm.h}
8
737421115770 chapter cbc_interface and impl_paging
tobaru
parents:
diff changeset
31
12
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
32 1行目ので実装名を定義している。
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
33 typedef struct の直後に実装名(vm)を書く。
13
1ef114182e80 sources move src/ and delete par
tobaru
parents: 12
diff changeset
34
1ef114182e80 sources move src/ and delete par
tobaru
parents: 12
diff changeset
35
8
737421115770 chapter cbc_interface and impl_paging
tobaru
parents:
diff changeset
36 2行目から19行目で引数の Data Gear 郡を定義している。
12
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
37 初期化された Data Gear がそれぞれの Code Gear の引数として扱われる。
8
737421115770 chapter cbc_interface and impl_paging
tobaru
parents:
diff changeset
38 例として、2行目で定義された vm が21行目から32行目までの引数と対応している。
13
1ef114182e80 sources move src/ and delete par
tobaru
parents: 12
diff changeset
39
1ef114182e80 sources move src/ and delete par
tobaru
parents: 12
diff changeset
40
8
737421115770 chapter cbc_interface and impl_paging
tobaru
parents:
diff changeset
41 % インターフェースの Code Gear の goto による継続先は基本的に不定となっており、継続元から渡される。
12
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
42 Code Gear は\_\_code CodeGearName () で記述する。
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
43 第一引数である Impl* vm が Code Gear の型になる。
13
1ef114182e80 sources move src/ and delete par
tobaru
parents: 12
diff changeset
44
1ef114182e80 sources move src/ and delete par
tobaru
parents: 12
diff changeset
45
8
737421115770 chapter cbc_interface and impl_paging
tobaru
parents:
diff changeset
46 \_\_code next(...) の引数 ... は複数の Input Data Gear を持つという意味である。
737421115770 chapter cbc_interface and impl_paging
tobaru
parents:
diff changeset
47 後述する実装によって条件分岐によって複数の継続先が設定されることがある。
13
1ef114182e80 sources move src/ and delete par
tobaru
parents: 12
diff changeset
48
1ef114182e80 sources move src/ and delete par
tobaru
parents: 12
diff changeset
49
8
737421115770 chapter cbc_interface and impl_paging
tobaru
parents:
diff changeset
50 Code Gaer は 20行目から33行目のように "\_\_code [Code Gear名]([引数])"で定義する。
737421115770 chapter cbc_interface and impl_paging
tobaru
parents:
diff changeset
51 この引数が input Data Gear になる。
737421115770 chapter cbc_interface and impl_paging
tobaru
parents:
diff changeset
52
737421115770 chapter cbc_interface and impl_paging
tobaru
parents:
diff changeset
53
737421115770 chapter cbc_interface and impl_paging
tobaru
parents:
diff changeset
54 % 実装側に書く
737421115770 chapter cbc_interface and impl_paging
tobaru
parents:
diff changeset
55 % 引数の Data Gear はその Code Gear の Input Data Gear になり、引数の Code Gear の中の引 数が Output Data Gear になる。Code Gear の第一引数には Interface を実装した Data Gear を渡す。これは、Code Gear の操作の対象となる Data Gear を設定し ており、後述する継続構文では引数として記述を行わない。
737421115770 chapter cbc_interface and impl_paging
tobaru
parents:
diff changeset
56
737421115770 chapter cbc_interface and impl_paging
tobaru
parents:
diff changeset
57
737421115770 chapter cbc_interface and impl_paging
tobaru
parents:
diff changeset
58 \section{インターフェースの実装}
737421115770 chapter cbc_interface and impl_paging
tobaru
parents:
diff changeset
59 インターフェースは Data Gear に対しての Code Gear とその Code Gear で扱われている Data Gear の集合を抽象化した Meta Data Gear で、vm.c に対応する実装は別で定義する。
13
1ef114182e80 sources move src/ and delete par
tobaru
parents: 12
diff changeset
60
1ef114182e80 sources move src/ and delete par
tobaru
parents: 12
diff changeset
61
12
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
62 インターフェースの実装についてソースコード \ref{impl_vm} で示す。
8
737421115770 chapter cbc_interface and impl_paging
tobaru
parents:
diff changeset
63
737421115770 chapter cbc_interface and impl_paging
tobaru
parents:
diff changeset
64
13
1ef114182e80 sources move src/ and delete par
tobaru
parents: 12
diff changeset
65 \lstinputlisting[frame=lrbt,label=impl_vm,caption={\footnotesize vm インターフェースの実装}]{./src/vm_impl.cbc}
8
737421115770 chapter cbc_interface and impl_paging
tobaru
parents:
diff changeset
66
13
1ef114182e80 sources move src/ and delete par
tobaru
parents: 12
diff changeset
67 2行目のようにインターフェースのヘッダーファイルは \#interface で呼び出す。
8
737421115770 chapter cbc_interface and impl_paging
tobaru
parents:
diff changeset
68
12
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
69
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
70 create\_impl の関数内で、インターフェースを vm で定義し、23行目の vm-$>$void\_ret のようにそれぞれのインターフェースに対応させていく。
13
1ef114182e80 sources move src/ and delete par
tobaru
parents: 12
diff changeset
71
1ef114182e80 sources move src/ and delete par
tobaru
parents: 12
diff changeset
72
12
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
73 CbCは1つ1つの関数の信頼性を保障させるために細かくする必要があるので、for文やif文がある場合はさらに実装を分ける。vm と同じように vm\_impl を定義し、遷移する関数名に対応させていく。分けた実装はさらに別で実装する(vm\_impl\_private.cbc)。
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
74
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
75
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
76 % インターフェースを呼び出す場合は、struct vm* vm = createvm_impl(cbc_context);
13
1ef114182e80 sources move src/ and delete par
tobaru
parents: 12
diff changeset
77
1ef114182e80 sources move src/ and delete par
tobaru
parents: 12
diff changeset
78
12
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
79
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
80
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
81
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
82
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
83
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
84
8
737421115770 chapter cbc_interface and impl_paging
tobaru
parents:
diff changeset
85
737421115770 chapter cbc_interface and impl_paging
tobaru
parents:
diff changeset
86
737421115770 chapter cbc_interface and impl_paging
tobaru
parents:
diff changeset
87 \section{インターフェース内の private メソッド}
737421115770 chapter cbc_interface and impl_paging
tobaru
parents:
diff changeset
88 インターフェースで定義した Code Gear 以外の Code Gaer も記述することができる。
737421115770 chapter cbc_interface and impl_paging
tobaru
parents:
diff changeset
89 この Code Gear は基本的にインターフェースで指定された Code Gear 内からのみ継続されるため、
737421115770 chapter cbc_interface and impl_paging
tobaru
parents:
diff changeset
90 Java の private メソッドのように扱われる。
13
1ef114182e80 sources move src/ and delete par
tobaru
parents: 12
diff changeset
91
1ef114182e80 sources move src/ and delete par
tobaru
parents: 12
diff changeset
92
12
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
93 インターフェースと同じようにヘッダーファイルをソースコード \ref{impl_vm_privateh} で定義する。
8
737421115770 chapter cbc_interface and impl_paging
tobaru
parents:
diff changeset
94
737421115770 chapter cbc_interface and impl_paging
tobaru
parents:
diff changeset
95
13
1ef114182e80 sources move src/ and delete par
tobaru
parents: 12
diff changeset
96 \lstinputlisting[frame=lrbt,label=impl_vm_privateh,caption={\footnotesize vm private のヘッダーファイル}]{./src/vm_impl_private.h}
12
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
97
11
f7ed2b4874f4 xv6 reference
tobaru
parents: 10
diff changeset
98
12
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
99 private での CbC の記述を vm.c と比べて説明する。
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
100 全体の記述量が多いため、if文とfor文のある loaduvm という関数で説明を行う。
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
101
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
102
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
103 \begin{lstlisting}[frame=lrbt,label=vm_loaduvm,caption={\footnotesize vm.c のloaduvm}]
13
1ef114182e80 sources move src/ and delete par
tobaru
parents: 12
diff changeset
104 // Return the address of the PTE in page directory that corresponds to
1ef114182e80 sources move src/ and delete par
tobaru
parents: 12
diff changeset
105 // virtual address va. If alloc!=0, create any required page table pages.
1ef114182e80 sources move src/ and delete par
tobaru
parents: 12
diff changeset
106 static pte_t* walkpgdir (pde_t *pgdir, const void *va, int alloc)
1ef114182e80 sources move src/ and delete par
tobaru
parents: 12
diff changeset
107 {
1ef114182e80 sources move src/ and delete par
tobaru
parents: 12
diff changeset
108 pde_t *pde;
1ef114182e80 sources move src/ and delete par
tobaru
parents: 12
diff changeset
109 pte_t *pgtab;
8
737421115770 chapter cbc_interface and impl_paging
tobaru
parents:
diff changeset
110
13
1ef114182e80 sources move src/ and delete par
tobaru
parents: 12
diff changeset
111 // pgdir points to the page directory, get the page direcotry entry (pde)
1ef114182e80 sources move src/ and delete par
tobaru
parents: 12
diff changeset
112 pde = &pgdir[PDE_IDX(va)];
1ef114182e80 sources move src/ and delete par
tobaru
parents: 12
diff changeset
113
1ef114182e80 sources move src/ and delete par
tobaru
parents: 12
diff changeset
114 if (*pde & PE_TYPES) {
1ef114182e80 sources move src/ and delete par
tobaru
parents: 12
diff changeset
115 pgtab = (pte_t*) p2v(PT_ADDR(*pde));
1ef114182e80 sources move src/ and delete par
tobaru
parents: 12
diff changeset
116
1ef114182e80 sources move src/ and delete par
tobaru
parents: 12
diff changeset
117 } else {
1ef114182e80 sources move src/ and delete par
tobaru
parents: 12
diff changeset
118 if (!alloc || (pgtab = (pte_t*) kpt_alloc()) == 0) {
1ef114182e80 sources move src/ and delete par
tobaru
parents: 12
diff changeset
119 return 0;
1ef114182e80 sources move src/ and delete par
tobaru
parents: 12
diff changeset
120 }
1ef114182e80 sources move src/ and delete par
tobaru
parents: 12
diff changeset
121
1ef114182e80 sources move src/ and delete par
tobaru
parents: 12
diff changeset
122 // Make sure all those PTE_P bits are zero.
1ef114182e80 sources move src/ and delete par
tobaru
parents: 12
diff changeset
123 memset(pgtab, 0, PT_SZ);
1ef114182e80 sources move src/ and delete par
tobaru
parents: 12
diff changeset
124
1ef114182e80 sources move src/ and delete par
tobaru
parents: 12
diff changeset
125 // The permissions here are overly generous, but they can
1ef114182e80 sources move src/ and delete par
tobaru
parents: 12
diff changeset
126 // be further restricted by the permissions in the page table
1ef114182e80 sources move src/ and delete par
tobaru
parents: 12
diff changeset
127 // entries, if necessary.
1ef114182e80 sources move src/ and delete par
tobaru
parents: 12
diff changeset
128 *pde = v2p(pgtab) | UPDE_TYPE;
1ef114182e80 sources move src/ and delete par
tobaru
parents: 12
diff changeset
129 }
1ef114182e80 sources move src/ and delete par
tobaru
parents: 12
diff changeset
130
1ef114182e80 sources move src/ and delete par
tobaru
parents: 12
diff changeset
131 return &pgtab[PTE_IDX(va)];
1ef114182e80 sources move src/ and delete par
tobaru
parents: 12
diff changeset
132 }
1ef114182e80 sources move src/ and delete par
tobaru
parents: 12
diff changeset
133
1ef114182e80 sources move src/ and delete par
tobaru
parents: 12
diff changeset
134 // Load a program segment into pgdir. addr must be page-aligned
1ef114182e80 sources move src/ and delete par
tobaru
parents: 12
diff changeset
135 // and the pages from addr to addr+sz must already be mapped.
12
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
136 int loaduvm (pde_t *pgdir, char *addr, struct inode *ip, uint offset, uint sz)
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
137 {
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
138 uint i, pa, n;
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
139 pte_t *pte;
8
737421115770 chapter cbc_interface and impl_paging
tobaru
parents:
diff changeset
140
12
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
141 if ((uint) addr % PTE_SZ != 0) {
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
142 panic("loaduvm: addr must be page aligned");
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
143 }
8
737421115770 chapter cbc_interface and impl_paging
tobaru
parents:
diff changeset
144
12
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
145 for (i = 0; i < sz; i += PTE_SZ) {
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
146 if ((pte = walkpgdir(pgdir, addr + i, 0)) == 0) {
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
147 panic("loaduvm: address should exist");
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
148 }
8
737421115770 chapter cbc_interface and impl_paging
tobaru
parents:
diff changeset
149
12
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
150 pa = PTE_ADDR(*pte);
8
737421115770 chapter cbc_interface and impl_paging
tobaru
parents:
diff changeset
151
12
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
152 if (sz - i < PTE_SZ) {
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
153 n = sz - i;
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
154 } else {
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
155 n = PTE_SZ;
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
156 }
8
737421115770 chapter cbc_interface and impl_paging
tobaru
parents:
diff changeset
157
12
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
158 if (readi(ip, p2v(pa), offset + i, n) != n) {
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
159 return -1;
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
160 }
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
161 }
8
737421115770 chapter cbc_interface and impl_paging
tobaru
parents:
diff changeset
162
12
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
163 return 0;
8
737421115770 chapter cbc_interface and impl_paging
tobaru
parents:
diff changeset
164 }
737421115770 chapter cbc_interface and impl_paging
tobaru
parents:
diff changeset
165
737421115770 chapter cbc_interface and impl_paging
tobaru
parents:
diff changeset
166 \end{lstlisting}
737421115770 chapter cbc_interface and impl_paging
tobaru
parents:
diff changeset
167
13
1ef114182e80 sources move src/ and delete par
tobaru
parents: 12
diff changeset
168 vm\_impl.cbc の Code Gear であるloaduvmvm\_impl から goto で loaduvm\_ptesize\_checkvm\_impl に遷移する。
1ef114182e80 sources move src/ and delete par
tobaru
parents: 12
diff changeset
169 vm.c での最初の if 文までの処理を 1つの Code Gear として loaduvm\_ptesize\_checkvm\_impl に記述する。(3行目~11行目)
1ef114182e80 sources move src/ and delete par
tobaru
parents: 12
diff changeset
170
1ef114182e80 sources move src/ and delete par
tobaru
parents: 12
diff changeset
171
1ef114182e80 sources move src/ and delete par
tobaru
parents: 12
diff changeset
172
1ef114182e80 sources move src/ and delete par
tobaru
parents: 12
diff changeset
173
8
737421115770 chapter cbc_interface and impl_paging
tobaru
parents:
diff changeset
174
12
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
175
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
176
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
177 \begin{lstlisting}[frame=lrbt,label=impl_vm_loaduvm,caption={\footnotesize privateでの loaduvm の実装}]
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
178 #interface "vm_impl.h"
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
179
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
180 __code loaduvm_ptesize_checkvm_impl(struct vm_impl* vm_impl, __code next(int ret, ...)) {
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
181 char* addr = vm_impl->addr;
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
182
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
183 if ((uint) addr %PTE_SZ != 0) {
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
184 // goto panic
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
185 }
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
186
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
187 goto loaduvm_loopvm_impl(vm_impl, next(ret, ...));
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
188 }
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
189
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
190 __code loaduvm_loopvm_impl(struct vm_impl* vm_impl, __code next(int ret, ...)) {
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
191 uint i = vm_impl->i;
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
192 uint sz = vm_impl->sz;
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
193
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
194 if (i < sz) {
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
195 goto loaduvm_check_pgdir(vm_impl, next(ret, ...));
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
196 }
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
197
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
198 goto loaduvm_exit(vm_impl, next(ret, ...));
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
199 }
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
200
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
201
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
202 static pte_t* walkpgdir (pde_t *pgdir, const void *va, int alloc)
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
203 {
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
204 pde_t *pde;
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
205 pte_t *pgtab;
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
206
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
207 // pgdir points to the page directory, get the page direcotry entry (pde)
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
208 pde = &pgdir[PDE_IDX(va)];
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
209
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
210 if (*pde & PE_TYPES) {
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
211 pgtab = (pte_t*) p2v(PT_ADDR(*pde));
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
212
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
213 } else {
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
214 if (!alloc || (pgtab = (pte_t*) kpt_alloc()) == 0) {
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
215 return 0;
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
216 }
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
217
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
218 // Make sure all those PTE_P bits are zero.
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
219 memset(pgtab, 0, PT_SZ);
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
220
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
221 // The permissions here are overly generous, but they can
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
222 // be further restricted by the permissions in the page table
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
223 // entries, if necessary.
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
224 *pde = v2p(pgtab) | UPDE_TYPE;
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
225 }
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
226
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
227 return &pgtab[PTE_IDX(va)];
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
228 }
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
229
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
230
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
231 __code loaduvm_check_pgdir(struct vm_impl* vm_impl, __code next(int ret, ...)) {
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
232 pte_t* pte = vm_impl->pte;
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
233 pde_t* pgdir = vm_impl->pgdir;
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
234 uint i = vm_impl->i;
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
235 char* addr = vm_impl->addr;
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
236 uint pa = vm_impl->pa;
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
237
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
238 if ((pte = walkpgdir(pgdir, addr + i, 0)) == 0) {
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
239 // goto panic
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
240 }
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
241 pa = PTE_ADDR(*pte);
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
242
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
243 vm_impl->pte = pte;
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
244 vm_impl->pgdir = pgdir;
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
245 vm_impl->addr = addr;
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
246 vm_impl->pa = pa;
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
247
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
248 goto loaduvm_check_PTE_SZ(vm_impl, next(ret, ...));
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
249 }
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
250
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
251 __code loaduvm_check_PTE_SZ(struct vm_impl* vm_impl, __code next(int ret, ...)) {
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
252 uint sz = vm_impl->sz;
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
253 uint i = vm_impl->i;
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
254 uint n = vm_impl->n;
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
255 struct inode* ip = vm_impl->ip;
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
256 uint pa = vm_impl->pa;
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
257 uint offset = vm_impl->offset;
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
258
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
259 if (sz - i < PTE_SZ) {
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
260 n = sz - i;
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
261 } else {
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
262 n = PTE_SZ;
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
263 }
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
264
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
265 if (readi(ip, p2v(pa), offset + i, n) != n) {
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
266 ret = -1;
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
267 goto next(ret, ...);
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
268 }
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
269
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
270 vm_impl->n = n;
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
271
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
272 goto loaduvm_loopvm_impl(vm_impl, next(ret, ...));
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
273 }
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
274
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
275 __code loaduvm_exit(struct vm_impl* vm_impl, __code next(int ret, ...)) {
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
276 ret = 0;
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
277 goto next(ret, ...);
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
278 }
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
279
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
280 \end{lstlisting}
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
281
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
282
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
283
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
284
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
285
10
a882e390f9a2 dummy, reference, thanks
tobaru
parents: 8
diff changeset
286 \section{インターフェースの呼び出し}
12
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
287 定義したインターフェースの呼び出し方について説明する。
10
a882e390f9a2 dummy, reference, thanks
tobaru
parents: 8
diff changeset
288 CbC の場合 goto による遷移を行うので、関数呼び出しのように goto 以降のコードを実行できない。
12
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
289 例として、ソースコード \ref{cbc_goto} の16行目のように goto によってインターフェースで定義した命令を行うと、戻ってこれないため17行目以降が実行されなくなる。
10
a882e390f9a2 dummy, reference, thanks
tobaru
parents: 8
diff changeset
290
a882e390f9a2 dummy, reference, thanks
tobaru
parents: 8
diff changeset
291
13
1ef114182e80 sources move src/ and delete par
tobaru
parents: 12
diff changeset
292 \lstinputlisting[frame=lrbt,label=cbc_goto,caption={\footnotesize cbc インターフェースのgoto}]{./src/failure_example_userinit}
10
a882e390f9a2 dummy, reference, thanks
tobaru
parents: 8
diff changeset
293
13
1ef114182e80 sources move src/ and delete par
tobaru
parents: 12
diff changeset
294 \lstinputlisting[frame=lrbt,label=dummy,caption={\footnotesize dummy を使った呼び出し}]{./src/dummy}
12
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
295 ソースコードの説明
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
296
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
297
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
298
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
299
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
300
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
301
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
302
9cf9e0b086c7 fix private code
tobaru
parents: 11
diff changeset
303