9

これまでユーザー空間で実行されていた大部分が C で書かれた大きなシステムがあります。次に、コードをカーネル モジュールとしてコンパイルする必要があります。そのためには、少なくともコードを書き直してmalloccalloc、 、freeなどの関数をprintfカーネルの同等のものに置き換える必要があります。これらはユーザー空間の関数のみであるためです。ただし、問題は、システムで使用されるカスタムメイドのライブラリのソース コードがなく、それらのライブラリmallocが関数内で呼び出しなどを行っていることです。したがって、基本的に、ライブラリ全体を再実装する必要があるかもしれません。

mallocここで質問: の独自の実装をラッパーとして次のkmallocように記述した場合、それは本当に汚いハックになりますか?

void *malloc(size_t size) {
    return kmalloc(size, GFP_USER);
}

次に、この実装をシステム コードにリンクします。これにより、モジュールエラーのすべての不明なシンボルが排除されます。

実際、これは一般的な問題であり、誰かがすでにそのような kmalloc ラッパーを作成しているだろうと思っていましたが、数日間グーグルで調べてみましたが、何も役に立ちませんでした。

編集: これを行う理由は、私が話しているシステムが VxWorks リアルタイム OS で実行されているリアルタイム アプリケーションであり、現在、アプリがほとんどカーネル空間で実行される Linux RTAI で使用されるように移植したいからです。しかし、ユーザー空間でもリアルタイムを持つ可能性があると思うので、マイクが提案したように、コードをカーネルとユーザー空間の部分に分離し、それらの間で共有メモリを使用して通信する必要があります。

4

2 に答える 2

9

私はこれがこれまでに行われたのを見たことがありません。以前の仕事で同じようなことをしなければなりませんでした(私たちの電話では、省電力の理由から、カーネルのユーザースペースからコードの一部を移植する必要がありました)が、それが私がやった方法です..私はその一部を取りましたコードを書き、それを移動しました。

それを行ったとき、2つの主な理由から、ユーザースペース呼び出しをカーネル呼び出しに変更しました。

  1. そのように混乱することは少なくなりました(コードを見ている他の人は、なぜ私がカーネルから「malloc」を呼び出しているのか不思議に思う必要はありませんでした)

  2. mallocまったく同じようには機能しkmallocません。それが意味するのは

    2a。kmalloc上記の例では、flagsパラメータをハードコーディングしました。後で、他の場所ではなく、ある場所で変更したいと思った場合はどうなりますか?(動的メモリを取得する場所がいくつかあると仮定します)。

    2b。kmallocと同じようにメモリを提供しませんmallocmalloc()として渡すバイト数が表示されsize_t sizeます。kmalloc()一方、カーネル内にあるため、システムの物理メモリを処理します。これは、ページサイズのチャンクでのみ使用できます。したがって、呼び出すkmalloc()と、特定の事前定義された固定サイズのバイト配列のみが取得されます。これに気付いていない場合は、特定のチャンクを超えて要求し、必要以上のメモリを取得する可能性があります...コードの直接ポートはそれからあなたを保護しません。

    2c。ヘッダーファイルも変更する必要があります。明らかに、カーネルにインクルードすることはできない<stdlib.h>ため、malloc呼び出しを「ラップ」したからといって、ヘッダーファイルの置き換えを回避する必要があります。

上記の2bの私のポイントの簡単な例:

void * stuff;
stuff = kmalloc(1,GFP_KERNEL);
printk("I got: %zu bytes of memory\n", ksize(stuff));
kfree(stuff);

割り当てられたメモリの実際の量を表示するには:

[90144.702588] I got: 32 bytes of memory

とにかく...技術的には、それをどのように説明すれば、うまくいくはずです。どちらもaを取り、asize_tを返すvoid *ので、機能するはずです。ただし、カーネルに移動するコードが多いほど、決定論的なものは少なくなり、<=>は見た目ほど1:1ではないことに注意してmalloc()くださいkmalloc()

于 2013-02-08T13:14:33.143 に答える
0

RTAI コードをユーザー空間とカーネル空間の両方で (および POSIX を使用して) コンパイル可能にしようとして、本質的にあなたが求めていることを実行するURTを開発しました。これは、リアルタイム システム (および一貫性のないユーザー空間とカーネル空間の RTAI 関数でさえも) に対する軽量の抽象化レベルです。

于 2015-01-30T13:59:15.347 に答える