0

内核模块化调试器 (kmdb) 使用 lex 生成词法分析器以从内核空间[1] 使用。有一些 hack,其中一些甚至不兼容 POSIX。

我有问题:

  1. 在内核模式下使用 lex 有哪些陷阱?
  2. flex [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

您应该能够使用类似 illumos lex 文件中的 hack 来从 flex 中夺取对 I/O 的控制权。或者您可以只使用 flex 的字符串缓冲区功能。请参阅flex 手册中的 yy_scan_string 和 yy_scan_buffer 。

yy_scan_string将导致 flex 复制字符串,这可能是必要的,因为 flex 会在执行过程中修改缓冲区的内容。如果您不关心这一点,并且您想避免复制并且您可以在输入末尾放置两个NUL 而不是一个,那么您可以使用yy_scan_buffer

flex 手册中还有一节介绍了如何提供自己的内存分配功能(“ Overriding The Default Memory Management ”),这可能也是必要的。Flex 不会分配除缓冲区以外的太多内存,如果您提供自己的缓冲区,则可以将 Flex 的缓冲区大小任意小。这应该可以从固定长度的字节数组中分配内存;我不知道你能做到多小,但我猜如果你小心的话,你应该能够把它缩小到几百字节。

于 2012-12-18T14:55:47.873 回答