Mercurial > hg > Papers > 2021 > okud-thesis
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用に書き直した |