【问题标题】:Linux driver try & catchLinux驱动程序try & catch
【发布时间】:2018-08-09 07:58:25
【问题描述】:

我写了一个 Linux 驱动程序,想读取一块内存。我想用 try & catch 包装它——以防我试图访问的内存不可用。

如何在 C 中做到这一点?

for(i=0;i<base_address.len/sizeof(unsigned); ++i)
{
    seq_printf(seq, "0x%x ",((const volatile unsigned*)base_address.iobase[i]);
}  

我想保护对此的访问 - base_address.iobase[i],因为我不确定范围内的所有位都可以访问。

【问题讨论】:

  • 请附上一些代码来说明您的问题,仅从您的描述很难猜到。
  • Try & catch 是 C++,我相信所有的 Linux 都是纯(非标准)C?那么你到底在做什么呢?
  • 您可以在 Linux 内核中使用类似 try/catch 的机制 :) 请参阅下面的答案。

标签: c linux linux-kernel linux-device-driver embedded-linux


【解决方案1】:

事实上,Linux 内核中有一个类似 try-catch 的工具。它被称为exception table,可以在 Linux 源代码中的kernel/extable.c 中找到。基本上,您使用arch/x86/include/asm/asm.h 中定义的_ASM_EXTABLE* 宏之一(假设您在x86 平台上)。

它的工作方式是你提供错误的指令——即try部分——和fixup地址——catch部分。这在try/catch in Linux Kernel 中有更详细的描述。

【讨论】:

    【解决方案2】:

    简答 - 你不知道

    C 不像 C++ 那样提供 try/catch 机制。相反,您需要检查每次调用的结果,并在提早返回时执行自己的清理,使用标准 C 习惯用法。

    查看其他驱动程序以了解模式;不要试图发明一些与内核其他部分不同的机制(那样只会导致混乱和痛苦!)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-11-25
      • 1970-01-01
      • 1970-01-01
      • 2019-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多