You are on page 1of 35

2006年度

研究室顔合わせ資料
基礎情報理工学 夏季課題説明
2

最初に

„ カードキーの登録用紙へ記入してください

„ 研究室の計算機を利用するための
アカウントを配布します
– パスワードは後ほど変更してください!
– ユーザ名@asl.cs.ritsumei.ac.jp が利用可
– 現在はRainbowへ転送されます

„ この資料は http://www.asl.cs.ritsumei.ac.jp/
– 「LOCAL CONTENTS」
– 共通の「2006年度顔合わせ資料・・・」
Mouri Lab, Ritsumeikan Univ.
3

科目: 卒業研究1~3とは

„ 授業などで得た知識を活かし
„ 専門分野を通じて
高度で実践的な能力を身につける
– 最先端の科学技術への適応
– 社会へ出る前のトレーニング
„ Plan-Do-Check-Act

„ 調査能力,問題発見・分析・解決能力,表現能力

„ 研究とは
– 何かを便利にし,それを客観的に示すこと
Mouri Lab, Ritsumeikan Univ.
4

研究室という組織や場所

„ 自分の力を伸ばせる場所
– 来るだけで,いるだけでも価値のある場所
„ 新たな仲間を作る場所
– 先生と最も身近に接することができる
– 先輩・後輩をいい意味で活用してください
– 研究や技術については皆平等
– 卒業後も付き合える
„ 世界へ目を向けられる場所
– 卒業した先輩,企業や他大学の人々,海外も
Mouri Lab, Ritsumeikan Univ.
5

成功へのヒント

„ 研究室に来ること

„ 外を見ること

„ 議論,特に発言をすること

„ 質問・疑問を持ち越さないこと

Mouri Lab, Ritsumeikan Univ.


6

研究室メンバー

„ 教員
„ 大学院
– 一貫制博士 F4: 1名*
– 博士前期(修士) M2: 3名*,M1: 4名
„ 学部
– 情報学科 B4: 9名
– 情報システム学科 B3: 11名

„ 自己紹介: 名前・出身地・自分の特徴 他
Mouri Lab, Ritsumeikan Univ.
7

夏季課題(基礎情報理工学)

„ カーネル開発技法の基礎と開発実践
~ OSの中身をさわってみよう ~
– カーネルの機能拡張
„ 新たなシステムコールを追加してください!

– 性能評価手法
„ システムコールの処理時間を計測してください!

– 開発環境の構築法
– カーネルデバッグ手法
Mouri Lab, Ritsumeikan Univ.
8

レポート (9/22提出,要確認)

„ システムコール処理関数の説明
– 外部仕様 (機能,引数,戻り値の説明)
– 内部仕様 (変数,アルゴリズムの説明)
„ 性能評価
– テストプログラムの説明,測定結果,考察
„ デバッガの使用例
– どのようなバグを,どのように退治した?
„ プログラムのソースコード
– システムコール処理関数
– ヘッダファイル(.h),アセンブラファイル(.S) の変更部分
– テストプログラム Mouri Lab, Ritsumeikan Univ.
9

システムコールの概要
OSの教科書
プログラマが
getpid() 作った部分 1.4.2 (p. 9) 参照

ライブラリ
ライブラリ関数
ユーザ スタブ
モード

カーネル
モード 割込み システムコール
ディスパッチャ
ハンドラ 処理モジュール

Mouri Lab, Ritsumeikan Univ.


10

夏季課題で作る部分

テストプログラム
yoursyscall()

ユーザ スタブ
モード

カーネル
モード 割込み システムコール
ディスパッチャ
ハンドラ 処理モジュール

Mouri Lab, Ritsumeikan Univ.


11

一般的なカーネルの開発法

(2) 起動情報・カーネル
Ethernet

(4)(6) デバッグ情報

シリアルケーブル
開発機 ターゲット機
(1) プログラミング・コンパイル (3) システム起動
(4) デバッグ (5) テストプログラム
(6) デバッグ Mouri Lab, Ritsumeikan Univ.
12

仮想計算機(VM)による開発法

開発機: develop ターゲット機: target

仮想的な接続
Windows and Linux are OK!
Unnecessary to install new OS! Mouri Lab, Ritsumeikan Univ.
13

準備 (1)

„ VMware Playerのインストール
– Linux or Windows
– http://www.vmware.com/ja/download/player/

„ VMの展開 (配布DVD) から
– Develop.zip ・・・ 開発機VM
– Target.zip ・・・ ターゲット機VM
※ http://www.lavender.org/~mouri/Develop.zip
※ http://www.lavender.org/~mouri/Target.zip

Mouri Lab, Ritsumeikan Univ.


14

準備 (2)

„ Develop を起動し,user でログイン


„ ファイル「.gdbinit」を作成 (ドットを忘れない)
% emacs .gdbinit
define kgdb
target remote /dev/ttyS0
set remotebaud 115200
symbol-file /usr/src/linux/vmlinux
end
„ シャットダウン
% poweroff
Mouri Lab, Ritsumeikan Univ.
15

具体的な開発の流れ
Develop Target
起動・ログイン
ソースの編集
コンパイル
カーネルイメージのコピー
起動
gdbの実行
ログイン
デバッグ テストプログラム実行
Mouri Lab, Ritsumeikan Univ.
16

VMの起動・ログイン・
シャットダウン
„ VMの起動
– .vmx ファイルをダブルクリック

„ ゲストOS(Linux)へのログイン
– user または root
– パスワードは無し
– user は Develop と Target でホームを共有

„ ゲストOSのシャットダウン
% poweroff
Mouri Lab, Ritsumeikan Univ.
17

ソースの編集・コンパイル・
カーネルイメージのコピー
„ 編集はテキストエディタで
– emacs と vi が使えます
„ カーネルのコンパイル (時間がかかる)
% cd /usr/src/linux
% make
„ コンパイルが成功したら
カーネルイメージのコピー
% cp arch/i386/boot/bzImage /tftpboot
(※ 上記は /usr/src/linux から実行する例)
Mouri Lab, Ritsumeikan Univ.
18

targetの起動とgdbの実行

„ target が次のような画面で止まってから

„ develop のターミナル画面上で
gdb 起動

kgdbと入力

cと入力
Mouri Lab, Ritsumeikan Univ.
19

デバッグ

„ 最低限知っておくべきコマンド
– break
– continue (c)
– print
– next
– step
„ gdb の画面で C-c で
いつでも target のカーネルは停止させられる
„ 参考
http://www.lavender.org/~mouri/pukiwiki/index.php?gdb
Mouri Lab, Ritsumeikan Univ.
20

テストプログラム

„ ユーザレベルのプログラム
– 作成中のシステムコールを呼び出す (スタブ)
– システムコールの処理時間を計測・表示する
„ develop 上で作成・コンパイル
„ target 上で実行

„ f
Mouri Lab, Ritsumeikan Univ.
21

システムコールの作り方
in Linux
„ システムコールの追加
1. システムコール番号の割当て
2. システムコール処理モジュールの登録
3. 〃 のプロトタイプ宣言の記述
4. 〃 の作成
„ システムコールのテスト
5. テストプログラムの作成
6. テストプログラムの実行
Mouri Lab, Ritsumeikan Univ.
22

1. システムコール番号の割当て

/usr/src/linux/include/asm-i386/unistd.h

自分で作成する
システムコールの番号
全システムコールの個数

Mouri Lab, Ritsumeikan Univ.


23

2. システムコール処理
モジュールの登録
/usr/src/linux/arch/i386/kernel/syscall_table.S
システムコール番号に
処(理関数 を)登録
処理モジュール
対応する

294番目

Mouri Lab, Ritsumeikan Univ.


24

3. システムコール処理
モジュールのプロトタイプ宣言
/usr/src/linux/include/linux/syscalls.h

プロトタイプ宣言

Mouri Lab, Ritsumeikan Univ.


25

4. システムコール処理
モジュールの作成
/usr/src/linux/kernel/printk.c の最後へ追加

システムコール処理
モジュール本体

注: 本当は専用のファイルを作成するが,
ここは簡単のため上記ファイルへ追加
Mouri Lab, Ritsumeikan Univ.
26

5. テストプログラムの作成
% gcc prog1.c ・・・ 付録(1)参照 p. 34

オーバヘッド計測

カウンタ取得
newsyscall()
(スタブ)
カウンタ取得 Mouri Lab, Ritsumeikan Univ.
27

6.テストプログラムの実行

„ ここだけは target マシン上で

userでログイン

テストプログラム
実行

Mouri Lab, Ritsumeikan Univ.


28

新しいシステムコールの例
1. 特定の文字列を表示するだけ (引数0個)
2. int len = strdelay(char *last, char *this);
„ this で示す文字列を,カーネル内へコピー
„ 前回呼び出された時にコピーしておいた文字列を,
last で示す場所へコピー
„ len は last で示す文字列の長さ
3. int depth = strpush (char *str);
int depth = strpop (char *str);
„ 文字列を格納するスタックを作成
„ 2個のシステムコール strpush, strpop を作成
„ depth は push 後,pop 後のスタックの深さ
Mouri Lab, Ritsumeikan Univ.
29

引数の個数とスタブ (1)

„ 引数の個数によって,
テストプログラムの書き方が変わる

ret = getpid()

ret = time(NULL)

※ prog2.c は 付録(2)参照 p. 35
Mouri Lab, Ritsumeikan Univ.
30

引数の個数とスタブ (2)

„ /usr/src/linux/include/asm-i386/unistd.h
_syscall0()

_syscall1()

http://www.mars.sannet.ne.jp/sci10/on_gcc_asm.html
の12章・13章
Mouri Lab, Ritsumeikan Univ.
31

Trouble Shooting Tips

„ メモリの不足のため起動できない場合
– DevelopのVMで割当てるメモリを減らす
– 256MB → 128MB → 96MB → 64MB → 32MB

Mouri Lab, Ritsumeikan Univ.


32

今後の進め方 (1)
„ 8月4日(金)~9月15日(金)
– 8月18日(金)を除く6回
– メールにて進捗,相談事項などを連絡
– koichi@uiuc.edu

„ ~8月4日
– VMWareのインストールや設定
– Developを使ってみる ・・・ 準備(2)まで
„ ~8月11日 (この日は大学は休み)
– システムコールの機能を決定
„ 9/1 or 9/8 に中間報告会? 他?
Mouri Lab, Ritsumeikan Univ.
33

今後の進め方 (3)
„ 普段の相談について
– 皆さんで相談はOK
„ ただし,プログラムとレポートのコピーは不可
– 先輩に聞くのもOK
– 私もOK.できればVideo Conferenceで

„ 私の帰国後に発表会をします(10月初旬)
– レポートの内容を簡潔にまとめてPowerPointで

„ 本課題を実行不可能な者は事前に申し出ること
– 開発環境が無い
– 帰省・長期旅行など
Mouri Lab, Ritsumeikan Univ.
34

付録 (1) ・・・ prog1.c


#include <stdio.h
<stdio.h>
>

int main(int argc,


argc, char **argv)
**argv)
{
int i, ret;
unsigned long long from, to, diff;

for(i = 0; i < 5; i++) {


// get overhead
__asm
__asm__
__ volatile("rdtsc"
volatile("rdtsc" : "=A" (from));
__asm
__asm__
__ volatile("rdtsc"
volatile("rdtsc" : "=A" (to));
diff = to - from;

// get counter
__asm
__asm__
__ volatile("rdtsc"
volatile("rdtsc" : "=A" (from));

// ret = newsyscall(NULL);
newsyscall(NULL); "294" is the systemcall number of newsyscall()
newsyscall()
__asm
__asm__
__ volatile("int $0x80" : "=a" (ret) : "0" (294));

// get counter
__asm
__asm__
__ volatile("rdtsc"
volatile("rdtsc" : "=A" (to));

printf("Retval:
printf("Retval: %d, Clock: %u
%u¥n", ret, (to - from - diff));
}
return(0);
} Mouri Lab, Ritsumeikan Univ.
35

付録 (2) ・・・ prog2.c


#include <stdio.h>

int main(int argc, char **argv)


{
int ret;

// ret = getpid(); "20" is the systemcall number of getpid()


// see #define__syscall0(... in unistd.h
__asm__ volatile("int $0x80" : "=a" (ret) : "0" (20));

printf("%d¥n", ret);

// ret = time(NULL); "13" is the systemcall number of time()


// see #define__syscall1(... in unistd.h
__asm__ volatile("int $0x80" : "=a" (ret) : "0" (13), "b"
((long)(NULL)));

printf("%d¥n", ret);

return(0);
}

Mouri Lab, Ritsumeikan Univ.

You might also like