2010年12月19日日曜日

第5回 V7から始めるUNIX講座 復習とまとめ

第5回 V7から始めるUNIX講座 復習とまとめ

●復習

・2針クロックアルゴリズム
VAX(DECの32ビットマシン)はリファレンスビットがなかった。
ハードウエアによっては、エラー書き込み例外からの再実行が許さないものもあったので、この実装を参考にした。

これは、Copy on Writeのことでしょうか?
コピーした振りをしておいて、どちらかに書き込み(変更)があった場合にエラー書き込み例外が発生
その例外の中で本当に領域を探して割り当てて、再実行することにより、上位には何事もなかったかの
ように見せかける。

http://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%94%E3%83%BC%E3%82%AA%E3%83%B3%E3%83%A9%E3%82%A4%E3%83%88

・BSD2.9のインストール
問題なし

stty erase '^H'の設定がうまく行かない件
UbuntuのターミナルがVT100と異なるためのよう、ちょっと後で調べます。

●第5回目:ファイルシステムとは?

まずいきなりソースコードを読んでも理解できない。
まずファイルシステムとは何か?という概観を理解して、どう実装しているのかをソースで確認しましょう。
実装詳細は次回以降として、今回はファイルシステムの説明です。
UNIXファイルシステム(UFS)については以下参照
http://ja.wikipedia.org/wiki/Unix_File_System


1、ファイルの実態
まずファイルについては、ハードディスクに格納されているわけですが、ディスクはブロックという単位でリード・ライトされます。
1ブロックは512Byteです。
ファイルの実態はブロック単位でハードディスクのどこかに格納されています。

2、ファイルシステムの役割
おおまかに言うと
1.どこを使うか(上記のブロック単位でどこからどこまで)
2.誰が使うか(ユーザ管理)

初期のころは黒板に書いて管理していたが、これらをマシンに管理されるようにしまた。

3、ファイルを管理(識別)するために
ファイルそのものを示すのはファイル名ではありません。
inodeがファイル管理のために使われます。
ファイル名は人間が分かりやすいようにinodeに対して名前を付けただけのものです。
ディレクトもファイル名の拡張です。
そのため、同じinodeに対して複数のファイル名を付与できます。

例:
$ cd /tmp
$ touch test
$ ls -l test
-rw-r--r-- 1 user user 0 2010- 12- 19 14:05 test

UNIXではハードリンクすれば同じinodeに複数のファイル名を付けられます。
$ ln test test2
$ ls -l test*
-rw-r--r-- 2 user user 0 2010- 12- 19 14:05 test
-rw-r--r-- 2 user user 0 2010- 12- 19 14:05 test2

数字が1から2になっています。これはリンクカウントを示します。
つまりinodeに対してリンクが2(2ファイル)あることになります。
本当に同じinodeなのか確認しています。lsで iオプションを使うとinodeを表示します。
$ ls -il test*
917548 -rw-r--r-- 2 user user 0 2010- 12- 19 14:05 test
917548 -rw-r--r-- 2 user user 0 2010- 12- 19 14:05 test2

ということで同じinodeを使用していることが分かりました。

では、inodeを管理するための構造体だけ確認しておきましょう。
http://www.tamacom.com/tour/kernel/unix/S/61.html
の26行目struct inodeです。

31 ino_t i_number; /* i number, 1-to-1 with device address */
これがinodeの番号です。

今日の説明で重要なのは、
32 unsigned short i_mode;
です。
MODEに格納されているのは、以下ですが、今日の説明で重要なのは、directoryとregularです。
64 #define IFDIR 0040000 /* directory */
65 #define IFCHR 0020000 /* character special */
66 #define IFBLK 0060000 /* block special */
67 #define IFREG 0100000 /* regular */

directoryはそのファイルがディレクトリであること、regularはそのファイルが一般に公開されていることを示します。

●疑問
ファイルのパーミッションはRWXで3ビットづつ(だから8進数の方が都合が良い)で格納されているということでしたがstruct inodeのどこに当たるのでしょう?

3、ファイルシステムの構造
ファイルシステムは以下のように分かれています。

スーパーブロック:ファイルシステム全体の管理情報を保持しています。
inode:inodeが0からの配列で格納しています。
一般ブロック:実際のファイルをブロック単位で格納しています。

質問1:上記の構造を作るのは誰?
⇒mkfsです。mkfsのパラメータにはフォーマットするデバイスを指定します。mkfsで上記のような構造をディスク上に作成します。

質問2:じゃ、ファイルシステムをOSから使えるようにするには?
⇒mount コマンドでOS上のマウントポイントにマウントして使えるようにします。

UNIXではファイルシステムはひとつのツリー構造にするので、mountコマンドは親のツリーに接ぎ木する感じ。
接ぎ木のルートは必ずinodeが2と決まっています。
例:
$ ls -id /
2 /
となりました。ルートのinodeは2番です。

mountコマンド:inodeの2を指定した場所に接ぎ木します。
umountコマンド:接ぎ木を外します。ただし全てのファイルがクローズしていないとエラーになります。

4、ファイルの作成
では、今までの話を踏まえて、新しくファイル(通常のファイル)を作成すると内部ではどうなるでしょうか?
(1)未使用のinodeをさがして、そこにregular fileと書き込む。
(2)一般ブロック領域をひとつ確保してつなげる。
(3)リファレンスカウントをインクリメントする

●疑問
inodeと一般ブロックの結びつけは、inode構造体の以下の部分にinodeに対応する一般ブロックを書き込むことで行うということでよろしいですか?
ファイルの編集でサイズが変更になった場合は、使用する一般ブロックも更新する?


38 struct {
39 daddr_t i_addr[NADDR]; /* if normal file/directory */
40 daddr_t i_lastr; /* last logical block read (for read-ahead) */
41 };


5、ではファイル名はどこに?
inode構造体でファイル名は管理していませんでした。
つまり、ファイル名とinode番号のペアを管理している台帳があるはずです。
⇒これがディレクトリファイルになります。

試しに、「cat .」を実行すると、ディレクトリファイルが表示されます。
化け化けになりますがファイル名と何らかの情報を保持していることが分かります。

6、ファイルの削除タイミング
リファレンスカウントが0になったらファイルは不要(削除)になる??
いつ消えるかは今後のお楽しみ。

(補足)
以前、SUNのワークステーションを使っていたときに、ディスクが余っているにも関わらずファイルが作成できなくなったことがありました。
つまり、inodeが足らなくなったんですね。
その時は先輩がごにょごにょして、使えるようにしてくれました。

2010年12月12日日曜日

第4回 V7から始めるUNIX講座 復習とまとめ

第4回 V7から始めるUNIX講座 復習とまとめ

●復習

・2針クロックアルゴリズム
問題なし。
リファレンスビット(参照ビット)を2つの針でチェックして参照されてないものを
ページ・アウトの対象とする。
→メモリが足らなくなってくると針が動き出す。

VAX(DECの32ビットマシン)はリファレンスビットがなかった。
知らなかった!!ということで調べてみました。

http://tiki.is.os-omicron.org/tiki.cgi?c=v&p=%B2%BE%C1%DB%B5%AD%B2%B1
時計アルゴリズムの実装にはページテーブルエントリに参照ビットが必要であるが,
BSD のターゲットマシンである VAX には存在しなかった.そこで,ダーティ(更新)ビットを利用し,
ソフトウェア的に参照ビットをエミュレートする形で実装された.この方法はページフォールを利用する分,オーバヘッドになった.


・スタックとヒープに関して
問題なし
brk(絶対値)、sbrk(増分)でリミットを変更する。
brk、sbrkで変更したリミットは戻らない
そこからmallocで必要なだけ切り出す。

・タスクスイッチング
基本問題なし
→proc構造体とuser構造体は相互にリンクされている。

上のコードだとr7退避してないような?
→r7(PC)はスタックに保存しています。

レジスタは退避、復元しているようですが、メモリについてはそのままということなんだろうか?
→メモリはそのまま。メモリが足らなくなってきたら、使ってないプロセスを丸ごとスワップ・アウト
スワップ・アウトしてるか分かるので、必要になった時点でスワップ・インする。


第4回目

今後はファイルシステムに行く予定なので
準備も兼ねて今日は2.9BSDをシミュレータ上で実行してみます。

V7はエディタはedしかない。
V7のメンバーがバークレーでビル・ジョイを巻き込んでBSD版チームを設立した。
そこでviを開発した。
BSD2シリーズというのがあるそうです。

http://www.law.co.jp/okamura/OpenSource_Web_Version/chapter03/chapter03.html
によると
ビル・ジョイは、様々なアップデートを反映する形で、"Second Berkeley Software Distribution"を作っている。
そして、すぐに2BSDの略称で呼ばれるようになったこのバージョンのバークレー版UNIXソフトウェアには、
改良強化版のPascalのほかviエディタが含まれていた。
数種類の端末向けのtermcapも用意されていた。
ビル・ジョイは、配布用のテープの作成から、電話の応答、ユーザからのフィードバックの実装まで、全部一人でやってのけた。
だそうです。

BSD2.9はV7+拡張になっているのでV7の勉強を便利なツールを使って行うことが出来る。
V7でedでとかは出来なくはないが、ちょっと辛い(^^;)

●インストール手順

1、BSD2.9のイメージをダウンロード
git clone git://github.com/magoroku15/2.9BSD.git

2、エミュレータのインストール
コマンドラインでpdp11を実行してエラーになるようでしたら、
$ sudo apt-get install simh
を実行してインストールしておきます。

3、起動
BSD2.9をダウンロードしたディレクトリで以下のコマンドを実行します。
$ pdp11 bsd.ini

PDP-11 simulator V3.8-1
Disabling XQ
:boot

70Boot
:

先頭にゴミが入りますが、気にせず以下のコマンドを実行します。
: rl(0,0)rlunix

Berkeley UNIX (Rev. 2.9.1) Sun Nov 20 14:55:50 PST 1983
mem = 1979072

CONFIGURE SYSTEM:
xp 0 csr 176700 vector 254 attached
rk 0 csr 177400 vector 220 attached
hk 0 csr 177440 vector 210 attached
rl 0 csr 174400 vector 160 attached
rp ? csr 176700 vector 254 interrupt vector already in use
ht 0 csr 172440 vector 224 skipped: No CSR
tm 0 csr 172520 vector 224 attached
ts 0 csr 172520 vector 224 interrupt vector already in use
dh ? csr 160020 vector 370 skipped: No CSR
dm ? csr 170500 vector 360 skipped: No autoconfig routines
dz ? csr 160110 vector 320 interrupt vector wrong
dz ? csr 160110 vector 320 interrupt vector wrong
dn 0 csr 175200 vector 300 skipped: No autoconfig routines
vp ? csr 177500 vector 174 skipped: No autoconfig routines
lp 0 csr 177514 vector 200 attached
Erase=^?, kill=^U, intr=^C
#

#はシングルユーザモードなので、コントロール+Dを押します。

# Wed Dec 31 17:16:31 PST 1969
Mounted /usr on /dev/xp0h
Attempt to mount /home on /dev/rl2 FAILED: No such file or directory
init: /dev/tty07: cannot open
init: /dev/tty06: cannot open
init: /dev/tty05: cannot open
init: /dev/tty04: cannot open
init: /dev/tty03: cannot open
init: /dev/tty02: cannot open
init: /dev/tty01: cannot open
init: /dev/tty00: cannot open


Berkeley Unix 2.9BSD

:login:

loginプロンプトが表示されるので、rootでログインします。(パスワードなし)


Welcome to the 2.9BSD (Berkeley) UNIX system.

#

となれば問題なしです。

●sttyの設定
stty all
を実行すれば端末の機能が分かります。
erase kill werase rprnt flush lnext susp intr quit stop eof
# @ ^W ^R ^O ^V ^Z/^Y ^? ^\ ^S/^Q ^D

確か、stty erase '^H'
でバックスペースが効くようになったかと思いますが、うまく行きません?
$ ls
でコントロール+Hを押下すると
# ls\s
となります?

●Man
英語ですがマニュアルも入っています。
manコマンドです。
ただし、コマンドとシステムコールが同じ名前のものは、番号を指定します。
例:write
システムコールを見たければ man 2 write

●コンパイル
コンパイラも入っているので、コンパイルが出来ます。

例:test.cをviで作成
main()
{

printf("Hello World\n");

}

# cc test.c

a.outファイルが出来るので実行

# a.out
Hello World
#

となります。

●予約語のチェックはしない。
int write;
main()
{

printf("Hello World\n");

}

として再コンパイルして実行すると

# a.out
Bus error (core dumped)
となります。なじぇ
実はprintfは内部でwriteシステムコールを使っているそうです。
そのため、int writeがバッティングしているわけです。

チェックしていないので、printfでint writeの領域をシステムコールとして実行するわけですからBus errorになったということですね。

●シンボルの確認
ファイルのシンボルを確認するのに、nmコマンドがあります。
これで、ファイルにどんなシンボルが含まれているか分かります。

●スタートアップルーチン
Cでプログラムルーチンを書くときは、main()と書けば良いと教わります。
でも、mainを呼び出してくれる、あるいはexit()をコールした時に本当の終了処理をしています。
このスタートアップルーチンが最初に実行するコードで、パラメータを設定してmainを呼ぶ。
あるいはexitの後の終了処理を行います。
組み込み系の場合、これらも含めて準備する必要があります。

●ダンプ
od(octal dump)コマンドを使えばファイルやファイルシステムをダンプできる。
まごろくさんは、これでこの辺がi-nodeでとか分かるみたいです。
8進数表示です。

ぴーたーぱーかーさんから、その後-xオプションを付ければ16進数になるよと教えて頂きました。
a(アスキーコード)オプションもあるとのことでしたが、私の環境では表示されませんでした。

ということで、慣れ親しんだ16進表記で学習が出来そうです。
ぴーたーぱーかーさんありがとうございます。(^^)

2010年12月5日日曜日

第3回 V7から始めるUNIX講座 復習とまとめ

●復習
以下の内容に対しての復習、補足です。
http://xiangcai.at.webry.info/201011/article_9.html

・LRUに関して
最近使われていないものは今後も使われることがないと仮定する考え方です。
→参照の局所性に基づきます。
最近使われていないPageをページ・アウトして物理メモリを空けます。

当初、2 Way Clock arugorizumuで検索てヒットしませんでしたが
2針クロックアルゴリズムで検索すると資料出てきました。
http://h50146.www5.hp.com/products/software/oe/hpux/developer/document/memmanage/mem8.html
http://docs.sun.com/app/docs/doc/817-0158/6mfvqchsq?l=ja&a=view

時計の針のように2つの針があります。
最初の針は、参照をクリアして参照していない状態にします。
次の針が少し遅れてスキャンしていき(どれくらいの間隔かはパラメータで調整)、ページにプログラムがアクセスするとハードウェアが「ダーティ」ビットを立てるので、ダーティビットが立っていない(参照されていない)ページをページ・アウトの対象とするようです。

・スタックとヒープに関して
基本問題ないが、ヒープを確保するのは、システムコールのbrkとsbrkになる。(mallocの中で使っている)
http://www.ialab.cs.tsukuba.ac.jp/~maeda/class/syspro/syspro3.pdf
この資料の「プロセスのメモリ空間(古典Unix)」が分かりやすいですね。
ヒープ領域を確保するというよりは、ヒープ領域のリミットを変更するというのが正確のようです。

http://yaguchi.txt-nifty.com/blog/2006/07/brk_sbrk_94d5.html

(余談)
mallocとfreeを繰り返すとそのうちフラグメンテーションする。

都市伝説
mallocにはバグがある。
mallocの管理領域を破壊するとfreeした時に障害が発生するので、mallocにバグがあるような挙動になるが、malloc自身のバグではないので注意。

●第3回まとめ(タスクスイッチング)
簡単にいうと、
・メモリ:text, data, bss, ヒープ、スタック
・CPUの状態:GR(汎用レジスタ)、PC(プログラムカウンタ)、SP(スタックポインタ)
が保存されているえば、復元することが出来る。

プロセスAにスイッチ、プロセスAを復元、プロセスAの命令実行、プロセスAの状態を保存
プロセスBにスイッチ、プロセスBを復元、プロセスBの命令実行、プロセスBの状態を保存
プロセスCにスイッチ、プロセスCを復元、プロセスCの命令実行、プロセスCの状態を保存
というのを様々な要素で優先度を決めて、ひたすらカーネル(スケジュール)がやっている。

全体のイメージ
画像


保存する場所
CPUの状態:user構造体(uでアクセス)の「u_ssav」に保存している。
http://www.tamacom.com/tour/kernel/unix/S/80.html

保存は、save関数:保存先は(u.u_ssav)


713 .globl _save
714 _save:
715 mov (sp)+,r1
716 mov (sp),r0
717 mov r2,(r0)+
718 mov r3,(r0)+
719 mov r4,(r0)+
720 mov r5,(r0)+
721 mov sp,(r0)+
722 mov r1,(r0)+
723 clr r0
724 jmp (r1)


●疑問
PDP11では、r0~r7の汎用レジスタがある。
r6がスタックポインタ(SP)でr7がPC(プログラムカウンタ)のはず。Lions本の260ページ
上のコードだとr7退避してないような?

ついでに、復帰するresumeも


.globl _resume
727 _resume:
728 mov 2(sp),r0 / new process
729 mov 4(sp),r1 / new stack
730 bis $HIPRI,PS
731 mov r0,KISA6 / In new process
732 mov (r1)+,r2
733 mov (r1)+,r3
734 mov (r1)+,r4
735 mov (r1)+,r5
736 mov (r1)+,sp
737 mov $1,r0
738 bic $HIPRI,PS
739 jmp *(r1)+


退避した領域から汎用レジスタに値を入れ直しているのが分かります。

resumeをしているのは、sleep, swtch, newproc, expand
このうち、swtchがタスクスイッチを行っているようです。

プロセスのメモリはどこに?
proc構造体にp_addrがあって、これがユーザプロセスへのポインタになっているように思いますが、正しいだろうか?

●プロセス切り替えに関して
画像


カーネルがユーザプロセスにスイッチする時にタイマーを設定して実行する。
無限ループするようなプロセスがいた場合に他のプロセスへのスイッチが出来なくなるため。

以下の場合、ユーザプロセスからカーネルへ切り替わる。
1、タイマーが切れた場合
2、システムコールをコールした場合

3、カーネルに戻って、スケジューラが条件により優先度を決めて次に実行するプロセスを決定する。
4、現在実行中のプロセスの状態(レジスタ)を保存する、保存先はu.u_ssav※。

※user構造体については、現在実行中のものに対して:変数uにてアクセス出来る。

5、次に実行するプロセスの状態をresumeで復元する。
6、次のプロセスを実行する。

疑問
レジスタは退避、復元しているようですが、メモリについてはそのままということなんだろうか?

(余談)
forkした場合に、procのp_addrをコピーしています。


507 a2 = malloc(coremap, n);
508 /*
509 * If there is not enough core for the
510 * new process, swap out the current process to generate the
511 * copy.
512 */
513 if(a2 == NULL) {
514 rip->p_stat = SIDL;
515 rpp->p_addr = a1;
516 xswap(rpp, 0, 0);
517 rip->p_stat = SRUN;
518 } else {
519 /*
520 * There is core, so just copy.
521 */
522 rpp->p_addr = a2;
523 while(n--)
524 copyseg(a1++, a2++);
525 }

2010年11月28日日曜日

第2回 V7から始めるUNIX講座 まとめ

第2回はexec()です。
前回まででfork()をざっと見ましたので、新しく作ったプロセスを別プロセスに化けさせるexec()です。

ソースコードはこちら
http://www.tamacom.com/tour/kernel/unix/S/98.html#L22

Wikiによれば
http://ja.wikipedia.org/wiki/Fork#Fork-Exec
fork()によって子プロセスが親プロセスのコピーとして生成され、exec()システムコールを呼び出すことで(子プロセス)自身の内容を置き換える。
子プロセスがexec()を呼び出すと、そのアドレス空間の内容は全て失われ、指定されたプログラムを実行するためのアドレス空間のマッピングが設定される。これをオーバーレイと呼ぶ。
とあります。
→なのでexec()するとfork()した時にコピーした(環境変数:スタック?)が消えてしまうので、とっといて積み直す。
exec()をまたがって保持するようにしている。
ソースのどこだったか、ちょっと不明です。

ではソースコードを見ていきますと


22 exec()
23 {
24 ((struct execa *)u.u_ap)->envp = NULL;
25 exece();
26 }


実体はexece()ですがパラメータがない?
放送では、filename, agrc, argp, envを渡すと言われたような?

37 if ((ip = namei(uchar, 0)) == NULL)

namei関数でOSのファイルをサーチする機能をコールします。
ファイル名からinodeを読み込んで、それのメモリ上のポインタを返します。inodeについては後述。

●inodeに関して
UNIXではファイル名はファイルの実体を示していない。
PATHもファイル名の拡張でしかない。
例えばハードリンクを使えば同じ実体に複数のファイル名を付与することが可能になる。
そのため、ファイル名では実体を特定できない。

ファイルの実体はinode(iはindexのi)で管理している。
inodeについては、inode.hを参照
http://www.tamacom.com/tour/kernel/unix/S/61.html

構造体inodeにファイルを管理するための情報(userid,groupid,inode)などを保持しています。
13個(NADDR)分のエントリ?を確保しているとのことでしたが、ちょっと理解が追いついてないです。

lsの-iオプションでinode番号が見られる。
inodeの個数はファイルシステムを作るとき(mkfs)に決まる。
→以前inodeの数が上限に達してDISK容量が余っていたにも関わらずファイルが作れなくなったことがあります。
DISKはあっても管理情報がいっぱいになるとファイルが作れなくなります。

v7の時にはファイルシステムは一種類しかなかった。
当時の他のOSではファイルを作る時にファイル名の他にあらかじめサイズを決めるとか色々制約があった。Unixではサイズを自動的に拡張できるので画期的だった。

現在のUnixのファイルシステムは全てv7の頃のものの派生。
→そのためまずV7でファイルシステムを勉強してから他のファイルシステム(LongFileName,NFS)の理解も早くなる。
Ext2,3はBSDの拡張のひとつ。

カーネルの中でのファイルの読み込み:User構造体に情報をセットしてreadi を呼ぶ。
readi
http://www.tamacom.com/tour/kernel/unix/S/94.html#L19

inodeについてはWiki参照
http://ja.wikipedia.org/wiki/Inode

41 if(access(ip, IEXEC))
access関数で実行権限をチェックします。

50~93行 余りわかりませんでした。

96 if (getxfile(ip, nc) || u.u_error)
gettxfile: 新しいテキストをinodeから読み込む。

168 readi(ip);
としている。
execはreadの変形といえます。

text領域(機械語のコードを格納)にも読み込める。
そのため他のプロセスに化けるというか、自分自身を他のプロセスのイメージで塗り替えるというのが実体?
プログラムを実行するには、PC(プログラムカウンタ)に次に実行するアドレス(例:関数呼び出ししたらリターンしたときに戻る場所をセットしておく)を指定した実行ファイルのものに書き換えてやるってことになる?

実行ファイルのヘッダにエントリポイントが書いてあってそれをプログラムカウンタにセットするするってことのようですがそれだと実行ファイルを生成(コンパイル)した際に実行するアドレスが決まっているということ?

別プログラムなら別の仮想空間で実行されるので同じアドレスでも問題なし。
同じプログラムを複数実行しても、実体は別として複数のプロセスが動くので同じアドレスでも問題なし。
ってことのように思えます。

第1回 V7から始めるUNIX講座 復習

先々週から始まった、V7から始めるUNIX講座

まだまだ知識不足ですね。
第2回目が始まる前に30分ほど復習の時間をとっていただけましたので、メモを書いておきます。

第1回のまとめは以下参照
http://xiangcai.at.webry.info/201011/article_7.html


●SWAP、Paging
SWAP、Pagingについては問題なし
仮想記憶を実現するには、ハードウエアサポート(MMU)が必要になる。

(余談)
SUN1は68000を使っていたが、68000はMMUを搭載していない。
どうやって仮想記憶を実現したかというと68000を2つ搭載していて
1つめのCPUがこけたら2つめのCPUで復旧するという方法で実現していた。

SUN1について
http://ja.wikipedia.org/wiki/Sun-1

68000の仮想記憶については以下の「MC68000 での仮想記憶のサポート」参照
http://ja.wikipedia.org/wiki/MC68000

仮想記憶について
http://ja.wikipedia.org/wiki/%E4%BB%AE%E6%83%B3%E8%A8%98%E6%86%B6


●仮想記憶に関する補足
仮想記憶は参照の局所性(プログラムが限られた時間内では特定のページのみアクセスする)を利用して必要なページのみメインメモリ内に保持することで、実メモリ以上のプログラムを見かけ上同時に実行しているかのようにみせることが出来る。

使わないページのHDDへの退避について
LRUアルゴリズムに従ってページをHDDへ退避します。
FreeBSDでは、2 Way Clock arugorizumu?を使っている
→2 Way Clock arugorizumuで検索しましたがヒットしませんでした。

下記のページの「ページ置換え」のところに「クロックアルゴリズム」という記述がありますが、これだろうか?
http://www.multisoft-lab.com/os/memory.html

●Pageについて
最初から4KBに分かれていて、問答無用でぶった切り


●スタックとヒープ
C言語の実行可能ファイルにおけるフォーマットを理解する必要がある。
→リンカ・ローダ実践開発テクニック(坂井 弘亮著)が参考になります。
ネットだとこの辺とか
http://www.coins.tsukuba.ac.jp/~yas/coins/syspro-2000/2000-04-17/process-memory.html
http://www.ertl.jp/~takayuki/readings/info/no02.html

以下のセクションに分かれている
header
text
data
bss
heap
stack
以下の図参照(こんなイメージ?)
画像


新たな疑問
forkはプロセスID以外まったく同じコピーを作るとのことでしたが、これらのセグメントも全てコピーしている?
heapは下に伸びる、stackは上に積むと、どっかでぶつかったりしないのだろうか?
1つのプロセスで確保できるメモリは2の16乗(65536)つまり64KB(1024×64)?

●forkについて
大体OK
forkが二度リターンする(とっても重要)

以下のコードで実装しているのですが


503 if (save(u.u_ssav)) {
504 sureg();
505 return(1);
506 }



ここのsaveが数少ないアセンブラのコード
http://www.tamacom.com/tour/kernel/unix/S/1.html


.globl _save
714 _save:
715 mov (sp)+,r1
716 mov (sp),r0
717 mov r2,(r0)+
718 mov r3,(r0)+
719 mov r4,(r0)+
720 mov r5,(r0)+
721 mov sp,(r0)+
722 mov r1,(r0)+
723 clr r0
724 jmp (r1)


スタックにレジスタの値を退避して、r1へジャンプしているのは分かるのですがどうやらこの辺は核心部分らしく、まだピンと来ません。
何度も出てくるそうなので、今のところは、ここまでとしておきます。
カーネルにおけるタスクのスイッチングについても、今後の課題

2010年11月27日土曜日

GingerBread Tabletは世界初は東京発か!!

まだ、N1にもGingerBreadは振ってきてませんね。
先週来たのはバグフィックスぽい。

N1への提供は12月6日になるのではとのもっぱらの噂です。

それとは別にWoow! Digitalという聞いたことがないメーカから、12月にGingerBreadのTabletを出すかもという情報が出てきました。
名前は、「The One」
画像


http://www.gapsis.jp/2010/11/android-23gingerbreadwoow-digital-one12.html

NVIDIA Tegra 2
OSにはGingerbread
内蔵メモリは1GB
ストレージは16GBを
ディスプレイは10インチのTFT液晶で、解像度は1024×600。
タッチパネルは静電容量方式
対応するネットワークはWi-Fi(IEEE802.11b/g)と3G。Bluetoothもサポート
この高スペックで想定価格は42,000円程度。

おいおい、これホントなら買うしかないだしょ。

Camanjiのタブレットも気になりますが、スペック的には、「The One」ですね。

2010年11月21日日曜日

第1回 V7から始めるUNIX講座 まとめと疑問

先週から始まった、 V7から始めるUNIX講座、UST中継しますが保存しないので記憶および視聴者の方のつぶやきを元にまとめながら、疑問に思ったことを書いていきます。

メモ書きなので系統だった書き方になっていませんがご容赦を

はじめに
カーネルソースは/usr/sysの下
総ステップ数は25KSくらい

1、SWAPとPagingの違い
UNIXでいうところのSWAPとPagingの違いについて

●SWAPはメモリからプログラム全体をハードディスクに追い出す。
そのため、完全にプログラムを実行できる(メモリ上)、できない(HD上)のいずれかになる。
(補足)
Lions本によれば、proc構造体のp_addrにより以下のように判断できるようです。
メインメモリ内:ブロック番号
HD内:ディスクレコード番号

●Pagingは、プログラムをPageと呼ばれる単位(4KB)に分割して、使っていない(今後も使わないだろう)部分をあるアルゴリズムを使って決定しHDに追い出して(ページアウト)、現在実行中のものだけをメモリ上に保持する。

プログラムがページアウトされたメモリにアクセスしたら、ストップしてハードディスクから読み出し(ページイン)して実行する。
そのため16MBのメモリしかなくても、それ以上のプログラムを実行することが出来る。

Pagingという説明でしたが、つまり仮想記憶をサポートするということになると思います。
仮想記憶を実現するためにハードウエアレベル(MMU)でも対応が必要。
そのため初期のUNIXではSWAPしかなかった。

SWAPとPagingの違い:イメージ
画像


仮想記憶のイメージ:不連続な実メモリをプログラムからは連続したメモリ領域のように見せる。
仮想記憶の実態は、使っているところだけメモリに保持していて、使ってないところはHDに内に追い出しているので実メモリ以上のプログラムを(見かけ上)同時に動かすことができる。
画像


実行していない部分を追い出すのは、リストみたいなものを持っていて古いものを判別している?
画像


疑問
Page単位でプロラムを分割するということですが、
1、最初から4KBに分かれている?あるいは、だれかが4KB単位に分割する?
2、4KBに分かれるときは、問答無用?あるいは関数単位とかでなるべく固める?
3、最後のページで4KBに満たないときは、何か値を詰めたりする?

2、スタックとヒープ
環境変数はスタックの奥底に格納されていて、execしても書き換わらない。

ちょっとここの説明分かりませんでした。
一般的に
スタック:ローカル変数、関数呼び出しの際の引数や関数呼び出し元(関数の実行が終了した後の戻り先)の格納場所として使われます。 置かれた変数は関数の実行が終了した時点で消滅します

ヒープ:ヒープ領域に確保された値はスタック領域におかれた変数と違い、関数の実行が終了しても存在し続けます

3、procとuser
proc構造体はスワップアウトされない(必ずメモリに存在する)スケジューラが使用するため。
user構造体はスワップアウトされる場合がある。

user構造体に参照しているフォルダ、ファイル等が保持している。
フォルダを削除できないのはこれを見ているから

4、TSS(Time Sharing System)
スケジューリングして瞬間で動いているのは1つのプロセス。
停止した状態をproc構造体に保持しておいて、順番に実行している

5、fork
forkすると全てのものを親から受け継ぐ(コピーする)。違うのPIDのみ。
ただし、親プロセスが消費した時間は子プロセスに引き継がないで0リセットする。→458~464行
わざわざforkしてからexecしてるのは、パイプとリダイレクト読むと分かってくる。乞うご期待

fork()
http://www.tamacom.com/tour/kernel/unix/S/98.html#L422
431行:mallocとあるがCのメモリ確保ではなくてメモリ上に領域が取れるかのチェック
438~445行:プロセス数の最大までループしながら、proc構造体の空いてるところを探している。
457行:newproc()で実際のプロセスの生成を行っている。
458~464行:生成した子プロセスにプロセスIDをセット、時間は0でリセット

newproc()
http://www.tamacom.com/tour/kernel/unix/S/96.html#L426
442行:プロセス数の上限は、30000
461~471行:ほとんどのものを親からコピーする

476~487行:ファイルはディレクトリのアクセスカウントをインクリメントする。コピーして親が参照しているファイルについても継承するため。

fork関数は2度リターンする。
503~506行:1をリターンしている。子ププロセス側のリターン:forkの457行目で分岐して、子プロセスの初期化実施。ただしリターン先は子プロセスのfork関数
529行:0をリターンしている。親プロセス側のリターン:forkの457行目で分岐して、親プロセスの処理実施

(疑問)
今まで何度もforkとexecの話は聞きましたが、どうしても分からなかったのは、「Forkが2回リターンする」ってのを知らないせいだというのが先週の説明でやっと分かりました。すっきりー(^^)

ですが、普通にリターンしてしまうと、後続の処理が実行できないので、どうやってるんだろう?
この辺のコードでうまくやっててくれるとは思うのですが?


503 if (save(u.u_ssav)) {
504 sureg();
505 return(1);
506 }

       

fork(newporc)が2回リターンするイメージ
画像


6、FD(file descriptor)の実態
ファイルをオープンした時には、0~19の小さな整数が返る。

実装は以下の通り。
http://www.tamacom.com/tour/kernel/unix/S/85.html#L218

user構造体の*u_ofile[NOFILE]に保持しているので、配列の上限NOFILE(20)以上のファイルは開けない。





Linuxシステムコールプログラミング (エッセンシャルソフトウェアガイドブック)
技術評論社
山森 丈範

ユーザレビュー:

amazon.co.jpで買う
Amazonアソシエイト by Linuxシステムコールプログラミング (エッセンシャルソフトウェアガイドブック) の詳しい情報を見る / ウェブリブログ商品ポータル

2010年11月17日水曜日

禁書が届きました

日曜日のV7から始めるUNIX講座

いや面白かった、V7の関数って一つ一つは短い、1ページに収まるくらいです。
いきなりLinuxのソースコード見るのは確かに敷居が高すぎる。

まずは、V7で勉強して基本を押さえるってのは、良いなと思いました。
実は放送が始まるまでに家の中探してたのですが、ついに見つからずにポチッた
Lions' Commentary on UNIX
が届きました。
放送で紹介されてたUNIXカーネルの設計も一緒に
画像


Lions' Commentary on UNIX自体はV6の解説本らしいですが、forkのところ読んでみたらV7と一緒でしたね。
前半がソースコード(コメント付き)、後半に解説という構成の本です。
前書きを読むとは元々は2冊だったようです(ソースコードと解説)
まえがきを読むと、出版までに紆余曲折があったのことが分かります。
表紙にあるようにUNIXに興味がある人たちがコピーを繰り返してアングラで広まっていたそうです。

ソースコード部分は9,000ステップ
1人でも読めなくはない。一説によると1人で理解、保守できるのは10,000ステップが限界ってことなのでそれを若干下回る分量になります。
それをこうやって書籍で見れるのは素晴らしいですね。

基本趣味なのですが、OSについて理解が深まることは、仕事にも間接的にいい影響があるのではないかと思います。
先人に敬意を払いつつ、まずは読み進めてみることにします。

都内ですが、Lions' Commentary on UNIXの読書会も開催されているようです。
http://atnd.org/events/9595
さっそく登録してみました。

今後、LinuxベースのOS(Android, Meego, Linaro)はますます発展していくでしょうから、楽しみです。

2010年11月14日日曜日

VMWare Playerで仮想ディスクのサイズを変更する

えっと、普段は64ビットマシン(Windows7)でAndroidのフルビルドとかやってます。
VWMWare Player3.1.2にUbuntu10.04をゲストOSとしてインストールして環境構築してます。
当初40GBほど仮想ディスクを割り当てたのですが、あっという間にディスクが減ってきます。
残り20%:8Gほど。8GBぽっちだと、repo syncでソース取ってくるくらいなら良いですが、Makeしたら間違いなく足らなくなります。

ということで仮想ディスクのサイズ変更をしたいなと、
仮想マシン→仮想マシンの設定 ハードディスクのユーティリティで増やしても、Ubuntuにログインしてdfしても、あれ容量増えてない。
調べてみると、VWMwareで設定変更しても、それはゲストOSに反映されないので、パーティションツールとか使って広げてねと。
う~ん、けっこう悩みました。色んなサイトに書いてあるんですが、皆さんさらっと文章で書いてあるだけで手順がイマイチ分からない。ということで今日試行錯誤してみました。

一応念のため「パーティション情報を修正するので、あらかじめバックアップ等を行い、手順を良く確認してから作業を行って下さい」

●準備するもの
GParted 0.7.0.4 パーティションの追加、サイズ変更、削除するツール(パーティションの結合は未対応)
以下のサイトからLiveCDのISOのイメージをダウンロードして下さい。
http://gparted.sourceforge.net/download.php

●VMWare側の設定
仮想マシン→仮想マシンの設定
画面でハードディスクを選択します。
画像


ユーティリティで「拡張」をクリックします。
画像


ディスク容量の拡張ウインドウがポップアップするので、「ディスク最大サイズ」でサイズを大きくして下さい。
ここに書いてあるように「パーティションおよびファイルシステムのサイズは変化しません」
画像


拡張ボタンを押すと拡張が始まります。
画像


拡張が完了します。
画像


仮想マシン設定画面に戻り、ディスクサイズが拡張されたか確認します。
画像


●GPartedのブート設定
GPartedはLiveCDのISOイメージなので、仮想マシンにおいて、GPartedをブートするように設定します。

まずは、そのままだと仮想ディスクからブートしてしまうのでBIOSでブートの優先順位を仮想CD-ROMを一番上にします。
といっても、実マシンのBIOSではなく、仮想マシンのBIOSです。
仮想マシンでBIOSを起動するには、VMware構成ファイルを編集します。
ただのテキストファイルなので、メモ帳等で開いて以下の設定を追記します。
bios.forceSetupOnce = "TRUE"

仮想マシン→仮想マシンの設定
画面でCD/DVDを選択します。
「デバイスのステータス」で起動時に接続にチェックを入れます。

「接続」でISOイメージファイルを使用するを選択し、参照ボタンでダウンロードしたGPartedを指定します。
画像


仮想マシンを再生します。BIOS画面が表示されます。
矢印ボタンでBootタグを選択します。CD-ROMを一番上に持ってきます。”-”を押すと上に移動します。
F10 Save & Exitで設定を保存してリブートします。
画像


●GPartedでの作業
リブートすると、GPartedが仮想CD-ROMから起動します。
GParted Live(Default settings)でエンターキーを押下します。
画像


キーマップの選択
タブキーで移動して「select keymap from full list」でエンターキーを押下します。
画像


リストから「Japanese / PC 110 / Standard」を選択して「OK」を押下します。
画像


言語設定
言語設定画面が表示されるので、15を入力してエンターキーを押下します。
画像


起動モードの選択
そのままエンターキーを押下します。
画像


GPartedが起動します。
画面上で110GBが未割り当てになっているので、こいつを「/dev/sda1」に追加したいんです。
画像


対応しているフォーマットを確認しておきます。
Ext4にも対応してるのでOKです。
画像


まず、拡張領域のSWAPを削除します。linux-swapを右クリックして「Delete」を選択します。
画像


SWAPが未割り当てになりました。
画像


拡張領域「/dev/sda2」を削除します。/dev/sda2を右クリックして「Delete」を選択します。
画像


これで、「/dev/sda1」以外のパーティションが1つになりました。
画像


「/dev/sda1」のサイズを変更します。右クリックして「リサイズ/移動」を選択します。
画像


別ウインドウがポップアップするので、上の領域の右端をドラッグします。
画像


後方の空き領域にSWAP用に2GBくらい残して広げます。
画像


「/dev/sda1」のサイズが変更できました。
画像


未割り当てで右クリックして「New」を選択します。
画像


種類で「拡張パーティション」を選択して「Add」を押下します。
画像


拡張パーティションが作成されました。
画像


未割り当てを右クリックして「New」を選択します。
画像


種類は「論理パーティション」、ファイルシステムは「linux-swap」を選択して「Add」を押下します。
画像


Swapの追加が完了します。
画像


メニューの「Apply」ボタンを押すと、確認のウインドウがポップアップするので「Apply」を押下します。
画像


パーティションの変更の適用が始まります。「全ての操作が無事完了しました」と表示されたら「Close」ボタンを押下します。
画像


変更が適用されました。「/dev/sda1」「/dev/sda2」が作成されます。
画像


GPartedから起動しないように、設定を元に戻します。
画像


仮想マシンを再起動します。

Ubuntuにログインして、サイズの確認を行います。
ちなみにこれが変更前の状態です。
画像


そしてこれが変更後の状態です。
使用可の領域が約114GBに増えました。
画像


ちょっとややこしいですが、順番に作業すれば、難しくないと思います。
仮想ディスクの追加でも良いのですが、けっきょくゲストOSでFDISKでパーティションテーブルを変更してマウントポイントを決めてと手間はそんなに変わらないのでディスク容量が余っていましたので、がつっとでっかく容量を増やす方法を試しました。

UbuntuでAndroid端末を認識させる

UbuntuにAndroidアプリの開発環境を構築するところまでいったので、次は実機の接続に関して書いておきます。

●Windowsの場合
Windows版なら、AndroidSDKの配下のusb_driverの下にドライバがあるので接続してウイザードが起動したら、ここを指定してやれば基本OKです。
Galaxy sは別途kiesというツールを入れないとドライバ入らなかったです。
以下参照
http://xiangcai.at.webry.info/201010/article_11.html

●Ubuntuの場合
Ubuntu(Linux)には、デバイスドライバは特にありません。
ただ、Ubuntuでは外部のデバイスと接続するには、デバイスファイルが必要です。
/dev/xxxxxxxxってのです。
デバイスファイルは手動でも書けなくはないですが、カーネル2.6以降は新しいデバイスの接続、切断がカーネルから通知されるようになりました。
この通知をudevというプロセスがデーモンとして常駐(udevd)していて受け取って、デバイスファイルの作成、削除を良しなにやってくれる仕組みになっています。
試しにPSコマンドで見てみると、4ついますね。

oono@ubuntu:~$ ps -aux | grep udev
Warning: bad ps syntax, perhaps a bogus '-'? See http://procps.sf.net/faq.html
root 342 0.0 0.0 17032 1116 S 07:08 0:00 upstart-udev-bridge --daemon
root 344 0.0 0.0 17216 1028 S 07:08 0:00 udevd --daemon
root 475 0.0 0.0 17212 956 S 07:08 0:00 udevd --daemon
root 476 0.0 0.0 17212 908 S 07:08 0:00 udevd --daemon

ただ、udevも何も情報がないところからデバイスファイルを作れないので作る際の情報(ルール)を教えてあげる必要があります。
ルールは、「/etc/udev/rules.d」というディレクトリに置きます。
見てみると、あれ?数が少ないですね。
READMEを見てみると、ここにはローカルなルールを置けとありますね。
パッケージなどが見るルールは「/lib/udev/rules.d」にありました。
私が最初に見たのは8.04だったので、それから変わったのでしょうね。間違ってシステムが使うルールを改変したりすることがなくなるので良いことです。

●ルールの書き方
http://developer.android.com/guide/developing/device.html
のDeveloping on a Deviceの欄に手順が書いてあります。

/etc/udev/rules.d/51-android.rules
というファイルを新規で作って、以下の一文を追記します。
SUBSYSTEM=="usb", SYSFS{idVendor}=="0bb4", MODE="0666"

USBデバイスでベンダーIDが0bb4でパーミッションが0666で作成するという意味です。
ベンダーIDは各メーカが個別で重複しないように保持しています。
http://mcn.oops.jp/wiki/index.php?USB/PnP

そのため、接続するAndroid端末のベンダーIDを調べて指定する必要があります。

●ベンダーIDの調べ方
http://developer.android.com/guide/developing/device.html
の下の方にUSB Vendor IDsという欄があり、分かっているものの一覧があります。
このベンダーIDを使えば良いです。




ManufacturerUSB Vendor ID
Acer0502
Dell413c
Foxconn0489
Garmin-Asus091E
HTC0bb4
Huawei12d1
Kyocera0482
LG1004
Motorola22b8
Nvidia0955
Pantech10A9
Samsung04e8
Sharp04dd
Sony Ericsson0fce
ZTE19D2


この一覧に乗っていないベンダーの場合は、「lsusb」というコマンドで調べることが出来ます。
http://www.atmarkit.co.jp/flinux/rensai/linuxtips/510showusbdev.html

●実際に接続
手元にあるAndroid端末を使ってやってみました。

★NexusOne
接続してlsusbしても情報が出てきません。どうやらホストOS(Windows7)側に接続を持っていかれてるようです。
なので、VMWareの右下にあるアイコンを右クリックして「接続(ホストから切断)」を選択します。
アイコンが有効になって、点滅すればOKです。

画像


lsusbの実行結果が
Bus 001 Device 002: ID 18d1:4e12

51-android.rulesに以下を追記します。
SUBSYSTEM=="usb", SYSFS{idVendor}=="18d1", MODE="0666"

NexusOneを抜き差しします。/dev/の下に以下のデバイスファイルが追加されていました。
brw-rw---- 1 root disk 8, 16 2010-11-14 15:39 sdb
crw-rw---- 1 root disk 21, 2 2010-11-14 15:39 sg2

Eclipseを起動してDDMSを起動します。Devicesに名前が表示され、OSも2.2.1になっています。
画像


AndroidSDKのtoolsの下へ移動してadb shellを実行しています。
ubuntu:~/software/android-sdk-linux_x86/tools$ ./adb shell
$ ls
config
cache
sdcard
acct
mnt
d
etc
system
sys
sbin
proc
init.rc
init.mahimahi.rc
init.goldfish.rc
init
default.prop
data
root
dev
$
ということでadbコマンドも実行可能なので問題なく接続しています。

以下同じなので省略しますが
Galaxy s
Bus 001 Device 004: ID 04e8:681c Samsung Electronics Co., Ltd

HT03-A
Bus 001 Device 006: ID 0bb4:0c02 High Tech Computer Corp.
何故かHT-03Aはルールを記述しなくても認識しました。

GDDフォン
Bus 001 Device 007: ID 0bb4:0c02 High Tech Computer Corp.
同じく何もしなくても認識されました。

IS01
Bus 001 Device 008: ID 04dd:9337 Sharp Corp.

ということで最終的に以下の記述を追記することでUbuntu上のEclipseおよびadbからアクセスできるようになりました。

SUBSYSTEM=="usb", SYSFS{idVendor}=="18d1", MODE="0666"
SUBSYSTEM=="usb", SYSFS{idVendor}=="04e8", MODE="0666"
SUBSYSTEM=="usb", SYSFS{idVendor}=="04dd", MODE="0666"

-----
--------
AUTHOR: 電脳羊(Android Dream)
TITLE: Ubuntu10.04(64bit)でAndroidアプリの開発環境の構築
DATE: 11/14/2010 11:35:00 AM
PRIMARY CATEGORY: 開発
CATEGORY: Android
STATUS: publish
ALLOW COMMENTS: 1
ALLOW PINGS: 1
CONVERT BREAKS: 1
-----
BODY:
Ubuntu10.04でAndroidアプリを開発するための開発環境を構築します。
せっかくなのでNDKの環境も併せて構築します。

●必要なもの
・Eclipse Galileo(3.5.2)
→Helios(3.6)だとADTが対応していないのでGalileoを使います。
・Eclipse 日本語化言語パック (サードパーティ版)
・ADT 0.9.9
・AndroidSDK
・AndroidNDK

●ダウンロード
Eclipse Galileo(3.5.2)
3.5.2のLinux用64ビット版をダウンロードします。
http://www.eclipse.org/downloads/
右下の「Related Links」の下にEclipse Galileo(3.5)というリンクがあるのでクリック

画面から辿って必要なファイルをダウンロードします。
画像


Eclipse 日本語化言語パック (サードパーティ版)
http://sourceforge.jp/projects/blancofw/wiki/nlpack.eclipse
3.5.2 Stream Buildをクリックします。
各種パッケージ用の日本語化言語パックがあるのでダウンロードしたEclipseに合わせて選択して下さい。

ADT 0.9.9
Eclipse上でオンラインで取得します。ファイルとしてダウンロードする必要はありません。
http://developer.android.com/sdk/eclipse-adt.html
に記述があるようにEclipseで新規ソフトウエアの追加で「https://dl-ssl.google.com/android/eclipse/」からダウンロードします。

AndroidSDK
http://developer.android.com/sdk/index.html
Linux(i386)をダウンロードします。

AndroidNDK
http://developer.android.com/sdk/ndk/index.html
Linux 32/64-bit(x86)をダウンロードします。

●ファイルの解凍
Eclipse
ダウンロードしたファイルを適当な場所に解凍します。
tar -xzvf file_A.tar.gz とすればtar.gz形式のファイルを解凍と展開を一度に行います。

解凍したディレクトリで、./eclipse を実行して起動確認(メニュー、メッセージ類は英語)します。
Eclipseを終了します。

Eclipse 日本語化言語パック (サードパーティ版)
unzip file.zip を実行します。日本語化したファイルがeclipseに展開されます。
解凍したディレクトリで、./eclipse を実行して起動確認(メニュー、メッセージ類は日本語)します。

AndroidSDK
tar -xzvf android-sdk_r07-linux_x86.tgz を実行して解凍します。

AndroidNDK
unzip android-ndk-r4b-linux-x86.zip を実行して解凍します。

●ADTのインストールと設定
Eclipseを起動します。
ヘルプ→新規ソフトウエアのインストールを選択します。
ウインドウがポップアップするので、作業対象の入力欄に「https://dl-ssl.google.com/android/eclipse/」を入力して追加ボタンを押下します。
画面真ん中にDeveloper Toolsと表示されるので、全てのオブジェクトを選択して「次へ」押下します。
画像


そのまま「次へ」を押下します。
画像


同意を選択して「完了」を押下します。
画像


プラグインのダウンロードが始まります。
画像


セキュリティー警告が表示されますが、「OK」を押下します。
画像


ソフトウエア更新
「はい」を押下して、Eclipseを再起動します。
画像


Eclipseが起動したら、ウインドウ→設定を選択すると設定画面がポップアップします。
上から2番目に「Android」が追加されていることを確認します。
画像


Androidをクリックします。以下の画面が表示されるので、そのまま「Proceed」を押下します。
画像


設定画面でSDK Locationに解凍したAndroidSDKのパスを設定してOKを押下します。
画像


これでEclipse上でAndroidアプリの開発が出来るようになりました。

●AndroidSDKのバージョンアップ
ダウンロードしたAndroidSDKには最低限のものしか入っていません。必要なものをダウンロードします。
Eclipseの画面でウインドウ→Android SDK and AVD Managerを選択します。
画像


Installed Packagesを押下して「Update ALL」を押下します。
Updateの一覧が表示されます。
画像


Accept Allをクリックして、「Install」を押下します。インストールが始まります。
画像


若干時間が掛かります。

ADBのRestart確認画面が表示されるので「はい」を押下します。
画像


インストールが終わったら「Close」を押下した作業を完了します。
画像





Android開発 最新動向レポート2010 (CD+冊子)
インプレスR&D
日本Androidの会

ユーザレビュー:

amazon.co.jpで買う
Amazonアソシエイト by Android開発 最新動向レポート2010 (CD+冊子) の詳しい情報を見る / ウェブリブログ商品ポータル

Google Androidプログラミング入門
アスキー・メディアワークス
江川 崇

ユーザレビュー:

amazon.co.jpで買う
Amazonアソシエイト by Google Androidプログラミング入門 の詳しい情報を見る / ウェブリブログ商品ポータル