投稿

2014の投稿を表示しています

自作OSでのプロセス実装について (2) ~初めてのユーザプロセス~

イメージ
この投稿は Aizu Advent Calendar 2014 の 7 日目の記事です。 前の人 @masaponto 次の人 @MiZuKi_Sonoko また、 自作OS Advent Calendar 2014 の 7日目の記事でもあります。 自作OSでのプロセス実装について (1) ~初めてのユーザプロセス~ の続きです。 前回の内容 プロセスとは? x86リングプロテクション(ユーザモードとカーネルモード) マルチタスク 割り込み コンテキストスイッチ を一気に説明しました。 正直、多少知識が無いとわからないよなあって感じになっているのでその点は反省しております。 今回は コンテキストスイッチの実装 ユーザプロセス起動 を見て行きたいと思います。 前回はタイマ割り込みによってコンテキストスイッチが起きる、というところで終わったと思います。 そこの流れが大事ですので再掲します。 タイマ割り込み発生 ↓ 実行中プロセスは割り込まれる (中断される) ↓ カーネルモード突入 ↓ 今のカーネルモードスタックへ 今の実行コンテキストを保存 (CPUのレジスタとか) ↓ 次のプロセスを選ぶ ↓ 次のカーネルモードスタックから 次の実行コンテキスト復元 ↓ ユーザモードに復帰 はい、こんな感じです。 (※カーネルスタックではわかりづらいので カーネルモードスタック に変更します。) では、早速ですがもぷりんOSのコンテキストスイッチ実装を見て行きましょう。 この部分は主にLinuxの実装を真似ています。 と言っても、x86上で同じことをやろうとしたら大体こうなると思います。。。 リポジトリはこちら mopp/Axel 上記の流れに沿ってコードを掲載していきます。 まずは、一番はじめに呼ばれる割り込みコードを見てみましょう。 以下のこれは、割り込みエントリ関数で、タイマー割り込み以外のキーボード割り込みや一般保護例外などでも呼ばれる部分です。 上記コードは src/interrupt_asm.asm にあります。 ただし、Gistに貼った方は見やすさのためにマクロなど全て展開済みです。

自作OSでのプロセス実装について (1) ~初めてのユーザプロセス~

イメージ
この投稿は Aizu Advent Calendar 2014 の 5 日目の記事です。 前の人 @i__yahoo 次の人 @masaponto また、 自作OS Advent Calendar 2014  の 5日目の記事でもあります。 Aizuの方に登録してたのですが、ネタ的に自作OSだし、自作OSカレンダーの方は空きが激しいので、まとめて登録してしまいました。 今回は自作OS Advent Calendar的に 先日の記事 の続きみたいなものです。 また、 ALT で話した内容をもっとわかりやすく書いたものです。( 次回のALT もあるらしいので興味のある人はぜひに) この記事では、もぷりんOSの 現在の実装 における観点から話を進めていきますので、LinuxなどのOSとは異なることもあると思いますので注意してください。 特にもぷりんOSは権限周りなどがまだまだですし、私もよくわかって無いことが多いです。それだと危なくない?みたいなことがめっちゃ有ります(つまり、吹けば飛ぶ) それに、趣味で楽しいからやっていることです。(だからといってセキュリティを軽視しているわけではないです。安心安全もぷりんOSを目指しますよ) なので、あんまり細かいことは言わず、こんな風に書いてれば動くんだふーん程度の気持ちでお願いしたいです。 そして、何より自作OSを作ってる人、少し興味を持ってる人が見て、こんなの俺でもできるじゃねーかと感じて、自作OS作成してくれればなあと思いつつ書いていきます。 さてさて、本題に入るその前に、通常話しているプロセスについていくつか事前知識として、さらっと話そうと思います。 詳しいことは プロセス-Wikipedia にどうぞ 大雑把に言うと、 プロセスは実行されているあるプログラムのこと です。 もぷりんOSは一応?UNIX系のOSなので、ここでいうプロセスはUNIX系のプロセスを指しています。UNIX系プロセスは親子関係を持ちます。この親子関係というのはデータ構造で言うところの木構造で、大体こんな感じです。 数字はプロセスID(pid)を表します。 プロセス0がルートプロセス、その子プロセスがプロセス1 この時、プロセス1から見れば親はプロセス0になります。 当たり前ですが、プロセ

[自作OS Advent Calendar 2014] 自作OSの紹介的なの

イメージ
この記事は 「自作OS Advent Calendar 2014」 3日目の記事として書かれました。 まずはじめに、上記リンクを見ていただければ直ぐにわかりますが、自分が主催にもかかわらず1,2日が空きで書いてないです。これについて申し訳ありません。(言い訳ですが多忙につき書いていられませんでした)。 さて、とりあえず、何でもいいから書かないと始まらないということで、3日目として、現在開発中の自作OSの紹介的な話をしたいと思います。 開発リポジトリはこれ https://github.com/mopp/Axel 名前は" Axel "と書いて、" あくせる "と呼んでいます。 通称"もぷりんOS"です。(余談だけど、Mopris(もぷりす)って案もあった) イメージカラーはメタリックレッドです。この時点で、名前の由来がわかる人にはわかるかもしれませんね。 きっかけとしては、元々Linuxとかの中身が気になっていたということと、自作OS入門を読んで作って見たいなーと思っていたからです。 あと、セキュキャンに応募して2回落とされているので、それも開発モチベーションとして一つあります。来年も応募します(来年で最後なので行きたいんですよかなり) 具体的な話に移ります。 この記事を書いている時点のOSスペックは以下です。 モノリシックカーネル ソースコード長さ 8000 行 ソースコード容量 250 KB 実行ファイル容量 105 KB 対応アーキテクチャ x86_32 最低動作メモリ 12MB 使用言語 C, nasm 参考OS Linux, FreeBSD, Unix v6, xv6, HariboteOS 実装されている機能は以下です。 物理メモリ管理 (BuddySystem) x86ページング 仮想メモリ管理 (Two Level Segregated Fit Allocator) 割り込み PS/2マウス、キーボード VBEグラフィック ATAデバイスアクセス FAT32/16 ファイルシステム ACPI(シャットダウンのみ) システムコール ELF形式ロード (静的のみ) プロセス管理 (fork, e

セキュリティ・ミニキャンプ in 東北 2014 に行ってきた話

タイトルの通り、9/13, 9/14に会津で行われたミニキャンプに参加しました。 その感想を書いていきたいと思います。 事前課題はオレオレSNSの脆弱性探しでした。 セキュリティ・ミニキャンプin東北は会津大学で!準備開始しています! #spcamp #seccamp pic.twitter.com/jZ1yzUM8DO — security_camp (@security_camp) September 13, 2014 まず1日目ですが、各講師の講義を受けました。 中でも園田講師の「情報セキュリティの今そこにある危機」が印象に残っています。 サービス提供者の求める情報とユーザの持つ情報のどこまでが個人情報でどこからが個人情報ではないのか、また、単体では意味をなさない(個人情報足り得ない)ものでも、データマイニング的に複合化すれば様々なことを知ることが出来る。 なので、最近のスマートフォンに始まり、ウェアラブルデバイス(なんとかウォッチですね※妖怪ではない)が持つ情報などを駆使して、抽象的な人格コピーが可能になる日も近いのでは?事前に集積したデータから、その人が何かを感じて、思考となる前に機会側で推測することが出来るのでは?といった意見が大変興味深かったです。 続いて宮本講師による「情報セキュリティ人材は本当に不足しているのか?」でした。 この講義によると、2004年に登場したウィルスが未だに大量に報告されている、というものがあり、少々意外に思いました。ウィルス意外にも古い脆弱性はまだまだ残っているそうです。ただそういったものはアップデートや最新版を使えば何も問題無いケースが多いとのこと。 そして、情報セキュリティ人材は数万人規模で足りないらしいです。 情報セキュリティに携わっている人でも力不足な人も結構いるとか。 その後、少しの休憩を挟み、西村講師(イケメンだった)による「スマートフォンのセキュリティ概論」と「HTML5のセキュリティ」でした。 前者は「マルウェア」「リスクウェア」「脆弱性のあるアプリ」の3つについて詳しくお話しいただきました。 後者はHTML5に段々と移行していく中で、脆弱性を作りこまないようにするにはどうするかなど具体例も多くあってわかりやすかったと思います。 特に動的ページ

2014版 VAIO Pro (SVP1322A1J) で Arch Linux と Windows 8.1 を デュアルブートする

イメージ
VAIO Pro 13インチを買いました。 こいつです 初めてのWindows8.1です。 そして、ひとしきり楽しんだ後はやっぱりLinuxを入れたいですね。 そんなときはArch Linuxがおすすめです。 しかし、VAIO ProにArch、もといLinuxを入れるのはなかなか手こずるようで 自分も苦労しました。 なので、メモ書きとして残しておきます。 さて、まずはWindowsを普通に起動してパーティションの縮小です。 自分はWindows 100GB, Arch 100GBくらいにしました。 この時に、 高速スタートアップを無効 にしておきます。 これをしておかないとインストールはできますがインストール後に一度Windowsを起動するとArchもWindowsも起動できなくなってしまいます。 場所は、 コントロールパネル→電源オプション→カバーを閉じた時の動作の選択(左側)→シャットダウン設定 の中にあります。 ここでチェックボックスのチェックを外しておきましょう。 基本的には Installation Guide (日本語) を参考に進めていきます。 インストール用のUSBインストールディスクを作ります。 isoからddコマンドとかで普通に作れば問題ないです。 そして、BIOS設定で AT Support System: disabled Secure Boot: disabled External Media: enabled に変更します。 更にブート順序をExternal Mediaを一番上にします。 これらを保存してUSBを挿した状態で起動するとUSBからブートすることができます。 この時に稲妻マークのUSBポートだとうまくできないとかなんとか。 さて、ここで大事なポイントがありまして、ブートローダのオプションとして 一瞬の選択画面で"e"を押して、 libata.force = noncq を追加してください。 これがないとSSDがエラーを起こしてすごく遅くなります。 起動後に縮小してできたあまりのエリアをgdiskで切り分けましょう。 gdiskはfdiskのGPT版らしいです。 そのあと、 % mkfs.ext4 /dev/sdaX

lightline.vimのバッファ履歴表示コンポーネントをかいた

イメージ
この記事は Vim Advent Calendar 2013 103日目の記事になります。 今回はlightline.vimのコンポーネントを作ってみました。 基本的な部分については作者様直々に記事を執筆していらっしゃるのでそちらを参考にしてください。 作者が教える! lightline.vimの設定方法! ~ 初級編 - コンポーネントを作ってみよう 普段Vimを使っていてバッファ一覧が常に見える位置にあるのは何かと便利です。 ちらっと見てから、直ぐに:b2とかで移動できますからね。 ですが、あまり場所を取ってほしくはありません。 それに、ただのバッファ一覧ではなくてVimFilerとかUniteとかのバッファは除外してほしい。 しかも、開いた順に表示したい。 そこでlightline.vimのコンポーネントを書きました。 ぜひ活用してやってください。 また、バグがあれば気軽に教えて下さい。

Vim で .c/.cpp と.h/.hpp とかを相互に開くPluginをつくったじゃんよ

イメージ
この記事は  Vim Advent Calendar 2013  94日目の記事になります。 はい、今回は自作Pluginの紹介です。 mopp/next-alter.vim 自分は、ねくすとおるたーと呼んでいます。 このプラギンは対になるファイルをササッと開くためのプラギンです。 同様なプラギンはあったのですがうまく動かなかったので作りました。 具体的に説明をしていきましょう。 みなさんも実装ファイルをいじっている時にヘッダを開きたくなるのはよくあるはずです。 例えば、 "hoge.c" をエディット中にそれと対を成す "hoge.h" を一瞬で開くことができます。 動作例は以下です。 このプラギンは以下のコマンドとマッピングの2つを提供します。 : OpenNAlter < Plug >( next - alter - open ) また、開くときに縦に開きたいとか横に開きたいとか、その日の気分によって変わります。 そんな時のために、コマンドはオプションで開き方を変更することができます。 便利ですねー(かなり) マッピングでは、以下の変数に設定しておくことで動作を変更可能です let g :next_alter#open_option = 'vertical topleft' 詳しくはgithubのREADME.mdを見てください。 さて、次はどんなプラギンをつくろうか…

君の知らないVimレジスター

この記事は  Vim Advent Calendar 2013  90日目の記事になります。 どうも、一足早い春休みに突入したもぷりです。 しかし春と言っても、まだまだ、寒いですねー。 先日からneovimの話題でもちきりですが、Vim本体についての紹介です。 今回はレジスタの話です。 まずは、ヘルプを見てみましょう。 :help registers レジスタには 9 種類ある: *registers* *E354* 1. 無名レジスタ "" 2. 10個の番号付きレジスタ "0 から "9 3. 小削除用レジスタ "- 4. 26個の名前付きレジスタ "a から "z または "A から "Z 5. 4個の読み取り専用レジスタ ": と ". と "% と "# 6. expression 用レジスタ "= 7. 選択領域用レジスタ "* と "+ と "~ 8. 消去専用レジスタ "_ 9. 最終検索パターン用レジスタ "/ 意外と種類がありますね。 詳しくはそのままヘルプを読めばわかると思います。 そして、このレジスタはなんとインサートモードから呼び出すことが可能です。 やり方はインサートモードで <C-R> レジスタ です。 これを使ったテクニックを紹介します。 まずは、実践Vimにも記述されているものです。 <C-R>={何か式} インサートモードにて入力すると、コマンドモードに=が現れて続けて入力ができます。 例えば、四則演算などの簡単な式を埋め込みたいときなどに有用です。 メモリアドレスの計算なんかしたいときなど 「<C-R>=0xA000 - 0x0909」 と打てば 「38647」 と表示されます。 おっと、これは10進数です。メモリアドレスなんだから当然16進数がいいですね。 ここで、入力できるのは計算式ではなくVimにとっての式であるというのが便利ポイントです。 「<C-R>=printf('0x%x',

.vimrcでありがちなミスとかおすすめとか

この記事は  Vim Advent Calendar 2013  82日目の記事になります。 \アドベント!/ 今回は、みんなの大好きなvimrcの話です。 人のvimrcを見ているととても面白いですが、「あ、これはこうしたほうがいいよな〜」なんて思うことが稀にあります。 そんな間違いや個人的にこうしたほうがいいよって言うものをまとめて見ました。 1. ファイル形式別機能の有効無効設定 これはかなり頻繁に見かける間違いです。 間違い filetype plugin indent on filetype indent on 正しい filetype plugin indent on  これはhelpを引けばわかります。 :help :filetype-overview 有効無効の設定は一括でできます。 2. カラースキームとシンタックスの有効 これは自分もハマりました。 間違い colorscheme mopkai syntax enable 正しい syntax enable colorscheme mopkai 順番が大事なのです、逆にするとうまく色がつかない場合があります。 原因は不明です… 3. インデント この記事を書いていて自分のvimrcのミスに気が付きました 間違い set smartindent set cindent 正しい set smartindent or set cindent これはこちらに書いてあります。 :help smartindent smartindentはcindentかindentexprが有効なときは意味が無いようです。 4. nocompatible set nocompatible これはvimrcを書き始めたらまず書くと思います。 別に間違いではありませんが、これは不要です。 :help compatible を見てみると、「既定では オン、ファイルvimrcまたはgvimrcが発見されたらオフ」とあります。 つまり、vimrcを書いた時点でnocompatibleになり

Vimの:makeの引数補完機能付き:Makeを作った。

イメージ
この記事は  Vim Advent Calendar 2013  80日目の記事になります。 書かぬなら、私が書こう、アドベント はい、もぷりです。 今回も、自作Pluginの紹介です。 Vimには:makeというコマンドがあります。 意外と知らない人もいるかも知れませんので軽く説明を。 このコマンドはいろいろ設定出来るのですが、何も設定しない状態で実行すると $ make を実行したのと同じ動作をします。 つまり、Vimを終了せずとも自分で書いたMakefileを実行出来るわけです。 これだけでも結構便利ですね。 しかし、自分の環境では:makeはファイル名の補完しか行ってくれません。 Makefileは生成ファイル名を書くのだからこれでもまあ、悪くはないのですが $ make clean $ make all $ make run とかの.PHONYをつけるようなターゲットも補完してほしいわけです。 更に、READMEなどもファイルなので候補に上がりますが、個人的に出てきてほしくないです。 なのでPluginを作りました。 こちらです。 mopp/makecomp.vim ちょっとわかりづらいですがこんなかんじで動きます。 これでmakeしやすくなりましたー