comparison slide/slide.md @ 21:1769ede4d434

fin
author okud
date Tue, 16 Feb 2021 06:12:58 +0900
parents b9113f671dec
children f7343e8d74ca
comparison
equal deleted inserted replaced
20:b9113f671dec 21:1769ede4d434
34 - 琉球大学工学部工学科知能情報コース 34 - 琉球大学工学部工学科知能情報コース
35 - 河野 真治 35 - 河野 真治
36 - 琉球大学工学部 36 - 琉球大学工学部
37 37
38 --- 38 ---
39 <!-- class: slide --> 39
40 # OSとアプリケーションの信頼性を高めたい 40 # OSとアプリケーションの信頼性を高めたい
41 41
42 - Meta計算を用いて信頼性を高めるGearsOSを提案している 42 - Meta計算を用いて信頼性を高めるGearsOSを提案している
43 - x.v6を元にRaspberry Pi上で動くGearsOSを実装中 43 - x.v6を元にRaspberry Pi上で動くGearsOSを実装中
44 - BIOSからBootしているのでUEFIに移行したい 44 - キーボードやマウスが使えない
45 --- 45 - デバイスドライバを作る必要がある
46 <!-- class: slide --> 46 ---
47 # UEFI採用の利点 47 # BIOS問題
48 - x.v6の起動はBIOSを使っている
49 - IntelがCompatibility Support Module(CSM)をやめた
50 - BIOSを前提としたOSが動かなくなるかも
51 - キーボードやマウスはUSB
52 - USBドライバを作るのは難しい
53 ---
54 # <!--fit--> Gears OSをUEFIでBootさせよう
55 ---
56 # UEFIへの移行
48 - CPUなどの機種依存性を避けることができる 57 - CPUなどの機種依存性を避けることができる
49 - GearsOSはCbC(Continuation based C)で記述されていて、CPUやデバイスに影響されない 58 - GearsOSはCbC(Continuation based C)で記述されていて、CPUやデバイスに影響されない
50 - 様々な組み込みシステムに対してGearsOSを応用できる様になる 59 - 様々な組み込みシステムに対してGearsOSを応用できる様になる
51 60 - UEFIのApplicationによりUSBドライバ開発が簡単になる
52 --- 61
53 <!-- class: slide --> 62 ---
63 # 研究の成果
64 - UEFIの開発環境をSingularityで作成した
65 - gnu-efiで作成したUEFI Applicationをqemu-system-armで動かすことができた
66 - RaspberryPiにUEFIをファームウェアとして設定し、実行することができた
67 - ミニマムなKernel Loaderを調査しARM xv6用に書き直した
68 ---
54 # CbC(Continuation based C) 69 # CbC(Continuation based C)
55 - 並列信頼研究で開発されているプログラミング言語 70 - 並列信頼研究で開発されているプログラミング言語
56 - C言語の下位言語 71 - C言語の下位言語
57 - 関数呼び出しではなく継続(goto) 72 - 関数呼び出しではなく継続(goto)
58 - 関数の代わりにCodeGearという単位でプログラミングを行う。 73 - 関数の代わりにCodeGearという単位でプログラミングを行う。
59 74
60 --- 75 ---
61 <!-- class: slide --> 76
62 # GearsOS 77 # GearsOS
63 - 並列信頼研究で開発されているOS 78 - 並列信頼研究で開発されているOS
64 - 信頼性と拡張性がテーマ 79 - 信頼性と拡張性がテーマ
65 - CbCによって記述されている 80 - CbCによって記述されている
66 - x.v6をCbCで書き直して実装している 81 - x.v6をCbCで書き直して実装している
67 --- 82 ---
68 <!-- class: slide --> 83
69 # UEFI 84 # UEFI
70 - Unified Extensible Firmware Interfaceの略 85 - Unified Extensible Firmware Interfaceの略
71 - OSとプラットフォームファームウェアの間のソフトウェアインタフェースを定義する仕様 86 - OSとプラットフォームファームウェアの間のソフトウェアインタフェースを定義する仕様
72 - Intel、AMD、Apple、Microsoftなどの企業からなるUnified EFI Forumの元で開発 87 - Intel、AMD、Apple、Microsoftなどの企業からなるUnified EFI Forumの元で開発
73 - BIOSの後継 88 - BIOSの後継
74 --- 89 ---
75 <!-- class: slide --> 90
76 # UEFIのここがすごい 91 # UEFIの利点
77 - CPUやドライバに依存しない 92 - CPUやドライバに依存しない
78 - 2TBを超える大きなディスクからBootできる 93 - 2TBを超える大きなディスクからBootできる
79 - ネットワークにつながる
80 - メモリも64bitなら理論上16EB 94 - メモリも64bitなら理論上16EB
81 - 高速でBoot 95 - BIOSより高速でBoot
82 - 仕様だから開発が簡単 96 - オープン仕様だから開発が簡単
83 97
84 --- 98 ---
85 <!-- class: slide --> 99
86 # UEFI 開発環境 100 # UEFI 開発環境
87 - edk2 101 - EDK2
88 - gnu-efi 102 - gnu-efi
89 - qemu 103 - qemu
90 - singularity 104 - Singularity
91 105
92 --- 106 ---
93 <!-- class: slide --> 107
94 # gnu-efi 108 # gnu-efi
95 - システムのネイティブGCCでUEFIアプリケーションをコンパイルできる 109 - システムのネイティブGCCでUEFIアプリケーションをコンパイルできる
96 - UEFI Applicationをリンクするためのライブラリがある 110 - UEFI Applicationをリンクするためのライブラリがある
97 - UEFI Applicationの開発に特化している 111 - UEFI Applicationの開発に特化している
98 - EDK2のファームウェアがベース 112 - EDK2のファームウェアがベース
99 --- 113 ---
100 <!-- class: slide --> 114
101 # qemu 115 # qemu
102 - 異なるアーキテクチャのプログラムを動かすエミュレータ 116 - 異なるアーキテクチャのプログラムを動かすエミュレータ
103 - 本開発ではX86上でARMを動かした 117 - 本開発ではX86上でARMを動かした
104 - gnu-efiで実装したUEFIを動かした 118 - gnu-efiで実装したUEFIを動かした
105 119
106 120
107 --- 121 ---
108 <!-- class: slide -->
109 # singularity 122 # singularity
110 - ユーザーが自身の計算環境を完全再現し、保持できる様にしたLinuxコンテナ 123 - ユーザーが自身の計算環境を完全再現し、保持できる様にしたLinuxコンテナ
111 - 学科の新システムで利用できる 124 - 学科の新システムで利用できる
112 - CbC GCC ARM CrossCompile環境を作った 125 - CbC GCC ARM CrossCompile環境を作った
113 - UEFIの開発環境を作った 126 - UEFIの開発環境を作った
114 --- 127 ---
115 <!-- class: slide -->
116 # UEFI Application 128 # UEFI Application
117 - UEFI Boot Managreがロード、実行するプログラムのこと 129 - UEFI Boot Managreがロード、実行するプログラムのこと
118 - C言語で記述可能 130 - C言語で記述可能
119 - OSがなくてもプログラムを書ける 131 - OSがなくてもプログラムを書ける
120 - CPUやドライバに依存しない 132 - CPUやドライバに依存しない
134 Print(L"Hello, world!\n"); 146 Print(L"Hello, world!\n");
135 return EFI_SUCCESS; 147 return EFI_SUCCESS;
136 } 148 }
137 ``` 149 ```
138 --- 150 ---
139 BootLoader.c 151 # Gears OS UEFI Bootの課題
152 - UEFIからx.v6はBootできない
153 - x.v6はUEFIに対応されてない
154 - x.v6のBootLoaderが必要
155 - BootLoaderを作成する
156 ---
157 # Boot Loader
158
159 - OSをLoadしてBootさせる役割をもつプログラム
160 - UEFI ApplicationとしてC言語で実装できる
161 ---
162 # Boot Loaderの役割
163 1. 電源が入る
164 1. UEFIが立ち上がる
165 1. Boot ManagerからBootLoaderが起動する
166 1. BootLoaderがOSのKernelをメモリにLoadさせる
167 1. Kernelがinitプロセスを起動
168 1. initプロセスがOSのBootプロセスを起動
169 1. OSがBootされる
170
171 ---
172 # BootLoader.c
140 - efi_mainの引数設定 173 - efi_mainの引数設定
141 174
142 ``` 175 ```
143 #include<efi.h> 176 #include<efi.h>
144 #include<efilib.h> 177 #include<efilib.h>
155 188
156 InitializeLib(ImageHandle, SystemTable); 189 InitializeLib(ImageHandle, SystemTable);
157 Print(L"Hello, EFI!\n"); 190 Print(L"Hello, EFI!\n");
158 ``` 191 ```
159 --- 192 ---
160 - OSファイルのファイルパスを代入している 193 - uefi_call_wrapperでプロトコルを呼び出している
194
161 ``` 195 ```
162 Status = uefi_call_wrapper(BS->OpenProtocol, 6, ImageHandle, & 196 Status = uefi_call_wrapper(BS->OpenProtocol, 6, ImageHandle, &
163 LoadedImageProtocol,(void**)&LoadedImageParent, 197 LoadedImageProtocol,(void**)&LoadedImageParent,
164 ImageHandle, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL); 198 ImageHandle, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL);
199 ```
200 - エラー文
201 ```
165 if (EFI_ERROR(Status)) { 202 if (EFI_ERROR(Status)) {
166 Print(L"Could not get LoadedImageProtocol handler %r\n", Status); 203 Print(L"Could not get LoadedImageProtocol handler %r\n", Status);
167 return Status; 204 return Status;
168 } 205 }
206 ```
207 ---
208 - xv6.imgのデバイスパスをPathに格納している
209 - このデバイスパスはKernelをLoadするときに使う
210 ```
169 Path = FileDevicePath(LoadedImageParent->DeviceHandle, L"\\xv6.img"); 211 Path = FileDevicePath(LoadedImageParent->DeviceHandle, L"\\xv6.img");
212 ```
213 - エラー文
214 ```
170 if (Path == NULL) { 215 if (Path == NULL) {
171 Print(L"Could not get device path."); 216 Print(L"Could not get device path.");
172 return EFI_INVALID_PARAMETER; 217 return EFI_INVALID_PARAMETER;
173 } 218 }
174 ``` 219 ```
175 --- 220 ---
176 - KernelをLoadしている 221 - ここでデバイスパスを使いKernelをLoadする。
177 ``` 222 - これでKernelがメモリに展開される。
178 Status = uefi_call_wrapper(BS->LoadImage, 6, FALSE, ImageHandle, Path, NULL, 0, &Image); 223 ```
224 Status = uefi_call_wrapper(BS->LoadImage, 6, FALSE, ImageHandle,
225 Path, NULL, 0, &Image);
226 ```
227 - エラー文
228 ```
179 if (EFI_ERROR(Status)) { 229 if (EFI_ERROR(Status)) {
180 Print(L"Could not load %r", Status); 230 Print(L"Could not load %r", Status);
181 FreePool(Path); 231 FreePool(Path);
182 return Status; 232 return Status;
183 } 233 }
184 ``` 234 ```
185 --- 235 ---
186 - ImageをLoadしてKernelを起動している 236 - LoadしたKernelイメージについてLoadedImageProtocolを入手
187 ``` 237 - LoadOptionsに起動オプションを指定し、Kernel コマンドラインを指定
188 Status = uefi_call_wrapper(BS->OpenProtocol, 6, Image, &LoadedImageProtocol, 238 ```
239 Status = uefi_call_wrapper(BS->OpenProtocol, 6,
240 Image, &LoadedImageProtocol,
189 (void**)&LoadedImage, ImageHandle, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL); 241 (void**)&LoadedImage, ImageHandle, NULL, EFI_OPEN_PROTOCOL_GET_PROTOCOL);
190 if (EFI_ERROR(Status)) { 242 if (EFI_ERROR(Status)) {
191 Print(L"Could not get LoadedImageProtocol handler %r\n", Status); 243 Print(L"Could not get LoadedImageProtocol handler %r\n", Status);
192 uefi_call_wrapper(BS->UnloadImage, 1, Image); 244 uefi_call_wrapper(BS->UnloadImage, 1, Image);
193 FreePool(Path); 245 FreePool(Path);
194 return Status; 246 return Status;
195 } 247 }
196 LoadedImage->LoadOptions = Options; 248 LoadedImage->LoadOptions = Options;
197 LoadedImage->LoadOptionsSize = (StrLen(LoadedImage->LoadOptions)+1) * sizeof(CHAR16); 249 LoadedImage->LoadOptionsSize = (StrLen(LoadedImage->LoadOptions)+1) * sizeof(CHAR16);
198 Print(L"Hello,6!\n"); 250 Print(L"Hello,6!\n");
199 251 ```
200 252 ---
253
254 - Loadされたイメージを起動
255 - Kernelが起動する
256 ```
201 Status = uefi_call_wrapper(BS->StartImage, 3, Image, NULL, NULL); 257 Status = uefi_call_wrapper(BS->StartImage, 3, Image, NULL, NULL);
202 uefi_call_wrapper(BS->UnloadImage, 1, Image); 258 uefi_call_wrapper(BS->UnloadImage, 1, Image);
203 FreePool(Path); 259 FreePool(Path);
204 260
205 return EFI_SUCCESS; 261 return EFI_SUCCESS;
206 } 262 }
207 ``` 263 ```
208 --- 264 ---
209 # Boot Loader
210 - UEFIが起動
211 - Boot Managerから起動される
212 - OSのKernelをメモリにLoadさせる
213 - Kernelがinitプロセスを起動
214 - initプロセスがOSのBootプロセスを起動
215 - OSがBootされる
216
217
218 ------
219 <!-- class: slide -->
220 # 大変だったこと 265 # 大変だったこと
221 - EDK2は汎用的だがARMのConfigなどの書き換えが困難 266 - EDK2は汎用的だがARMのConfigなどの書き換えが困難
222 - UEFI開発の情報が少なく、偏りがあった 267 - UEFI開発の情報が少なく、偏りがあった
223 - UEFI独特のプログラムの書き方があった 268 - UEFI独特のプログラムの書き方があった
224 - 低レベルの開発に慣れていなかった 269 - 低レベルの開発に慣れていなかった
225 270
226 --- 271 ---
227 <!-- class: slide -->
228 # 今後の課題 272 # 今後の課題
229 273
230 - Singularity上のqemu-system-armにgdbを接続する 274 - Singularity上のqemu-system-armにgdbを接続する
231 - そのgdbでKernel Loaderをでバックする 275 - そのgdbでKernel Loaderをデバックする
232 - xv6 KernelにUEFIからBootするコードを入れる 276 - xv6 KernelにUEFIからBootするコードを入れる
233 - xv6を書き換えたGearsOSを実装する 277 - xv6を書き換えたGearsOSを実装する
234 - USB Driverを実装し、キーボードやマウスを使える様にする 278 - USB Driverを実装し、キーボードやマウスを使える様にする
235 279
236 280 ---
237 281 # ご清聴ありがとうございました
238 ---
239 <!-- class: slide -->
240 # 研究の成果
241 - UEFIの開発環境をSingularityで作成した
242 - gnu-efiで作成したUEFI ApplicationをQEMU-ARMで動かすことができた
243 - RaspberryPiにUEFIをファームウェアとして設定し、実行することができた
244 - ミニマムなKernel Loaderを調査しARM xv6用に書き直した