2009年12月5日土曜日

システム障害

最近よくシステム障害が起きているようなので,書き留めておきたいと思います.

●ロンドン証券取引所
-障害から復旧まで:
2009/11/25(英国時間) 障害発生(接続障害).取引停止.

-参照:
ロンドン証券取引所がシステム障害で取引停止 - ニュース:ITpro

●東京工業品取引所
-障害から復旧まで:
2009/11/27 障害発生.各取引を停止
 取引システムの開発・運用保守を担当するNTTデータとともに原因究明
 開発元のOMXテクノロジーにソフトの修正を依頼
 テストで動作確認
2009/11/30 システム復旧

-原因:
受け付けた注文件数が最多となった際に,潜在バグが表面化したことによる
・メモリリーク
「気配値」の計算に使うプログラムが,使用したメモリ領域を削除していなかったために生じた.
注文を受信するにつれメモリの使用可能領域が減少し,計算が不可能となった.

・フェイルオーバーの際の切り替えシステムのバグ
取引システムは現用系と待機系のホットスタンバイ方式で二重化してある.
メモリ不足を受けた際に,本番処理が待機系に自動で切り替わるはずだったが,バグによりメモリ上の一部データを正常に引き継げなかった.
その結果,待機系システムでも気配値の計算が不可能となった.

-参照:
東工取のシステム障害、原因はナスダックOMX子会社製ソフトのバグ - ニュース:ITpro

●新幹線のエクスプレス予約
-障害から復旧まで:
2009/12/3 10:00 障害発生.
 システムのサーバーを再起動し,自動改札機などとのデータの整合性や動作を確認
2009/12/3 13:00 システム復旧

-損害:
この3時間のシステム停止時間中,約1万人がシステムを利用不可能となった

-原因(12/5現在):
不明

-参照:
[続報]3時間後に復旧、新幹線のエクスプレス予約システム障害 - ニュース:ITpro


●その他(オマケ)
-秋はシステム障害の季節か:ITpro
:システム障害の詳細を開示しない企業が多いが,近年は情報公開をすることで高信頼システムを築いていこうとしている動きが多いとのこと.

こういう記事に目を通すことって大切だなぁと改めて思いました.

2009年11月19日木曜日

システムコールの追加

Linux2.6.25カーネルにシステムコールの追加をするのでメモメモ.
ちなみにその時にx86? bit数?とかかなり初歩的なことが分かっていないことが発覚したので,それについても近いうちにまとめます.

●システムコールの追加のためにすること
1)システムコール番号の登録
2)システムコールテーブルに登録
3)追加するシステムコールのオブジェクトファイル名をMakefileに追記
4)ヘッダファイルの作成
5)システムコール本体の作成
6)カーネルの再構築

以下,詳しくやることを書いていきます.

1)システムコール番号の登録
 include/asm/unistd_32.h に
 #define __NR_システムコール名 システムコール番号
 を追加.
 /usr/include/asm/unistd_32.hにも同様に追記する
/*62bitb版OSの場合は,unistd_64.hに追記する*/
/*OSのbit数は$uname -iで調べました*/

2)システムコールテーブルに登録
 arch/x86/kernel/syscall_table_32.S に
 .long sys_システムコール名
 を追加.

3)追加するシステムコールのオブジェクトファイル名をMakefileに追記
 arch/x86/kernel/Makefile のobj-yの項目に
 システムコール名.o
 を追加.

4)ヘッダファイルの作成
4-1)カーネル空間用
 include/linux/システムコール名.h を作成

#ifndef NR_システムコール名_H
#define NR_システムコール名_H

#include <linux/unistd.h>
#include <linux/linkage.h>

#define システムコール名(arg1) syscall(__NR_システムコール名, arg1)

#endif

4-2)ユーザ空間用
 /usr/include/linux/システムコール名.h を作成
4-1で作成したヘッダファイルの#include <linux/linkage.h>#include <linux/syscall.h>に変更したものを作成する

5)システムコール本体の作成
システムコール名.cというファイルを以下のように作成し,arch/x86/kernel/以下に保存する.

#include <linux/システムコール名.h>

asmlinkage 関数型 sys_システムコール名 (引数){
 /* システムコールの内容を記述 */
}


6)カーネルの再構築
make bzImage && make install をした後に再起動!

システムコールをユーザモードプロセスから利用する場合は,ファイル内に#include <linux/システムコール名.h>を記述して利用する


これでいけるハズ

2009年10月19日月曜日

kmalloc()/kfree()

カーネル内でメモリを確保/解放するための関数

●使い方
 #include <slab.h>
 void* kmalloc( size_t size, int flags );
 void kfree( void* ptr );
sizeには確保したいバイト数,flagsには以下のどちらかを指定.
GFP_KERNEL:即座にメモリ領域を用意できない場合、メモリ管理機能がスワップアウト 等によって領域を確保するまでスリープする可能性がある
GFP_ATOMIC:スリープせずにメモリ領域を確保しようとする。 必要な領域が確保できない場合は失敗する。 割り込みハンドラやタスクレット、タイムアウトハンドラ等の プロセスコンテキストと無関係に実行される箇所ではこれを使う

●例
u8 *buffer;
buffer = kmalloc(1000, GFP_ATOMIC);
if (!buffer)
 return -ENOMEM;
kfree(buffer);

/*u8とは符号なし1バイト整数型(0~255)を表す基本型.
 <linux/types.h>をincludeして利用する*/


●参照ページ:
カーネルモジュールを作る

2009年9月30日水曜日

RDMSR / WRMSR in C

MSR(Model Specific Register)を読み書きするための命令
どちらも実行できるのは特権モード(ring 0)のみ

これらを C の中で使うには gcc インラインアセンブラを用いればOK

#ちなみにこのへんの記述は perfctr では /usr/include/asm-x86/msr.h にありますね

●インラインアセンブラ表記法
asm volatile ("アセンブラテンプレート"
: "出力オペランド"
: "入力オペランド"
: "アセンブラの実行で変更されてしまうもの");

出力オペランドは "=a" (出力先変数),
入力オペランドは "a" (入力) のように表記する.
ここで,各レジスタは以下のように表記する.
"a" eax
"b" ebx
"c" ecx
"d" edx
"A" edx:eax(上位bitにedx,下位bitにeax)
"g" gccが適当なレジスタに割り当てる


●RDMSR
ecx レジスタに MSR のアドレスを指定すると,edx:eax レジスタに MSR の内容を読み込む(上位 32bit が edx ,下位 32bit が eax に入る)
e.g.
asm volatile("rdmsr" : "=a"(low), "=d"(high) : "c"(msr_addr));
asm volatile("rdmsr" : "=A"(val) : "c"(msr_addr));

●WRMSR
ecx レジスタに指定した MSR のアドレスに,edx:eax レジスタの内容を書き込む(〃)
e.g.
asm volatile("wrmsr" : : "c"(msr_addr), "=a"(low), "=d"(high) : "memory");
asm volatile("wrmsr" : : "c"(msr_addr), "=A"(val) : "memory");


参照ページ:
ほげほげまん: gccインラインアセンブラ
ほげほげまん: RDMSR / WRMSR

ほげほげまんめっちゃ分かりやすい.お世話になってますw

2009年9月28日月曜日

コンテキストスイッチのソースコード

今後手を加える予定なのでここにメモしときます.
(Linux2.6.25 kernel)

●コンテキストスイッチをしている箇所
 kenrel/sched.c 内 context_switch()
 switch_mm() によってプロセス空間の切り替え,switch_to() によって各種レジスタの切り替えを行っている.

●コンテキストを切り替える際に保存する情報
 task_structに格納している
  :定義は include/linux/sched.h l994
 更に,CPU依存の低レベルな実行コンテキストは thread_struct に格納している
  :定義は include/asm-x86/processor.h l315

以下はソースコードコピペ(長すぎて邪魔だったので消しましたw 09/10/15)

2009年9月23日水曜日

富士登山

やっと念願の富士登山に行ってきました!
友人との予定が合わず,9月下旬の登山になってしまったこと,そして最近運動不足で体力に自信がなかったこともあり,結構不安でした..
が!
ゆっくり休憩をとりながらコツコツ登り続けること計8時間.
天候にも恵まれ,高山病にもならず(若干の頭痛はずーっとありましたが),無事に登頂を果たし,ご来光を見ることができました.
登った日はおじいちゃんの命日だったから,きっとおじいちゃんが見守っていてくれたんだと思う.

ご来光だけでなく,雲海に映る影富士や夕焼けの空,真夜中の満天の星など…
普段見ることのできない幻想的な世界を堪能できました.


それになんだか,元気を貰いました.
コツコツやっていればちゃんと達成できるんだなぁと.
毎日コツコツ,時間を大切にしなくちゃいけないなと改めて感じました.

またこんな晴れ晴れした気持ちを味わえるように!
今日も充実してたなーと毎日思えるように!
毎日を過ごしていきたいと思います.




富士山ありがとう!






/*ここからメモ*/
●登山に持って行って良かったもの
 ・ヘッドライト
 ・ゼリー状の飲み物
 ・帽子,手袋,ホッカイロ
 ・チョコレート(甘い物は元気が出る!)

●持って行けば更に良かったなぁというもの
 ・冷えピタ
 ・マスク

あとやっぱり9月だからか,これでもかってくらい防寒してちょうど良かったです.
私の場合,山頂ではTシャツ+長袖シャツ+ジャージ+フリース+防水ジャケットでもこもこでしたw
あと,山頂の神社に行けなかったのはちょっと残念でした(8月20日までだったみたい)

以上!

せっかくグッズも集めたことだし,また登山に挑戦したいです♪

2009年9月17日木曜日

クロスリファレンスLXR

カーネルのソースコードを参照しやすくするために入れました.
入れ方&使い方は全てここに集約されています.
ViVa! Saborigineer. - クロスリファレンス

とりあえず使い方だけメモメモ

1.lxr/sourceにソースファイルを展開
 lxr/source/バージョン名/sourceとなるようにして作成

2.genxrefを使って、lxr/source/バージョン名/にデータベース(fileidx,xref)を作成
 $ ../../bin/genxref source/

3.fileidx、xrefのアクセス権の変更
$ chmod 644 fileidx xref

4."freetext search"、"file search"用のインデックスを作成
$ cd /var/www/html/lxr/source/バージョン名/
 $ glimpseindex -H . source
 $ chmod 644 .glimpse_*

5.versionsにバージョン名を追加
デフォルトのバージョン名を変更する場合は、defversionを変更

とり急ぎメモだけ.