セキュリティキャンプ 応募課題晒し

*これはセキュリティキャンプ2017記事の2番目です。
前:セキュリティキャンプ2017合格しました。
次:セキュリティキャンプ 応募から結果発表まで
セキュリティキャンプでは応募用紙をネットに晒すのが定例のようです。
「いやはや、黒歴史晒し…」なんて先人方のブログには書かれてますが、自分が応募しようとしたとき大いに役に立ちました。ほんと、ありがとうございます。

さて自分が役に立った課題晒しを来年以降の方にもつなげるために自分も書こうと思います。自分がプロじゃないと書く…わけではありませんからね。多分。

その前に、自分よりお強い方が応募された時の課題をブログに書かれているようです。きっとそっちのほうが参考になると思うので、まず最初にそちらを見ていただいて、自分のは参考の参考程度に…ね。

セキュリティキャンプ2017参加者の方々の応募課題

セキュリティ・ネクストキャンプ2021参加者の応募課題

「自分のブログ記事のリンク載せてもいいよ。」というありがたいお方がいらしたら、2017以前でも構わないのでぜひコメント欄でもTwitterでも自分にご連絡ください。

さて、自分のを書く時が来たようです。
原文をそのまま載せているので長いです。
自分が応募したのはx86 OS自作ゼミです。
応募用紙は http://www.ipa.go.jp/files/000059685.pdfです。
では…

■はじめにお読みください
設問は、【設問1 応募者に関する設問】、【共通問題】、【選択問題】で構成されます。なお、共通問題と選択問題の記述回答は、10,000字まで入力が可能です。
※回答の締め切りは、【2017年5月29日(月) 正午】です。再回答を含め、締め切りまでに回答を送信してください。
※このページは60分程度でセッションが切断され、入力内容が無効となります。回答内容は応募者ご自身が適宜保存しながら回答するよう、ご注意ください。

はい、ここ重要です。赤ペンで線を引いておきましょう。
回答は10,000字まで入力が可能とありますが、これは各設問ごとのようです。全体ではないと思うので、くれぐれも全体の文字数カウントして文章を削らないように(ブーメラン)。(余談ですが、自分の応募課題には文章を削る前のVer1と、10,000字にまで削ったVer2があります。以下の回答はVer2です。)
締め切りまでに余裕をもって応募しましょう。自分は五月の中旬に応募しました。

60分程度でセッションが切断され、入力内容が無効となります。
地雷ですね…じっくり書いていって送信押したらセッションタイムアウトでパーなんてことがないように、各自で応募.txtでも作ってそこに書いていきましょう。自分はファイルサーバに置いておいたのでどこでも編集できて便利でした。

共通問題

共-1(1)

あなたが今まで作ってきたものにはどのようなものがありますか?
いくつでもいいので、ありったけ自慢してください。

A.


・HTML,CSS,JavaScript,PHPを用いた簡単なWebページ
最初は自分のPC内でやっていましたが、中学になり無料WebサービスでHTMLとJavaScriptを使って時計を表示するページを作りました。
今考えるとアクセスする価値もないページですが、あの頃の自分にはとても楽しいものでした。
今ではHTML5の仕様を見て最新機能を実装して楽しんだり、コンソールもどきを作ったり、history.pushStateでの移動を作ったり、WordPressを使ってブログを書いています。

・Linux(openSUSE)を使用したサーバ機自作
メールやファイルサーバなど多機能サーバを動かしています。
あまり負荷に強くはありませんが、趣味で動かしています。
更新やセキュリティのためのコード修正は頻繁に行っています。

・Raspberry Piを使用した自宅NASサーバ。
Raspberry Pi 1 Model Bを使って自宅だけのファイルサーバが動いてます。
OSMCを入れてテレビで動画を見れるようにして、その上にSambaやMiniDLNAをいれてます。

・HSPを使った簡易的なFIFOシステムの作成。
FIFOバッファに興味があったので中学生のときに興味本位で作りました。

・ロボスクエアでの「ロボット塾」の自律サッカーロボット
中学生のときに毎週2時間自転車をこいでロボスクエアに行きました。
元WinXPの入っていたノートパソコン(おさがりをCPU換装、RAM増強,SSD換装、Windows8 DSP導入した当時唯一の自分用PC)を背中にからって、一番乗りして、机の上に広げてはArduinoの改造を行っていました。
センサーとArduinoを使った開発は初めて、センサーのしきい値を調節しながら枠から出ないようにするのに苦労しました。
当時はスクラッチブームが起こって、ロボ塾でもスクラッチでプログラミングが行われていたのですが、C言語を生成していることに気づき、
気がつけば講師の先生に「自分はC言語で書きます。」と言って、C言語でIDE付属のリファレンスを読みながら書き込んでました。
ある時、授業でスクラッチの「もし…ならば」を使いすぎて講師の先生や生徒みなIDEが固まり動かなくなる中、C言語で書いてた1人だけコード生成に成功し動作させたということがあり、あれは今でも時々思い出します。

・Win32APIを使った時計アプリ。
中学生のときに書きました。おそらくC言語を使用したGUIアプリである程度完成したものだと思います。C♯でNTP同期型時計アプリを作ったことがありC言語でも作ろうと試しました。

・Win32APIを使ったTwitterクライアント(開発中です)。
・Qtを使ったLinux向けのTwitterクライアント(開発中です)。
上の2つは中学のときに思いつき、現在も開発中のアプリです。SobachaやMevyに刺激されシンプルなクライアントを作りたいと考え、始めました。
自分は元々、C言語でCUIでの細かな研究ごとをすることが多く、大きなプロジェクトを作ったことがありませんでした。
後述の理由でどちらともリポジトリを公開してませんが、Linux版の方は自分で作っていて楽しいくやりがいがあるレベルまで出来ています。

・「OS自作入門」を読んで作った小さな自作OS(開発中です)。
中学生のときにかなり熱中したOSづくりです。書店で「30日でできる! OS自作入門」を購入して、学校の朝読書の時間にバックに入れ持って行って読んでました。
この本との出会いは自分の考え方、いやコンピュータの理解に大きな影響を与えました。どのようにC言語が処理されOSがどのようなアプリの制御を行っているか理解ができました。
当時、自作OSをMNOS(MANA OS)、アプリをMNAS(MANA Application Software)と名付け熱狂し、いろいろな良い思い出も恥ずかしい思い出を作りました。


すんごい、ひどい文章ですね…だれが書いたんでしょうか(お前だめう)。
軽く自分のPC歴を表してます。読んでいただいたそのままです。ありったけ自慢しましょう。普段なら書かないような細かいことも書きましょう。ハイ。

共-1(2)

それをどのように作りましたか?
ソフトウェアの場合には、どんな言語で作ったのか、どんなライブラリを使ったのかなども教えてください。
追加したい機能や改善の案があれば、それも教えてください。

A.


・Webページは基本はjQueryなどを使わずすべて手打ちで書いています。
・Linuxサーバは何回か作り直していて、現在はCore i5のCPUを使って作っています。
・Win32APIを使った時計アプリは「猫でもわかるWindowsプログラミング」を参考にシングルスレッドモード・マルチスレッドモードを搭載して作りました。
・Win32APIでのTwitterクライアントはC言語で書かれています。ツイートのストリーム表示に対応してましたが、C++で作り直すため現在再設計中です。画像の表示やスクロールバーの実装を行いたいです。OAuth 1.0の実装に1年以上かかっていて画面の開発が進んでいませんでした。HMAC-SHA1のSHA1はSHA1cc(https://ja.osdn.net/projects/sha1cc/)を、JSONの解析にJansson(http://www.digip.org/jansson/)を使用させてもらってます。
・QtでのLinux用TwitterクライアントはLinux用のTwiterクライアントが少なく、自分でWindows版を作っているのでコードを流用できないかと考え、C++で始めました。
Qt オープンソース版を使用していて、ユーザストリームによる自動更新や画像表示や動画再生リツイートなどWindows版より開発が進んでいます。Qtは非常に精錬されたライブラリだと思いました。
今後の実装としてはリストの表示や通知表示やユーザ詳細表示を行いたいです。
・自作OSは川合秀実さんの「OS自作入門」という本を中学のときに読んで本を読みながら作りました。
当時はまだやんちゃで、「x64に対応するんだ。」「ACPIに対応するんだ。」と大きなことばかり考え熱中してましたが、様々な開発と学校の課題に終われ最近開発はかなりできてないです。
現在はRustで、小さくてもOSを作り直してみたいなと思っています。ACPIやx64ももちろん実装したいですがソースの可読性、新技術Rustでの実装、何より楽しく作れるようにしたいです。


共1-1(1)と対応させるといいと思います。

Webページは基本はjQueryなどを使わずすべて手打ちで書いています。

そうなんですよ…自作ページはすべてmain.jsなどをフルスクラッチで書いてます。この記事も「テキストモード」でガンガンHTMLタグ付けてます。

共-1(3)

開発記のブログ、スライドなどの資料があれば、それも教えてください。コンテストなどに出品したことがあ
れば、それも教えてください。

A.


開発以外のことも書いていますが、( https://pg-mana.net/blog/ )があります。自分の備忘録として書いてます。


ここ、ブログのアドレスを載せるのか非常に悩みました。頓珍漢なことしか書いてない。最終的に載せましたが、意外と勇気がいる項目です。

共-1(4)

Twitterアカウント、Github、ブログをお持ちでしたら、アカウント名、URL等を記載してください。

A.


Twiiter: https://twitter.com/PG_MANA_/
個人ページ: https://pg-mana.net/
OS Wiki https://mnas.info/oswiki (中学のときに作りました。osaskのページに比べ情報量は非常に少ないですが、昔編集してくださった方がいてあのときは非常に嬉しかったです。申し訳ないことに一度データがサーバ移行で消えてしまってます。)


さあ晒せ、自分のTwitterも個人ページもWikiも。もしかしたら課題用紙に書ききれなかったことももしかしたら読み取ってもらえるかもしれません。自分はBitbucketも持ってましたが、ほとんどリポジトリ非公開だったので載せませんでした。

共-2(1)

あなたが経験した中で印象に残っている技術的な壁はなんでしょうか?
(例えば、C言語プログラムを複数ファイルに分割する方法など)

A.


・C言語とC++での前方宣言の仕方、すべきでないケースの判別。
C言語でのヘッダファイルを分割した際、定義した構造体やクラスを別のヘッダで使用する時、どうすればいいかで悩んでました。
最初はMain.hなどを用意してインクルードガードを使いMain.hと他のファイルを相互インクルードするという技法をとってましたが、
構造がわかりにくくどうすればいいかずっと悩んでました。
現在は最低限のヘッダファイルを自作ヘッダファイルでインクルードして多く前方宣言をするようにしていますが未だに答えは出ていません。

・「苦しんで覚えるC言語」でのIDEで作ったソフトが終了際「続行するには何かキーを押してください…」とでる。
これは技術的な壁より当時の技術不足であるんですが印象に深く残ってます。
小学生の時オフラインPCを渡された自分はインターネットにつなぐこともできず、自分の撮った写真の整理を行うだけでした。
小学か中学のある時県立図書館で「苦しんで覚えるC言語」を読み(ここらへんは記憶が曖昧で別の本を前に読んでたかもしれません…)、どうにかしてEasyIDEをPCに入れて、プログラミングを行ってました。
英語も読めない自分に日本語で全て指示してくれる、あのIDEにはほんとに感謝してます。そのIDEに気を利かせた機能としてプログラム終了後pauseを実行してくれるものがありました。
これをなくすのに非常に苦労しました。「この機能はどのコードで実現されてるんだ。」と悩んだのを覚えてます。printfとreturnのあと、一体何が起きてるのか首を傾げてました。
結局プロジェクトフォルダにある実行ファイルを直接起動すれば良いことに気がついたのですが…

・OS自作時の情報収集
中学でろくに英語も読めない中Intel x86_64のページを漁り、Google翻訳片手に読んでましたが理解が追いつきませんでした。
結局これが原因でOS自作が停滞することとなりました。


嗚呼、懐かしい。

そのIDEに気を利かせた機能としてプログラム終了後pauseを実行してくれるものがありました。

いやー、小学生の頭にはexeが何かわかってなかったですね。なにあれ、動画ファイル?ってな感じで。
それにしても今の小学生はすごいですね。スクラッチで簡単にGUIができて画面の猫が動いて、飛び跳ねて、壁にぶつかって。
自分のころなんてコマンドプロンプトで、


足し算 ?5
5+? 4
5+4=9
続行するには何かキーを押してください . . .


って動いて、自分が飛び跳ねたり壁に当たったりして騒いでましたよ。いやー懐かしい。

共-2(2)

また、その壁を乗り越えるためにとった解決法を具体的に教えてください。
(例えば、知人に勧められた「○○」という書籍を読んだなど)

A.


・試してみてだめなら本とインターネットで自分で探す
自分の周りにプログラミング関係の人はいませんでした。元々PCの操作自体も独学です。親に聞いても教えてくれませんし、インターネットにつながってなかった時期もありました。
しかし当時、親が知り合いからいらないノートパソコンをもらってきてくれ、「自由に使っていいからやるならこれでしなさい」と言われ使っていたのが今に響いています。
親に「壊れたらそれはそれでいいんじゃない。」といつも返され恐る恐るボタンを押し安堵するの繰り返しから始まりました。インターネットに繋がっていないのでトラブルを起こすこともありませんでした。
上のpause問題の解決もやたらめったら実行ファイルを起動してたら解決した気がします。
インターネットが開通したあと、本・Webを漁りPCの前で唸り、うまく行ったら大声を上げ喜び、親からうるさいと怒られてました。
今でもその方法はとっています。

・他人のコードを読む
上と似た方法ですがGitHubやブラウザの開発者モードなどを見ながら、他人はこのように実装しているのかと学びました。
書籍とインターネットには実に多くのコードも乗っていて、人によって書き方が違い2つを見比べながら自分のコードを書きます。
言語習得でもそうで、C言語の知識を応用して、例を見ながら見様見真似で始めます。
小・中と今までプログラミングに詳しい方はいなかったので、ネットの間違った書き方もそのまま身についてるかもしれず、不安でもありますが壁を乗り越えるには有効だと思っています。


生まれてこの方誰にもプログラミングを習ったことはありません。だから全然プロじゃないです。
つまり、こんな自分が受かったんだからきっとプロじゃなくても行けるはずです。
C言語の文法なんて全部我流ですよ。「我流の前にまず師を見習え。」なんてよく言いますが、師がいないんですよ。Not foundですよ。404ですよ。

言語習得でもそうで、C言語の知識を応用して、例を見ながら見様見真似で始めます。

なんてこと言いながら、他の言語も我流の応用だから我流です。ハチャメチャな文法できっとこれからダメ出しを受けるんだろう…しっかり見習わなければ。

共-2(3)

その壁を今経験しているであろう初心者にアドバイスをするとしたら、あなたはどんなアドバイスをします
か?

A.


・まずは真似から
今、パクリ疑惑、著作権問題がいろいろ言われすべてフルスクラッチで書かないといけないという感じがしてますが、自分ですべてをひらめくことは無理だと思ってます。
もちろん全部コピーしてそれでおしまいというわけではありませんが、そこから改良を加えるのは構わないと思います。大体、書いているうちにコピーした部分を書き換えたくなってきます。
C言語の前方宣言問題も多くの書き方を真似して、比べたうえでこの書き方になっています。
今でもライセンスを詳しく理解できてませんが、ライセンスに恐れて、すべて自分で実装していた頃がありました。Windows版TwitterクライアントのOAuth実装がそうです。SHA計算Base64エンコード、URLエンコードをすべて書こうとしてました。
結局ツイートに成功するのに一年以上かけうつのが楽しくなくなっていました。「OS自作入門」の本でもあったように難しいところはとりあえず真似て飛ばし、あとから戻ってくるというのは良いと思います。

・謙遜せずに読んでみる。
昔、OKWaveで質問したときに( https://okwave.jp/qa/q8833295.html )、「Googleで出てくる検索結果に不満か」と言われました。
stackoverflowのページは「英語で難しそう。」とスルーしてました。しかしよくよく見ると答えが書いてあります。あの時のokwaveの回答者の方には感謝してます。
以来、英語のページもチェックするようになりました。今でも英語力がないのでコードを見て雰囲気で見てます。
OSの自作での英語のページをあまりチェックしなかったのは良かったとは言えません。それを踏まえ初心者に教えたいです。
意外と答えはそこにあると思います。もう一度探して、とりあえず読んでみよう。そう言いたいです。


はい、そのままです。自分の経験したことの感想をアドバイス調で書いてみました。

共-3(1)

あなたが今年のセキュリティ・キャンプで受講したいと思っている講義は何ですか?(複数可)
そこで、どのようなことを学びたいですか?なぜそれを学びたいのですか?

A.


・言語やOSを自作しよう。
中学のときに熱中したあのOSをコンパクトでもいいから学び、作り直したいです。
詳しくは選択問題で書きたいと思います。
これが一番興味があります。

・ブラウザの脆弱性とそのインパクト
自身でもWebページを作っており、攻撃の的、踏み台にならないためになるにはどうすればいいかを学びたいからです。
また、最近のJanetterのXSS脆弱性のように灯台下暗しのこともあるかもしれないから、基本から学びたいからです。

・組み込みLinuxクロス開発スタートアップ
普段の使用でもLinuxを好む自分は(この文章も多くはLinuxで書いています。)Linuxの開発に興味があるからです。
この講義ではgccの移植方法、シェルの構築が学べるので、スマホのAndroidのベース部分の開発でも役立てることができるのではないかと思ってます。
またLinuxの構成についても学べることがあるのではないかと思います。
シリコンリナックス社さんのDD for Windowsにはお世話になってるので、お話を聞いてみたいと思ったからです。

・信じて送り出した家庭用ルータがNetBSDにドハマリしてloginプロンプトを返してくるようになるわけがない
NetBSDはBSDシリーズで使うOSで、Linuxの使い勝手と違いいつも悩んでます。組み込みLinuxとの違い、NetBSDはどういう部分が得意なのかが知りたいからです。
またどのような分野でも使用が好まれるか聞いてみたいからです。

・暗号運用技術
最近はChaCha20-Poly1305など様々な暗号化方法がありますが、漠然と理解していて、FSの技術的理屈、各方法にどういう特徴があるかよくわかっていません。
この講義でそのことを理解したいと思います。また暗号の突破を実際にこの目で見たいと思うからです。


集中コースを選んでるのに何で、選択コースにも言及してるんでしょうか。なぜでしょう。…。
もう、集中コース落ちても選択コースで受かりたいという気持ちが前面に出てます。受けれることなら全講座受けたいです。
選択コースの選考にはおそらく入ってないので出しゃばったことは言えませんが、

  • 講座名を挙げて書く。
  • どういう点に興味があるのか書く。
  • ちょっとホットでナウなことを書く。

のが良いかなと思います。あくまで個人の感想です。

共-3(2)

あなたがセキュリティ・キャンプでやりたいことは何ですか? 身につけたいものは何ですか?(複数可)
自由に答えてください。

A.


自分はプログラミングに詳しいお方をTwitterやネットで見ることしかなく、講演会でお話を聞く程度でした。
このキャンプは同年代のお方が集まるので、どういう趣味があるのか、自分とどう違う考えを持つのか、交流してみたいと思っています。
それと同じくらい期待していることは、現場で働いておられる講師の方々のコーティング、指導を受け自分に自信をつけることです。
TwitterクライアントのリポジトリはBitbucketもありますが、非公開です。コードの作りが自分でも自信がなく、上の文章で偉そうなことを書きましたが、初心者同然のコードしかかけてないかもしれません。
しかしOSSには興味がありOSCにも行ってます。この活動を通し、自分はどのくらいのレベルなのか、レベルアップするにはどうすればいいかを学び、リポジトリを胸を張ってOSSとして公開できるようになりたいという思いもあります。
また身近な問題となりつつあるセキュリティ問題をどう対処し、どう身を守ればいいか、学びたいです。趣味でサーバを立ててる自分はハッカーの格好の餌食となってるのかもしれません。自分の周りのことはもちろん、これはやってはいけないと人に指示できるような人間になりたいです。
そもそも川合秀実さんにこのキャンプを教えてもらいました( http://osecpu.osask.jp/wiki/?PG_MANA のコメント欄)。
あのころの自分は無邪気でしたが、このキャンプは憧れでした。今、参加できる状況となったのでOS自作を再びチャレンジしたいと考えています。
また、川合秀実さんにあえましたら(言語自作ゼミの講師になられたようなのでOS自作では講義は受けられませんが)、あのときの無邪気な発言の謝罪というか、挨拶と詳しくお話できたらなと思っています。
また他の講師の方々にも学生時代の勉強や過ごし方など普段聞けないことをじっくりお話できたらなと思います。

このキャンプでセキュリティや効率的なコーティングなどを議論し学び、自分のサーバや生活に反映することと、自信をつけOSSのコード改善・セキュリティ修正の貢献ができるようになりたいです。


ここは全力を注ぎました。自分の思いをぶちまけました。自分の技術を伸ばしたい、仲間を探したい。

現場で働いておられる講師の方々のコーティング、指導を受け自分に自信をつけることです。

これ、すごく楽しみです。やっと「師」が見つかったので。
ここはじっくり考えてたくさん列挙したほうが良いと思います。
自分は10,000字制限勘違い問題で大幅に削ったので、来年以降応募される方はもっと書いたほうが良いです。

選択問題

選択問題セレクト. 参加を希望するコース(集中コースはトラックまで)を選択してください。
書類審査に合格した場合、この設問で回答したコース(集中コースはトラックまで)に必ずご参加いただきます。 [必須]

集中コースX(言語やOSを自作しよう)- 選-集中コースX-セレクト
あなたは以下のゼミのうち、どのゼミを希望しますか?※書類審査に合格した場合、この設問で回答したゼミに必ずご参加いただきます。
x86 OS自作ゼミ

ここ、しっかりと考えて選びましょう。選択コースを選んだ方や別の集中コースを選ぶ方は以下は参考にならないと思うので別の記事を参考にしてください。

選-X-x(1)

OSを自作するなら何言語で書こうと思いますか? なぜその言語で書こうと思うのですか?

A.


Rustで書きたいと思います。中学のときはC言語でガリガリ書いていましたが、最近RustでOSを作るというQiitaで見かけ、Rustに興味を持ったからです。
GoやSwiftなど様々な言語が出てきていますが、RustはOSに依存しないコードの生成が可能で、また今回自作OSに違ったアプローチとして挑戦してみたいと感じてるからです。


これはちょっとインパクトがあるものをと思って考えました。RustはC言語に代わるものとして注目を集めているそうなのでこれでOSをかければOS自作がまた変わったものになると思います。あと脱・C言語(できないと思う)。
さて、どこまで行けるでしょうか…

選-X-x(2)

このゼミの詳しい説明を書いたページ http://uchan.hateblo.jp/entry/2017/03/31/075653を読み、このゼミで取り組みたいテーマを考えて書いてください。そのテーマを選んだ理由も教えてください。(キャンプ本番で
テーマが変わってしまっても大丈夫です)

A.


テーマとしては上に書いたRustでOSを書いていくというテーマにしていきたいと思います。また機能面として周辺デバイスのサポートに力を入れたいと思います。
Rustはセキュリティに力を入れている言語でネットワーク関係で使われているようです。この特徴を活かしセキュアに周辺デバイスにアクセスし安定した動作が望めるように設計したいと思っています。
グラフィック関係やシェルシステムにも興味はありますが、中学生のときにあれこれ詰め込もうとして手詰まりになったので、ここはやりたいことを絞り、今回のテーマにしました。
APIC,ACPI関係の制御がならないとUSBデバイスなどが活用できなさそうだと考えているので、ここも実装できたらなと思っています。


RustでOSを書くのはおそらく事例が少なく、どこまで行けるか未知のため、少しテーマを抑えCUIの実装まで行けるようにと考えました。後からX.org移植してもいいですしね。説明のページはよく読みましょう。

選-X-x(3)-セレクト

右の中から1つを選択して回答してください。
選-X-x(3)-A 選-X-x(3)-B 選-X-x(3)-C
A問題を選択しました。

選-X-x(3)-A

i386が持つメモリ管理機能であるセグメンテーションとページングについて説明してください。また、現代
のOSではセグメンテーションは使われていませんが、その理由を考察してください。さらに、現代のOSにお
けるページングの用途を説明してください。

A.


まずセグメンテーションとは「はりぼてOS」でも実装されたメモリ管理方法です。メモリをある大きさで小分けにしてこれらを各ソフトウェアに割り当てます。
こうすることで各ソフトウェアがメモリを奪い合ったり、書き込む場所が重なり誤動作することを防ぐことができます。
GDTRというレジスタにGDTテーブルの開始アドレスなどを記述した構造体のアドレスをセットすることで設定します。
この時GDTテーブルのTypeにメモリに書き込みや読み取り・実行が可能か、S Flagにシステムセグメントかコード ・データセグメントか、DPLに特権レベルを適切に設定しておくことで、
データを実行することや実行データに書き込んだりOSに悪意のあるコードを書き込んだりすることを防ぐことができます。
またセグメントがメモリ上に存在するかを設定できるので、存在しないことにしておき補助記憶装置に退避(スワップアウト)して、必要時にOSに例外として割り込みが入り適宜メモリ上に読み込むことで(スワップイン)、少ないメモリでも有効活用することができます。
しかしこの方法ではメモリの開放・取得を繰り返すと、連続した空きメモリが少なくなり、使用中のメモリ領域の隙間に小さな空き地が多くできてしまい、大量にメモリを確保しようとした時、メモリを詰め直すなどの作業しないと確保できません。
実際自作OSでコンソールを多く出したり、アプリを多重にだしてどんどこ遊びまくっていたところ、固まり動かなくなりました。自分のメモリ管理が不十分でもありましたが、空き地の整理は難しいように思えます。
この状況を打開するためページングが生まれました。
ページングは仮想的にアプリごとに大きなメモリ領域を与えて、実際のアクセス時に設定内容にCPU内のMMUやDDR Controllerを通し実際のメモリアドレスに変換します。
仮想的なメモリ領域はページという4KB固定の区画にわけられていて、ここでは、サイズが自由に決められるセグメンテーションと大きく違います。
各ページは仮想的なメモリ領域では並んでいますが、実際のメモリ領域では並んでいる必要はなく、使用メモリ領域と使用メモリ領域の隙間からかき集めることも、補助記憶装置上においておいても構わないようです。
メモリ上にないページはアクセス時CPUが例外で割り込みを起こすのでOSがページインします。
ページテーブルエントリという構造体を1024個集めたページテーブルという配列のアドレスを格納したページディレクトリエントリという構造体の集まりのアドレスをCR3レジスタと各キャッシュコントローラに書き込みCR0レジスタのPGフラグを立てることで動作します。ただしセグメンテーションの設定も必要でLinuxの場合はメモリ全体を一つのセグメントとしているようです。
32bitOSでページ一つ4KB x 1024 x 1024で、一つのアプリに4GBの仮想的なメモリ領域を与えられます。
またセグメンテーションと同じようにページディレクトリエントリに用途やアクセス権を設定しておくことで意図しない動作が防げるようです。ページテーブルエントリにも同じ設定がありますが、両方設定しないといけないかは見つからずわかりませんでした。

現代のOSでセグメンテーションが使用されないのは、メモリ管理でセグメンテーションで難があるからだと考察します。例えばブラウザなど大量にメモリを消費するアプリで、滅多にアクセスしない部分があったとしてもセグメンテーションはページアウトできません。一方ページングならば4KB単位からページアウト可能なため頻繁に使うところだけを残しページアウトして他のアプリを置けます。またブラウザのメモリデータをページアウトさせる場合セグメンテーション方式ではすべてコピーしないといけないので時間がかかります。
メモリの取得開放を繰り返した場合もセグメンテーションでは巨大なメモリ領域の取得が難しくなるため定期的に整理し直す必要がありますが、ページングは不要です。
このようなことからページングのほうが効率よくメモリ管理ができ高速化が期待できるので現代のOSの主流となりセグメンテーションは使われてないと思います。

現代のOSでのページングの用途はメモリ管理の効率化が主のようです。近い将来高速で安定したネットワーク環境ができれば、ページをネットでやり取りして作業を分担できるのではないかと想像します。自作OSであればそれも実装できるのではないでしょうか。
ページングでのページアウトではUSBメモリを活用したり並行にHDDに書き込むなど様々な工夫があるようです。またインターネットで検索するとOS上だけではなくC++アプリやJavaScriptアプリでもメモリを自ら管理するためページングに似たシステムも作られているようです。


ここらへんで技術的な話が出てきます。上の文章見て、わけがわからないよ。ってなった人は合格する奇跡を信じて魔法…ゲフンゲフン。
わからくても調べてみましょう。ネットにも書籍にもないことを聞かれることはないと思います。要するに問題解決能力を問われているのだと思います。問題解決能力…そんなのないや。
中学のOS自作経験(ちょこっと)が役に立って比較的理解で行きました。あってるかは知りませんが。

選-X-x(4)

その他に自己アピールしたい事があれば、自由に書いてください。何を書いても減点されることはありません。

A.


選択問題を読み返して今ふと思いましたが、非常に長くなってしまい、また、どこかから文章を持ってきた感じもしてなかなかドキドキします。
参考にさせてもらったのは「30日でできる! OS自作入門」と「0から作るOS開発 ページングその1 ページとPTEとPDE」( http://softwaretechnique.jp/OS_Development/kernel_development07.html )です。
今回選択問題を解くにあたってページングの勉強になりました。理解が間違ってるかもしれませんが自分なりに納得しています。
OS自作というのは本を読むと簡単に行けそうでもLinuxやBSDのような領域に達するのは時間と多くの協力が必要で、難しそうに思えます。
しかしOSの自作や今回の選択問題を通してコンピュータの仕組みに触れることができました。このことはとてもいいことだと思っています。
話は変わりますが、一昨年、OSC福岡にて自分はFirefox OSのブースの前でかなり話をしていました。HTML関連技術だけでアプリケーションを作ろうという理念にはかなり興味を持ちました。
Web技術は今の所クロスプラットフォームで成功している技術のトップではないか。それを更に発展させるのはすごい。そう思いながら、家に帰りエミュレータであれやこれやいじりました。
プロジェクトがほぼ終わってしまったのは非常に残念ですが、いつか再び盛り上がって欲しいと思います。
その時OSCでの方々の話を聞いて「世の中には自分より上の方がたくさんいらっしゃる。」ということを実感しました。Raspberry Piのブースの方の話はついていくだけで精一杯で話を発展できませんでした。
そのような体験をもっと濃くできるのではないかと思いこのキャンプへエントリーしています。
そして、この課題のことが一日中、頭の中に渦巻いていて、帰ってきては打ち込むの繰り返しでした。
結果とんでもなくまとまりのない文章になっていますが、ただただ思ったことを書いているのと国語力がないのでまとめきれないのが原因です…
「こんな文章書いて途中で投げられたらどうしよう」とブルブルしながら書いてます。しかしどれも削るのが惜しいのでほとんどそのままです。
こんな課題回答で、自己アピールになっているかどうかわかりませんが、どうかよろしくお願いします。


ここは自分の体験談などを書きました。最後の自己アピールです。精一杯書きました。

「こんな文章書いて途中で投げられたらどうしよう」とブルブルしながら書いてます。しかしどれも削るのが惜しいのでほとんどそのままです。

書き終わった後もブルブルしてました。10,000字になるように泣く泣く削りましたが、受かってよかったです。


以上です。参考になったでしょうか。文字数は全体で10,000字未満ですが受かりました。
「4万字もかけないや…」「サーバー10台も動かしてないし無理だ…」「プログラミング教えてもらったことないし…」って人にも是非来年応募してもらいたいです。

投稿者: PG_MANA

支離滅裂な自称プログラマー。 C,C++,Rust,JavaScript,PHP,HTML,CSS,OS自作,openSUSE,Arch,旅行 なんか色々してる人 #seccamp 17 19 20 23 #OtakuAssembly