投稿

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に貼った方は見やすさのためにマクロなど全て展開済みです。

レジスタ操作があるのでC言語では書けません。ですのでアセンブラを使用しています。
asm_interrupt_timerという関数がカーネル初期化時にCPUのタイマ割り込みハンドラに登録されます。
ですので、タイマ割り込みが発生したらCPUが勝手にa…

自作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では頻繁に行われます。
例えば、目の前のターミナルでlsコマンドを実行したとしましょ…

[自作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, execのみ)プロセススケジューリング(ラウンドロビン)
環境にはQEMUとBochsを使ってます。
Bochsはデバッガが良い感じなのでおすすめです。
ス…

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

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

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 のようにフォーマットに掛けます

Arch用のパーティションは/と/homeに分割します。
また、デュアルブートす…

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)
また、開くときに縦に開きたいとか横に開きたいとか、その日の気分によって変わります。 そんな時のために、コマンドはオプションで開き方を変更することができます。 便利ですねー(かなり)
マッピングでは、以下の変数に設定しておくことで動作を変更可能です letg: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', 0xA000 - 0x0909)」とすると「0x96f7」で入力されます。


次によく使うのは「*」と「+」レジスタの2つです。

.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. nocompatibleset nocompatible これはvimrcを書き始めたらまず書くと思います。 別に間違いではありませんが、これは不要です。 :help compatible を見てみると、「既定では オン、ファイルvimrcまたはgvimrcが発見されたらオフ」とあります。 つまり、vimrcを書いた時点でnocompatibleになります。

5. 複数の設定値set backspace=2
set autoindent
set cindent
set expandtab    
set shiftwidth=4
これは以下と同様です。 set backspace=2 autoindent cindent expandtab shiftwid…

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しやすくなりましたー