ARMv8 arch overview
32bit user @ 64 bit kernel
ARMv8支持64-bit 和32-bit所规范的层次结构
ARMv8arch overview-generalregister layout
Armv8架构下有31个通用寄存器(R0-R30),每个寄存器有64bit的位宽。访问方式:
in kernel driver
application call 64bit kernel的IOCTL的时候,这个callback会被调用到
|
Programming Type |
ILP32 |
LP64(linux) |
LLP64(windows) |
|
char |
8-bit |
8-bit |
8-bit |
|
short |
16-bit |
16-bit |
16-bit |
|
int |
32-bit |
32-bit |
32-bit |
|
long |
32-bit |
64-bit |
32-bit |
|
long long |
64-bit |
64-bit |
64-bit |
|
float |
32-bit |
32-bit |
32-bit |
|
double |
64-bit |
64-bit |
64-bit |
|
size_t |
32-bit |
64-bit |
64-bit |
|
void * (pointer) |
32-bit |
64-bit |
64-bit |
|
intptr_t |
32-bit |
64-bit |
64-bit |
|
ptrdiff_t |
32-bit |
64-bit |
64-bit |
3. 高位截断
longlongSetBitN(longlong
value, unsignedbitNum)
{
longlong
mask
mask = (longlong)
1 <<bitNum;
return value |msk;
}
或者
{
longlong
mask
mask = 1LL<<bitNum;
return value |mask;
}
5.位域操作
与int数据类型长度不一致,将会取得错误的结果。
FFFF为32bit有符号数最大值等等,或者在32bit环境下常用无符号常量0xFFFF FFFF用来测试是否等于-1。
#defineINVALID_POINTER_VALUE 0xFFFFFFFF
在64bit系统中,-1正确的值应当为0xFFFF FFFFFFFFFFFF。要避免这个问题,在常量声明时,使用const并带上signed或者unsigned。
Const signedintINVALID_POINTER_VALUE
= 0xFFFF FFFF
代码检查check list
|
声明 |
(1)如果变量32bit平台是32位的,64bit平台是32位的,根据需要可以将其类型定义为int |
|
(2)如果变量32bit平台是32位的,64bit平台是64位的,根据需要可以将其类型定义为long |
|
|
(3)防止符号扩展,需要Check变量是否可以定义成unsigned. |
|
|
(4)防止符号扩展,需要Check常量是否需要添加“L”或者“U”来约束. |
|
|
表达式 |
(1)Check表达式是否存在显示类型转换 |
|
(2)注意隐形转化,需要Check表达式操作数是否混合使用不同数据类型. |
|
|
(3)注意隐形转化,需要Check表达式操作数是否混合使用有符号数与无符号数. |
|
|
赋值 |
(1)Check是否存在把指针变量赋值给int |
|
(2)Check是否存在把int赋值给指针变量 |
|
|
(3)Check是否存在左值&&右值数据类型不一致 |
|
|
函数参数相关 |
(1)Check调用到的函数,是否已经声明。 |
|
(2)Check实参数据类型与形参数据类型是否匹配。 |
|
|
字符串格式化 |
(1)Check地址打印,尽量使用printk(“addr=%p\n”, |
|
(2)Check整型打印,例如int型用%d或者%x、long型用%ld或者%lx. |