Linux Kernel

Linux Kernel

Linuxカーネルについてまなんだことを書きます。
Linuxカーネルというくくりでいいのかよくわからないことも書きます。
Linuxカーネルに付随するいくつかのことも書きます。

関数

outb_p(char addr , port)

portにaddrを書き込みます。
これをしたあとにinb_p(port)とかやったりします。
manページには以下のように書いてあります。
the _p-suffix functions pause until the I/O completes
I/Oが完了するまで待つとありますね。
RTCの読み込みとかに使います。
makeした.oファイルを逆アセンブルすると、
outb_p (addr , 0x70 )
out    %al,$0x70
call   *0xc8
になったりします。
call   *0xc8
ってなんでしょうね。
なにか待つだけのサブルーチンなんでしょうかね。
と思ってテスト用のデバイスドライバを書いてコンパイルしたものをを逆アセンブルしてみたら、上のcallの部分が
out    %al,0x80
になっていました。もうちょっと調べたら、マクロ定義がio.hにありました。
00028 #ifdef SLOW_IO_BY_JUMPING
00029 #define __SLOW_DOWN_IO __asm__ __volatile__("jmp 1f\n1:\tjmp 1f\n1:")
00030 #else
00031 #define __SLOW_DOWN_IO __asm__ __volatile__("outb %al,$0x80")
00032 #endif

最終的には
outb_p (addr , 0x70 (
out    %al,$0x70
out    %al,0x80
になるようです。
最終更新:2008年04月12日 19:22
ツールボックス

下から選んでください:

新しいページを作成する
ヘルプ / FAQ もご覧ください。