2006-04-01から1ヶ月間の記事一覧

C言語の拡張

Linuxカーネルもgcc拡張を多用しているが,Ken Thompson氏が書いたPlan9コンパイラ(通称Ken C?)も,ANSI Cから拡張がなされている.それらは基本的にC99なんだけど,(C99前に実装されたってのもあるんだろうけど)微妙に文法が違っているので,注意が必要で…

その他,コンパイラがらみで

C99には関係ないけど,そういえばプリプロセッサで#ifが使えなかったな.あと,ヌルポインタはNULLではなく,nilを使う.

C99 changes vs C89

ccのコードの中にこんなファイルがあった. Named initializers (Designated Initializer)がDoneになっているなぁと思って,確かめてみたら,C99と同じ書き方でちゃんと動いた.ということで,C99と同じに書けるけど,既存のコードを読むには,Plan9拡張があ…

libdrawとlibthread

rioが実際にマウス(/dev/mouse)を読んで(read)いるところを追っていくと,libdrawというライブラリに行き着いた.libdrawはグラフィック関係のライブラリだ.rioは,libdrawが提供するreadmouse(2)関数を呼び出してマウスのデータを取得している. libdrawで…

リオの男

今日は,小ネタで. Plan9のプロセスにもUNIXと同様に所有者の概念がある.所有者はps(2)コマンドや/dev/userで確認できる.ところで,先日見たfilsysinit関数の冒頭に次のようなくだりがある. 135: fd = open("/dev/user", OREAD); 136: strcpy(buf, "Jean…

pipe(2),#|,#s

pipe(2)と#|(パイプデバイス)を簡単に比較すると, pipe(2): UNIX同様,親子プロセス間で通信できるシステムコール. #|: UNIXの名前付きパイプに相当し,ファイルにマッピングされる.mkfifoのようなシステムコールではなく,デバイスドライバとして提供さ…

emalloc

emallocというのは,エラー処理付きのmalloc(2)関数で,メモリ確保に失敗したら,error関数を呼んで終了処理をしている. 46: void 47: error(char *s) 48: { 49: fprint(2, "rio: %s: %r\n", s); 50: if(errorshouldabort) 51: abort(); 52: threadexitsall…

srvデバイス

また,日が開いてしまった.なかなか毎日更新するのは難しいなぁ.UNIXで名前付きパイプ(またの名をFIFOスペシャルファイル)を作る場合は,専用のライブラリ関数mkfifo(3)を使う必要があるが,Plan9では,srvデバイス(#s)を使って実現できる.man srv(3)の例…

/mnt/wsys

/mnt/wsysと/devには同じリソースがmountされているが,rioの提供するリソースに集中するために/mnt/wsysを見てみよう. term% lc /mnt/wsys cons cursor label screen text wdir winid wsys consctl kbdin mouse snarf wctl window winname各ウィンドウはID…

rioウィンドウシステム

rioはPlan9のウィンドウシステムである.rioはマウスを多重化して,プロセスごとに/dev/mouseが存在しているように見せかけると書いた.これはマウスに限らず,コンソールやスクリーンに対しても同じことが言える. nsコマンドでrioが起動しているときの名前…

Glendaグッズ

Plan 9 Gear based on artwork by Renée French.こんなのがあるんだ. いまさら,はてなブックマークでタグをつける方法がわかった.

マウス

マウスも当然ファイルとして抽象化されている.UNIXなら/dev/mouse*とか,/dev/mse*に相当する.mouseをcatすれば,ポインタの状態を得ることができる.ここまでは一緒だ.これをウィンドウシステムがどのようにプロセス(もしくはプログラマ)に見せるか,と…

共有ライブラリの仕組みがない

9fansで共有ライブラリ,動的ローディングの話題が出ているが,Plan9は共有ライブラリを持たない.すべての実行ファイルが静的リンクされている. 背景にどんな理由があるのか知らないが,今時のシステムはディスクもメモリもいっぱい積んでいるから,テキス…

namec〜名前からチャネルを取得する

今まで何度か出てきたが,追求を避けてきたnamec関数を見ていこう.と言ってもnamecは350行ほどの大きな関数なので,まずはenvデバイスを例にカーネルデバイスの場合からはじめよう. カーネルデバイスのファイル名は#から始まる.envデバイスの場合は#eだ.…

誰も読まないOSのソース・コード

ってIT PROの記事がちょっと前に話題になっていた.誰も読まないOSのソース・コードとか. 赤松氏の主張の是非は置いておいて,実用的な規模のOSのソースコードを読むなら,今のLinuxなどよりも,歴史的理由などによるしがらみが少なく,コンセプトと実装の…

initプロセス (ユーザコンテキスト)

initプロセスのユーザコンテキストは_main関数から始まる.中身はstartbootを呼んでいるだけ. pc/init9.c 1: extern void startboot(char*, char**); 2: 3: void 4: _main(char *argv0) 5: { 6: startboot(argv0, &argv0); 7: }initcodeは標準入出力をopen…

ksetenv (環境変数もファイル)

環境変数の設定はksetenv関数で行なっている.環境変数は名前と値の組だから,単純にハッシュでも作っているのかなと思ってしまうが,Plan9では,環境変数もファイルとして表わされることを思い出そう. 環境変数cputypeの場合は,#e/cputypeというファイル…

再びuserinit

再びuserinit関数に戻って.テキストセグメントは次のように設定している.initcodeってのが実行コードらしい. port/portdat.h 750: extern uchar initcode[]; pc/main.c 258: s = newseg(SG_TEXT, UTZERO, 1); 259: s->flushme++; 260: p->seg[TSEG] = s; …

initプロセス (カーネルコンテキスト)

昨日,initプロセスに話が及んだので,その辺を追っかけてみよう.userinitで,initプロセスのプログラムカウンタをinit0関数に設定したところまで見た.カーネルの初期化の最後にスケジューラが呼ばれ,initプロセスがスケジューリングされる. pc/main.c 2…

起動時の名前空間

システム起動時にどのように名前空間が構築されるのだろうか.Plan9もUNIXのように,カーネルから最初のプロセスであるinit(8)プロセスが起動され,rcシェルが立ち上がる.そして,名前空間のセットアップは,initプロセス中のnewns(2)で行なわれる.newnsは…

デバイステーブル(devtab)

bindmount関数からcmount関数にも出てきたが,devtabというデータ構造も重要っぽい.devtabはDev構造体の配列で,そのインデックスはチャネルのタイプになっている.そして,チャネルへの操作は次のように,devtab経由で間接呼出しすることになる. port/dev…

ベル研がある場所

はてなマップを使ってみた. map:x-74.4002y40.6836:satellite:w400

Plan9の歴史

Plan9という名前の由来で, そもそも,なぜPlan9かというと,ベル研で作られたUNIXはバージョン8までだったからという説が有力っぽい.なお,公式にリリースされたのはバージョン7まで. と書いたが,UNIX Historyを見て,10th editionまであることに気づい…

はてなダイアリー市民

になった.キーワードが編集できるらしい.

シンボリックリンク

Plan9にはシンボリックリンクがないと書いた.シンボリックリンクが導入されたのは4.2BSDのFFSからだし,SVR3やそれ以前のBSDが使っていたs5fsにはシンボリックリンクはなかった.ベル研純血主義説を唱えるわけじゃないけど,シンボリックリンクもベル研発の…

WACOM FAVO4

衝動買い.プロセスグループ周りを例に,試し書き.なかなかうまく書くのは難しいなぁ.マウスで書いても出来は同じゃなか...

コードリーディングとタブレット

複雑な事象を理解するには図を書いてみることが解決の糸口になることが多い.コード読みも例外じゃない.まだこの日記をはじめてから日は浅いが,図で説明で気からずいぶんわかりやすいのにと思ったことが多い.でも,PC上でドローツールなどを使って図を描…

マウントテーブル

プロセス(Proc)からチャネル(Chan)へのたどり方をまとめたのが次の図だ.この図は,/binに/386/binと/rc/binをbindした結果を示している.mnthashはMhead構造体へのポインタを指している.Mheadはマウントポイントとなるチャネルと,そこに何がマウントされ…

Lucent Public License

ふと気になったので,Plan9のライセンスを調べてみた.Lucent Public LicenseというOSI certifiedのオープンソースライセンスらしい. 日本語訳 (OSG-JP) さまざまなライセンスとそれらについての解説 (FSF) これはフリーソフトウェアのライセンスですが、GN…

bind遊び

なかなか先に進まない名前空間のコード読みだが,具体的なイメージをつけるために,実際にコマンドを使って挙動を追ってみる. 例としてディレクトリaとbを作り,それぞれの直下にhello.txtというファイルを用意する.a/hello.txtには"Hello,world!\n"と書き…