[Mona] DLLサポート機能のあれこれ

妄想

MonaカーネルにDLLサポート機能を!。について自分の考えをまとまるためにずらずらとゆるい感じでメモ。
下記に示した参考資料を読みましたが、基本的に既存OSの仕様を全然知らず想像・妄想しているので鵜呑みにしないでくださいw

  • この機能は DLLのローダーを書く人のサポートのためのもの。
  • コードをREAD ONLYで共有
    • ページ属性で
  • GetProcAddressの例を見るとリニアドレスをキャストしてそのまま使っている。リンクのことを考えると各プロセスから同一のリニアアドレスとして見えているんだな。
  • LoadLibraryをそのままカーネルでサポートするというイメージではない。
  • 各プロセスから参照可能なあるリニアドレス範囲を用意する
  • システムコールでそこに書きこみ可能
  • 通常は書込み禁止
    • それとも柔軟に、ページの読み書き属性をページ単位でいじれるインタフェースの方がうれしい?
  • 現在のMonaの共有メモリの仕組みと独立がうれしい?それとも機能拡張?
  • 動的リンクはだれが?プロセスサーバー?

WindowsでDLLを動的に呼ぶ。明示的リンク

{
	hDll = ::LoadLibraryEx("dlltest.dll",NULL,0);
	if( ! hDll ){
		cout << "open err";
		return;
	}

	OKiHo = (LONG(__stdcall*)(LONG,LONG))  ::GetProcAddress( hDll,"hogehoge");
	if( ! OKiHo ){
		::FreeLibrary( hDll );
		cout << "read err";
		return;
	}

Linuxで動的ライブラリ

      /* 動的ライブラリをロードする */
      module = dlopen("libhello.so", RTLD_LAZY);
      if (!module) {
          fprintf(stderr, "libhello.so をオープンできませんでした: %s\n", dlerror());
          exit(1);
      }

      /* シンボルを取得する */
      dlerror();
      demo_function = dlsym(module, "hello");