一、关于Linux内核非法地址(网上搜加自己总结)
1、对任何一个指针,必然有三种情况:一种是有效指针,一种是NULL,空指针,一种是错误指针,或者说无效指针
2、32位CPU,内核空间占用虚拟地址(0xc0000000~0xffffffff)3~4G虚拟地址(线性地址?)
3、其中最后一个page(假设4K大小)的地址为(0xfffff000~0xffffffff)为预留地址,指向这个地址的指针都是非法指针
二、错误码跟非法指针啥关系
1、<asm-generic/errno-base.h> 中规定了通用错误码1-34 <linux/err.h>中定义了 #define MAX_ERRNO 4095 最大错误码为4095
2、插一段代码,看内核如何返回错误码。可以看出,在错误码前面加上一个负号就变成了返回值
/* Check type and command number */
if (_IOC_TYPE(cmd) != SPI_IOC_MAGIC)
return -ENOTTY;
3、继续以-ENOTTY为例,ENOTTY的值为25,-ENOTTY的值是多少呢。负数在计算机中以二进制补码形式存储。
补码=~源码+1(源码按位取反后加1)
那么-25的补码就为 0xFFFFFFE7。仔细看一下这个值,在0xfffff000~0xffffffff之间,所以它就是个错误指针。