Skip to content

システムコールとライブラリ

oraccha edited this page Jan 15, 2013 · 1 revision

Mon Jun 18 13:35:26 JST 2001 . 最近,後輩が作っている OS の話を聞いたり,V4 の見直しをしていて指摘されたり,感じたことをつれづれなるままに...

V4 ではOSパーソナリティとして Unix サーバを提供することを拒否し続けて来たけど,現状を考えてみると,stdio ライブラリが用意されていて,Unix のプログラムもそこそこの作業でポートできる. そのために,追加したシステムコールなんかもあったりするし.

  • やっぱり gcc から CAT へというコンパイラの問題が大きかったりする(T_T)

これって Unix サーバ作ったこととあんまり変わんないんじゃないの? ん〜,そうかもしれない.

結局,システムコールセットだけを見直すだけじゃダメで,アプリケーション,ライブラリもちゃんと考えなきゃダメってことだよな.やっぱり,個々の部品のコンセプトはそれぞれあるけど,全体としてのコンセプトが弱いんだろう. . というか元々は存在したんだろうけど,時間と共に曖昧になってしまった.

頭が弱い分,手足を動かしてきたけど,それも限界かなぁ. な〜んて,二人して飲んでいた.


世界はカーネルだけじゃないぞ.

例えば,Unix の場合,

  • なぜ read/write と fread/fwrite があるのか. . または,fd と FILE の違い.
  • なぜ brk/sbrk と malloc があるのか.

Unix の標準入出力周りにおけるライブラリとシステムコールの関係はよく考えられていて,きれいだと思う.あと,printf ってのも偉大な発明だと思う.

  • 関連して,[http://blog.livedoor.jp/dankogai/archives/50463400.html たとえ最後に生き残ったのがJavascriptだとしても] (404 Blog Not Found 2006-04-20).主題とは離れるが,「'[[Scheme]]がメジャーになれなかった理由って、オブジェクトでもなんでもなくて、printfがなかったからかも知れないですぞ。そうそう。JavaScriptもインターポレーションがない。文字列はひたすら+でつなぐかArrayに押し込んでおいてconcat()するか。はっきり言ってかなりうざい。これだけでも、「行き着く先」でないのは明らかであろう。''」とか.
    • (ところでここでいうインターポレーションって何?)
    • interpolation って用語をこの文脈で使うのが適切かわかりませんが,"%s hoge %d"のようなフォーマットを指してると思います.引数で与えられた変数を%?で指定された型にしたがって置き換え,出力するという.

Tsu Nov 1 19:41:34 JST 2001 . G-Tiki:OSの世界で同じようなことを書く.

後輩に偉そうなこと言っても,言うは易し行なうは難し,ということで V4 の方の話はとんと進まず.ライフワークにしてもいいんだけど,学位は取らないとねぇ...


以上は,OS のインタフェースであるシステムコールをどう設計するかみたいな概念的な話だけど,実装するにはオブジェクトモジュールフォーマットとか ABI とかリンカ,ローダをどうするかという実行環境のことを考えることが必要になって来る.



Fri Apr 19 20:41:20 JST 2002 . ちょっとメモ.

syscall ライブラリ関数

  • glibc-x.y.z/sysdeps/unix/sysv/linux/i386/syscall.S

{{{ .text ENTRY (syscall)

    PUSHARGS_5              /* Save register contents.  */
    _DOARGS_5(36)           /* Load arguments.  */
    movl 16(%esp), %eax     /* Load syscall number into %eax.  */
    int $0x80               /* Do the system call.  */
    POPARGS_5               /* Restore register contents.  */
    cmpl $-4095, %eax       /* Check %eax for error.  */
    jae SYSCALL_ERROR_LABEL /* Jump to error handler if error.  */

L(pseudo_end): ret /* Return to caller. */

PSEUDO_END (syscall) }}}

  • glibc-x.y.z/sysdeps/unix/sysv/linux/i386/sysdep.h に INLINE_SYSCALL というマクロがある.これを使って呼び出すシステムコールもある.

_syscall[0123456] マクロ

  • /usr/include/linux/unistd.h

例えば,_syscall1(int, foo, int, arg); は次のように展開される. {{{ int foo(int arg) { long __res; asm volatile ("int $0x80" : "=a" (__res) : "0" (__NR_foo),"b" ((long)(arg))); if ((unsigned long)(__res) >= (unsigned long)(-125)) { errno = -(__res); __res = -1; } return (int) (__res); } }}}

で,__NR_foo が 256 だと仮定すると次のようなアセンブリになる. {{{ .text .align 4 .globl foo .type foo,@function foo: pushl %ebp movl %esp,%ebp movl $256,%eax #APP int $0x80 #NO_APP cmpl $-126,%eax jbe .L6 negl %eax movl %eax,errno movl $-1,%eax .p2align 4,,7 .L6: leave ret }}}

Clone this wiki locally