我正在用MIPS架构编写Linux驱动程序。
我在那里执行读取操作-读取一些寄存器内容。
这是代码:
static int proc_seq_show(struct seq_file *seq, void *v)
{
volatile unsigned reg;
//here read registers and pass to user using seq_printf
//1. read reg number 1
//2. read reg number 2
}
int proc_open(struct inode *inode, struct file *filp)
{
return single_open(filp,&proc_seq_show, NULL);
}
static struct file_operation proc_ops = {.read = &seq_read, .open=&seq_open};
我的问题是,读取寄存器内容有时会导致内核异常-总线错误,并且阻止了读取操作。我无法避免。
因为这种行为是可以接受的,所以我想忽略该错误并继续读取其他寄存器。
我在内核中看到了总线错误处理程序(traps.c中的do_be),有一个选项可以将我自己的条目添加到__dbe_table中。条目如下所示:
struct exception_table_entry {unsigned long insn, nextinsn; };
insn 是导致错误的指令。 nextinsn 是异常之后要执行的下一条指令。
在驱动程序中,我声明一个条目:
struct exception_table_entry e __attribute__ ((section("__dbe_table"))) = {0,0};
但是我不知道如何初始化它。如何获得C语言中风险代码行的指令地址?我如何获得固定电话的地址?我尝试了一些带有标签和标签地址的东西-但没有正确设置exception_table_entry。
x86中提供了相同的基础结构,有人知道他们如何使用它吗?
任何帮助将不胜感激。