minix

〆(.. )カリカリッ!! Minix3のpick_proc()

たまに気になるMinixカーネルの仕組みということでプロセス切り替えの仕組みというか次に動くプロセスを選択する仕組みであるpick_proc()を読んでみる。 読んでいるソースは2013/05/04時点でのgitツリーなので将来的には変更があるかも。 s/2014/2013/ だっ…

minix3のforkめも

んとなく昨日の続きから。だいたいこんな流れ。 do_fork@servers/pm/forkexit.c -> sys_fork@lib/syslib/sys_fork.c -> do_fork@kernel/system /do_fork.cservers/pm/forkexit.c 31 PUBLIC int do_fork() 32 { 中略 94 /* Tell kernel and file system about…

minix3のシステムコール呼び出しメモ 

たしか1年以上前にMinix本読書会で調べてたはずなんだけど、すっかり忘れてたのでここに書いときます。 モノリシックカーネルとマイクロカーネルの違いを忘れるとダメですねorz このメモの内容はオペレーティングシステム 第3版のP206のメモです。さて、シ…

カーネル/VM Advent Calendar15日目: 今のMinixってどんな感じなのかな。

この記事はカーネル/VM Advent Calendarの15日目の記事です。 Sorry, this article is written in Japaneseさて、Minixと言えば教育用のOSとして有名だと思うのですが(教科書「オペレーティングシステム 設計と実装」とかで)、現在も開発は続いており、SC…

自作カーネルでコンテキストスイッチを実装したいので,Minix3.1.0のやり方を調べる.

Minixでコンテキストスイッチする部分は,処理内容的にkernel/mpx386.sのrestart()っぽいのでこれを見ます. 実装はアセンブラだけど,cからも呼べるようにkernel/proto.hにプロトタイプ宣言があります. _PROTOTYPE( void restart, (void) ); といっても,…

KVM環境でMinixのビルド時間を計測

n7shiさんの日記(カーネルビルド時間)を参考に, KVM環境だとどうかなーと思い,時間を計ってみました.使ったPCの環境はこんな感じです. CPUは「Intel(R) Core(TM)2 Duo CPU T9600 @ 2.80GHz」で, カーネルは「Linux moonlight 2.6.33-rc5-tip+ #1 SMP PR…

minix smpのロック実装

毎度ながら、minix2smpのソースはここ。 http://gsd.unex.es/projects/minixsmp/このソースではロックはlock_mp_kernel()、mp_switching_lock()、mp_heldq_lock ()などの関数がほぼ行っていて、 #smpの実装で追加された部分に関してはそうだと思う。 これら…

MP Configuration Table Entriesの内容

前回書いたとおり、MP Configuration tableは5種類あって、ENTRY TYPEと呼ばれるテーブルがあるので、それを見ていく。ENTRY TYPEの種類。 Entry Description Entry Type Code Processor 0 Bus 1 I/O APIC 2 I/O Interrupt Assignment 3 Local Interrupt Ass…

_trampoline_pmの中身。

こちらも基本的に詳細はコメントに書かれているのでわかりやすい! !*===========================================================================* !* trampoline_pm * !*===========================================================================*…

ap_main()を読む

ap_main()はmp.cにいて、アセンブラで書かれた処理(_trampoline_pm)から呼ばれる。 void ap_main(void) { /* This is the main routine for AP's. This is the entry point before the CPU has been started and jumped to protected mode */ /* Tell BSP …

tramoplineの本体をみてく。

調べているのはここにあるソース。http://gsd.unex.es/projects/minixsmp/ソースにコメントがちゃんと書いてあるのでこれを読めば良いのでうれしい。 trampolineは4段階のステップで行われていますよ。 !*=================================================…

trampolineを見る前に、気分を変えて普段よくでてくる関数でも見るよ。

調べているのはここにあるソース。 http://gsd.unex.es/projects/minixsmp/こいつは直接使うというか、ラップ関数の中から使われる。 void phys_copy_dword (unsigned long source, unsigned long destination); 例えばこんな感じで・・ void LOCAL_APIC_WRI…

mp_start()もそろそろ大詰め。

IPIの初期化が終わったらsend_startup_ipi()をコール。 引数のtrampoline_addrは初期化の時と同じくトランポリンのアドレス、2個目の引数はどのcpuをスタートさせるかを表す。 void send_startup_ipi(u32_t trampoline_addr, int which_cpu) { /* Send START…

send_init_ipi()は名前からしてIPI(Interpurocessor Interrupts)を初期化する関数。

調べているのはここにあるソース。 http://gsd.unex.es/projects/minixsmp/そんでは、関数を見ていくと、引数の1番目(trampoline_addr)はfind_trampoline()で見つけたトランポリンコードのアドレス。 まず分かるのはcmosのデータを読んだり、書いたりして…

minix2のsmp実装をminix3に移植してみるテスト。

まだ、enable_cpu()で必要な処理を実装しているだけでBSPしか見えてないです。 qemuの画面が小さいからアレですが、画面の上のほうにkprintf()でデバッグ用のメッセージ出力させてます。 ハックに使ってるminixのバージョンは3.1.0ですが、smp対応ということ…

次はfind_trampoline()。

調べているのはここにあるソース。 http://gsd.unex.es/projects/minixsmp/ u32_t find_trampoline(void) { /* Find a memory zone suitable for allocating trampoline code. It will be a 0's zone, suposing this is free. */ u32_t addr8; u32_t addr; u…

そして、process_mp_configuration()を見ていくと・・

void process_mp_configuration(void) { /* Scan MP table and find some information about MP configuration */ u32_t next; int cpu_count, bus_count, apic_count, ioint_count, lint_count; int i=mph.mpch_entry_count; u8_t this_entry; struct io_ap…

fpsを読めたら次はload_mph()でMP Configuration Table Headerを探す。

int load_mph(void) { /* Find and load a valid MP config header struct. Return noncero on success */ unsigned addr; phys_copy ( fps.fp_mp_table , vir2phys(&mph) , sizeof(mph) ); if (test_mptable_checksum()) return 1; ADDS_MP_STATUS("MP conf…

mp_start()を見ていく。関数についてるコメントからこいつは、MP Configuration tableを読み込んで、各cpuを起動させるということがわかる。

調べているのはここにあるソース。 http://gsd.unex.es/projects/minixsmp/ void mp_start() { /* Load MP configuraton and wake up each CPU in the system */ u32_t trampoline_addr; int cpu; /* Start messaging to console */ MP_STATUS[0]=0; ADDS_MP…

minixsmp

minixsmpの実装勉強はmp.cに入っていく。まず最初は、enable_cpu()。 PUBLIC void enable_cpu(int cpu, int echo) { /* Mark a CPU as usable, enables it, and open interrupts. If echo is nonzero, print a message of successfully enabling */ if (cpu_…

minix2.0.0.のsmp実装の勉強

miniz2.0.0でsmpを実装した人がいるので、その人の資料を参考に読み進める。 #minix3.1.0に適用できそうなのか知りたいのでこちらの実装も合わせて見ていく。 もともとminixはmp対応してないので、APICとかの仕様も調べないといけない。minix2.0.0との変更点…

minixってF4とかShift+F3キーを押すと色んな情報を出せるので、自作の情報表示用関数を開いてるキーに割り当てるメモ。

ファンクションキーを使って情報表示させているのはisサーバでソースはservice/is。 関数を追加したい場合はisディレクトリにあるdmp.c、proto.hを変更する。 dmp.cの中で変更するのはNHOOKの数と、hook_entry構造体を初期化している箇所。 #define NHOOKS 1…

minix3.1.4のmessage構造体の定義

自分が持ってるオペレーティングシステムの第2版のP127によると、minixがメッセージの送受信に使うメッセージの構造体はtype.hとなってるけど、3.1.4だとminix/ipc.hにあった。 typedef struct {int m1i1, m1i2, m1i3; char *m1p1, *m1p2, *m1p3;} mess_1; t…

minix3.1.4をqemu環境にインスコしたので色々遊ぶ。

というわけで、まずは/usr/src/servers/vm/mmap.cにあるmmapの動作をみてます。 mmapの本体はかなり小さめ。linuxのsys_mmap()も小さいけど中で呼んでるdo_mmap_pgoff()がメインの処理っぽいとも言えると思うけど、minixはほぼdo_mmapで完結してるもよう。 /…