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.
中有更详细的描述
写了一个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.