0

カーネル モジュラー デバッガー (kmdb) は、lex を使用して、カーネル空間から使用する語彙アナライザーを生成します[1]。いくつかのハックがあり、そのうちのいくつかは POSIX と互換性がありません。

質問があります:

  1. カーネルモードで lex を使用する際の落とし穴は何ですか?
  2. フレックス [2] に [1] を採用する合理的な方法はありますか?
  3. カーネル空間の lex/flex に代わるものは何ですか?

(最後の手段でillumosのlexをビルドして使うつもりですが、どうしても避けたいです)

[1] https://github.com/illumos/illumos-gate/blob/master/usr/src/cmd/mdb/common/mdb/mdb_lex.l

[2] https://github.com/westes/flex/

4

1 に答える 1

1

フレックスからI/Oの制御を奪うために、illumoslexファイルにあるようなハックを使用できるはずです。または、flexの文字列バッファ機能を使用することもできます。フレックスマニュアルのyy_scan_stringおよびyy_scan_bufferを参照してください。

yy_scan_stringflexは文字列をコピーします。これは、flexが進行するにつれてバッファの内容を変更するために必要になる場合があります。それを気にせず、コピーを避けたい場合、入力の最後に1つではなく2つのNULを配置する立場にある場合は、次を使用できます。yy_scan_buffer

フレックスマニュアルには、独自のメモリ割り当て機能を提供する方法(「デフォルトのメモリ管理のオーバーライド」)に関するセクションもあります。これもおそらく必要です。Flexはバッファ以外に多くのメモリを割り当てません。独自のバッファを提供する場合は、Flexのバッファサイズを任意に小さくすることができます。これにより、固定長のバイト配列からメモリを割り当てることが可能になります。どれだけ小さくできるかはわかりませんが、注意すれば数百バイトまで小さくできるはずです。

于 2012-12-18T14:55:47.873 に答える