2009-09-01から1ヶ月間の記事一覧

MP Floating Pointer Structureを調べる

x86

MINIX2のsmp実装を見ていく上で出てくる用語の一つがfps。 仕様書だとfpsと略してないですが、smp実装のソースコードで使っているのでそれに合わせます。fpsとはMP Floating Pointer Structureの略で、以下の2つの情報を保持しているテーブル。 1.MP Configu…

_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…

ホットキーメモ

fn+f1:サスペンドかハイバネート fn+f2:? fn+f3:? fn+f4:モニタの輝度− fn+f5:モニタの輝度+ fn+f6:ミュートのON/OFF切り替え fn+f7:音量− fn+f8:音量+ fn+f9:? fn+f10:? fn+f11:? fn+f12:?

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との変更点…

Exploratory Software Testingのtweetまとめ。

先週届いたJames Whittakerの本を読みつつtwitterにつぶやいているので、今まで書いた分のまとめを貼っ付けておく。 # Exploratory Software Testing 2章もうちょいで読み終わり。9:48 PM Sep 17th from web # Manual TestingとScripted Manual Testingの違…

oops

久々にoopsが出たので貼り付け。 多分下のコマンド実行中でのoops発生と思う。 sudo dd if=/dev/zero of=/dev/sdf bs=1M [287041.483833] INFO: task hald-addon-stor:19153 blocked for more than 120 seconds. [287041.483841] "echo 0 > /proc/sys/kernel…