2008年12月25日 星期四

Linux u64

使用u64的變數時需要特別小心,尤其是call-by-value, u64佔8byte, 要是被當成32-bit處理, 參數可就亂了, 到時候怎麼死的都不知道

include/asm-x86/types.h

#ifndef __ASSEMBLY__

typedef u64 dma64_addr_t;
#if defined(CONFIG_X86_64) || defined(CONFIG_HIGHMEM64G)
/* DMA addresses come in 32-bit and 64-bit flavours. */
typedef u64 dma_addr_t;
#else
typedef u32 dma_addr_t;
#endif

#endif /* __ASSEMBLY__ */


怎么给u64赋值?
http://linux.chinaunix.net/bbs/viewthread.php?tid=1035858
0x100000000ULL


Re: __udivdi3 and linux kernel u64 division question [x86]
http://search.luky.org/linux-kernel.2005/msg38382.html

如何处理两个u32相加溢出的问题? 定义了个u64似乎没用
http://www.unixresources.net/linux/clf/program/archive/00/00/60/56/605612.html
http://www.lslnet.com/linux/f/docs1/i38/big5279591.htm
printf("a = %08x %08x\n", a & 0xFFFFFFFF, a >> 32);
參數壓棧有關係的.
若不轉換, %08x %08x 需要 8字節 , a & 0xFFFFFFFF 也是8字節, 印出來的就是 a 的所有 8位.
printf("a = %08x %08x\n", a & 0xFFFFFFFF, 1234567); 的結果 也是 a = e0000001 00000000.
printf("a = %08x %08x\n", (u32)(a & 0xFFFFFFFF), (u32)(a >> 32) ); 才正確.



小问题:用printk如何直接打印出u64类型的大数??
http://topic.csdn.net/t/20041216/11/3650509.html
d,lx,ld,,lu,这几个都是输出32位的
hd,hx,hu,这几个都是输出16位数据的,
hhd,hhx,hhu,这几个都是输出8位的,
lld,ll,llu,llx,这几个都是输出64位的


[wiki] printf
http://en.wikipedia.org/wiki/Printf#printf_format_placeholders

沒有留言: