Linux driver 试试看

Linux driver try & catch

写了一个Linuxdriver,想读一大块内存。我想用 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],因为我不确定范围内的所有位都可以访问。

简答 - 你不会

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

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

事实上 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.

中有更详细的描述