利用VFS截获系统调用的方法:http://blog.youkuaiyun.com/yun2205446823/article/details/50767690
bug1:利用makefile进行编译时直接编译出现 no rule to make target kernel/bounds.c 或者bound.c need bound.s(记不清了。。。)
解决方法:尝试使用sudo -s make(注意有时sudo make 与 make 都会编译不成功,但是sudo -s make 可以成功,不清楚原因。。)
bug2:编译不通过,提示readdir为只读对象,不允许更改。
解决方法:引入一中间变量,如VFS截获调用的代码(以http://blog.youkuaiyun.com/yun2205446823/article/details/50767690为例)中,
利用一中间变量fop间接更改filep对应的readdir.
bug3:系统崩溃,并提示 BUG:unable to handle kernel paging request at XXXXXXXXXXX(一个地址)
解决方法:在模块初始化时将控制寄存器CR0的第16位清零,并在卸载模块时进行还原,参考http://blog.youkuaiyun.com/szkbsgy/article/details/9970315
代码示例:
清除标志位:
static int clear_cr0(void)
{
unsigned int cr0 = 0;
unsigned int ret;
asm volatile("movq %%cr0, %%rax":"=a"(cr0));
ret = cr0;
cr0 &= 0xfffeffff;
asm volatile("movq %%rax, %%cr0"::"a"(cr0));
return ret;//ret即为保存的原寄存器CR016位的值
}
恢复标志位:
static void setback_cr0(int val)
{
asmvolatile(“movq %%rax, %%cr0”::"a"(val));
}
注:这是32位系统适用的代码,对于64位系统寄存器名字不一样,相应汇编代码movq也要相应修改为movl
使用:
orig_cr0 = clear_cr0();//将标志位置零,并保留标志位原值
XXXXXXXXXXXXXX;//修改系统调用的代码
setback_cr0(orig_cr0);//恢复标志位
另注强制卸载模块的一种方法:http://blog.youkuaiyun.com/xumin330774233/article/details/42522475(主要思想是去更改模块状态标志位)