Linuxのシステムコールの発行方法についての質問です。


http://www-06.ibm.com/jp/developerworks/linux/library/l-system-calls/
や "Binary Hacks" #25 を読むと、
「unistd.h で _syscall0, _syscall1 などのマクロが定義されており、そのマクロを使うことで、
libc を使わずに直接システムコールを発行できる」と書いてあります。

ところが、自分のシステム (ubuntu 7.04, AMD Athlon(tm) 64 X2 Dual Core Processor 4600+) の、
/usr/include/unistd.h (と、そこで include されているヘッダファイル) を見たところ、_syscallN の定義はありません。
また、Linux kernel のソースそのものを見ても、そのような定義はありません。

最近の Linux ではシステムコールの発行のしくみが代わったのでしょうか?
現在のしくみと参考文献を教えてください。

回答の条件
  • 1人2回まで
  • 登録:
  • 終了:2007/07/04 16:05:03
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答6件)

id:daichan330 No.1

回答回数565ベストアンサー獲得回数106

ポイント19pt

当該記事を見ました。


× /usr/include/unistd.h

○ /usr/include/linux/unistd.h


ではないですか?(もしくは、/usr/include/asm/unistd.h)

※RHEL4/RHEL5で確認したので、Ubuntuでは違うかもしれませんが。

id:imsut

すみません。unistd.h のパスを書き間違えました。パスについてはご指摘の通りです。

ただし、/usr/include/unistd.h, /usr/include/linux/unistd.h のどちらにも _syscallN の定義はありません。

CentOS5にもなかったので、RHEL5にもないと思うのですが・・・。

2007/06/27 18:34:54
id:karasimiso No.2

回答回数41ベストアンサー獲得回数1

ポイント19pt

OpenSUSE10.1を使用しております。

カーネルのバージョンは2.6系です。


私の環境の場合、

/usr/include/unistd.h は /usr/include/asm/unistd.h をインクルードしており、その中に_syscallNをインラインアセンブラで記述しているようです。

ですので、システムコールの仕組みは昔と変わらず、「int 0x80」から変わっていないと思います。

id:imsut

そうですか・・・。ディストリビューションによって変わるとは思えないんですが・・・。

何か大きな勘違いをしているのかもしれません。

2007/06/27 21:22:11
id:znz No.3

回答回数193ベストアンサー獲得回数25

ポイント18pt

sysenter/sysexitという方法もあるようなので、x86_64ではsysenter/sysexitを使っているのではないでしょうか?

id:imsut

消去法で考えればそうなんですが、ソースを知りたいんですよね・・・。

2007/06/28 02:30:52
id:kmd No.4

回答回数9ベストアンサー獲得回数0

ポイント18pt

当方のUbuntsu 7.04 (amd64)では、 定義本体は

/usr/include/asm-x86_64/unistd.h

のようですが、上記の他

/usr/include/linux/unistd.h

/usr/include/asm/unistd.h

を探しても、__SYSCALL(a,b)はあっても、_syscallNはありませんでした。

また、system callは、/usr/include/unistd.hに定義されているsyscall()を使えば同じことができるような気がします。

御参考まで。

id:imsut

syscallは、システムコールを発行するためのwrapper functionだと思うので、「libcを使わずにシステムコールを発行できる」ことにはなりませんよね。

2007/06/28 03:02:00
id:masahikokimoto No.5

回答回数241ベストアンサー獲得回数10

ポイント18pt

source codeを読んでいない上での回答で申し訳ないのですが、当該の書籍であるBinary Hacksを読むと、Hack #59にLinux 2.6からはsystenterがサポートされたとあります。

id:imsut

sysenterを使っている積極的な証拠が見たいです。

glibcのソースかなぁ・・・。

2007/06/28 17:41:50
id:daichan330 No.6

回答回数565ベストアンサー獲得回数106

ポイント18pt

2回目の回答で申し訳ないです。


以下のメールによると、コメント欄に、

Ubuntu: Don't use _syscall macro

とあり、Ubuntuでは_syscallマクロは使うべきでないとあります。

http://www.redhat.com/archives/linux-cluster/2006-August/msg0006...


また、下記のManpageを見ると、

いくつかのアーキテクチャ、特に ia64、では _syscall マクロは提供されていない。

ともあります。ia64とamd64とはアーキテクチャが違いますが、同じ64bitであるため類似点として挙げられるのではないかと思います。

http://www.linux.or.jp/JM/html/LDP_man-pages/man2/intro.2.html


参考ですが、RHEL4/RHEL5 の /usr/include/linux/unistd.h を見た所、RHEL4 では _syscallマクロの記載方法が具体的に明記されていましたが、RHEL5では当該ソース(コメント)は全て取り外されているように見受けられました。


これらのことからも、_syscallマクロは使用すべきでは無いということではないでしょうか。

id:imsut

ありがとうございます。

id:daichan330さんを含め、皆さんからいただいた情報をもとに、もう少し調べてみます。

2007/06/28 17:43:50

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません