2011.12.14
前へ
次へ
目次へ戻る
ホームページトップへ戻る

パソコンをつくろう!(パソコン自作のすすめ)
組み立てキットを使って自作に挑戦!

[第269回]


●ioperm

前回からの続きです。
[第267回]で書きましたように、前回コンパイルして実行したパラレルポート出力プログラムは、こちら(http://funini.com/kei/io/)のサイトからいただいたものをほとんどそのまま使わせていただきました。
[第267回]では、ソースプログラムについて簡単な説明も書いたのですけれど。
書きながら、
はて?むむ?
ちょいと首をかしげてしまうところがありました。
多分こういうことだろうということで、まあ、一応は納得したのですけれど、それでもまだなんとなくすっきりしないものが残ってしまいました。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/io.h>
#define OUT_PORT 0x378
 
int main(void){
  int i;
  ioperm(OUT_PORT, 4, 1);
  for(i = 0; i < 10; i++){
    outb(0xff, OUT_PORT);
    sleep(1);
    outb(0x00, OUT_PORT);
    sleep(1);
  }
  return 0;
}

引っかかったのはioperm()の第3パラメータについての説明です。

●許可ビットをturn_onに設定する?

ioperm()について解説しているウェブサイトの説明をみますと、どうも出所は同じらしくて、大抵は同じ表現になっています。
たとえばこちら(http://linuxjm.sourceforge.jp/html/LDP_man-pages/man2/ioperm.2.html)のページでは

書式
#include <unistd.h> /* for libc5 */
#include <sys/io.h> /* for glibc */

int ioperm(unsigned long from, unsigned long num, int turn_on);
説明
ioperm() は、引き数 from の I/O ポートアドレスから num バイト分の領域に対する、呼び出し元プロセスの アクセス許可ビットを、turn_on に設定する。 turn_on が 0 以外の場合、呼び出し元プロセスは特権 (CAP_SYS_RAWIO) を持っていなければならない。

と説明されています。

わかったようで、その実よくわからない表現です。

アクセス許可ビットを、turn_on に設定する

というところがよくわかりません。

引き数 from の I/O ポートアドレスから num バイト分の領域に対する

というところはわかりますから、とにかくturn_onに「何か」を設定すればいいのだろうということは推測できるのですけれど、ではその「何か」とは何か?
というと、それがわからないのですよねえ。
どこにも書いてないのです。
こういうところに気が付いてしまいますと、もう説明が書けなくなってしまいます。

「許可ビット」という、1と0をすぐ連想してしまう名称から、あるサイトでは、ここは論理値の真(1)か偽(0)を指定する、というように説明してあるものも見ました。
ioperm()を使ったサンプルプログラムを調べてみますと、大抵はここに”1”を入れて使っているようでありますし、多くの皆様は、恐らくやはり論理値の1か0をイメージして使っていらっしゃるのでは。

マニュアルと言うからには、ここははっきりと1なら許可、0なら不許可と明記していただきたいものであります。
残念ながらどこにも明記されているところはみつけることができなかったのでありますが、なんとなく示唆しているらしきところをみつけました。
それは上の引用文の最後にあります、

turn_on が 0 以外の場合、呼び出し元プロセスは特権 (CAP_SYS_RAWIO) を持っていなければならない。

という文章です。
この文章から推測すると、0は不許可ですけれど、「1なら許可」ではなくて、「0以外なら許可」ということのようです。

ちなみに。
[第267回]のiopermについて説明しているところは、いろいろ迷った結果、以下の表現に落ち着きました。

ioperm(ポートアドレス,バイト数,ON)
はポートアクセスを許可するための命令です。
バイト数ポートアドレスから連続した指定バイト分のI/Oアドレスに対してアクセス許可を得るために指定します。
パラレルポート(プリンタポート)は連続する4バイトですから、ここは4を指定します。
なお実際に8ビットのデータを出力するのに使われるアドレスは0x378のみです。
ですからデータを出力するだけでしたら、バイト数=1で構いません。
ON”は許可/不許可を指定するためのもので、0を指定したときに不許可、0以外を指定したときに許可されます。

●英語のサイトでは?

そのように書いたのですけれど、まだ完全に納得したわけではありませんから、英語のサイトも調べてみました。
そういたしましたら。

以下は、http://www.kernel.org/doc/man-pages/online/pages/man2/ioperm.2.htmlからの引用です。

#include <unistd.h> /* for libc5 */
#include <sys/io.h> /* for glibc */

int ioperm(unsigned long from, unsigned long num, int turn_on);

DESCRIPTION
ioperm() sets the port access permission bits for the calling process for num
bytes starting from port address from to the value turn_on. If turn_on is
nonzero, the calling process must be privileged (CAP_SYS_RAWIO).

うう。
日本語のマニュアルの説明は英文の直訳でありました。
道理でよくわからないはずです。
もっとも、この英文も実にわかりにくい文ですけれど。
ここでも”nonzero”とは書いてありますが、turn_onに何を入れたらどうなるのか、ということについては何も書かれてはいないようです。

しかし、英文のマニュアルでも
If turn_on is ”1”
とは書かれていなくて、”nonzero”であるということからしますと、上に書きましたように、ここは、「0以外の数を指定したときに許可される」ということでいいように思います。

というところまで書きましたからには、やっぱり実際にプログラムを書いて、それを確認してみなければいけません。
今回は時間がなくなってしまいましたので、その結果につきましては、次回に書くことにいたします。

パソコンをつくろう![第269回]
2011.12.14upload

前へ
次へ
目次へ戻る
ホームページトップへ戻る