大小端 linux?c++大小端转换
android 手机一般是big-endian,还是little-endian
不同的CUP框架,采用不同的模式。一般来说,x86系列CPU都是little-endian的字节序,PowerPC通常是Big endian。
对于整型、长整型等数据类型,Big endian认为第一个字节是最高位字节(按照从低地址到高地址的顺序存放数据的高位字节到低位字节)。
而Little endian则相反,它认为第一个字节是最低位字节(按照从低地址到高地址的顺序存放数据的低位字节到高位字节)。
Big:从内存地址的低到高位保存数据的从高到底位Little:从内存地址的低到高位保存数据的从低到高位内存内容如下:0x00000x00010x00020x00030x120x230xab0xcd如果是big:读出来的内容是0x1234abcd,如果是little读出来的内容是0xcdab3412把0x1234abcd写入:内存地质0x00000x00010x00020x0003Big0x120x230xab0xcdLittle0xcd0xab0x340x12
CPU能通过跳线来设置CPU工作于Little endian还是Big endian模式。解答这个问题的方法只能是将一个字节(CHAR/BYTE类型)的数据和一个整型数据存放于同样的内存开始地址,通过读取整型数据,分析CHAR/BYTE数据在整型数据的高位还是低位来判断CPU工作于Little endian还是Big endian模式。
得出如下的答案:typedef unsigned char BYTE;int main(int argc, char* argv[]){ unsigned int num,*p; p=# num= 0;*(BYTE*)p= 0xff; if(num== 0xff){ printf("The endian of cpu is little\n");} else//num== 0xff000000{ printf("The endian of cpu is big\n");} return 0;}除了上述方法(通过指针类型强制转换并对整型数据首字节赋值,判断该赋值赋给了高位还是低位)外,还有没有更好的办法呢?,union的成员本身就被存放在相同的内存空间(共享内存,正是union发挥作用、做贡献的去处),因此,可以将一个CHAR/BYTE数据和一个整型数据同时作为一个union的成员,得出如下答案:int checkCPU(){{ union w{ int a; char b;} c; c.a= 1; return(c.b== 1);}}实现同样的功能,来看看Linux操作系统中相关的源代码是怎么做的:static union{ char c[4]; unsigned long l;} endian_test={{'l','?','?','b'}};#define ENDIANNESS((char)endian_test.l)Linux的内核作者们仅仅用一个union变量和一个简单的宏定义就实现了一大段代码同样的功能。
识别Linux大小端识别深入浅出linux大小端
Linux大小端识别是对于存储器编码方式的识别,它是指在存储器中字节的顺序,大端表示存储器中字节的高位放在低位地址,而小端则恰好相反,高位存储在高地址。在开发中会遇到不同的系统、处理器,存储器编码方式也是不尽相同,例如x86编译出来的可执行文件是字节顺序都是小端的。而在ARM之类的开发中,编译出的文件的字节顺序可以根据不同的处理器设置大端或小端,开发者需要针对不同的处理器进行字节顺序的检测,并且采用不同的程序进行处理。
一种最简单的Linux大小端识别方法就是使用CPUID命令检测CPU的类型,在不同的架构中采用不同的汇编指令,实现Linux大小端识别,代码如下:
//Check CPU Type
asm volatile(“movl$0x01,%%eax;\
xorl%%edx,%%edx;\
cpuid;\
movl%%edx,%0″
:”=r”(info->EDX)::”%eax”,”%edx”);
// Checks if the CPU is big or little endian
if((info->EDX)& 0x00000001){
info->ENDIANNESS= LITTLE_ENDIAN;
}
else{
info->ENDIANNESS= BIG_ENDIAN;
}
上面的代码使用汇编指令CPUID,然后将edx寄存器中第一位的值判断出CPU类型,从而识别Linux大小端。如果根据edx的第一位的值的话,对于x86系统下查询出来的结果是0,则为小端模式,如果查询结果是1,则为大端模式。
此外,如果要实时的进行大小端的转换,同样可以使用汇编指令来进行,具体代码如下:
//Swap endianness
asm volatile(“rorl$16,%0”
:“=q”(info->data)
::“cc”);
上面的代码使用汇编指令rorl对变量info->data进行移位16次,实现大小端的转换,将原来的小端字节序转换成大端字节序或者将大端字节序转换成小端字节序。
总之,Linux大小端识别的实现较为简单,不仅可以使用cpuid命令,还可以使用rorl汇编指令来识别CPU类型,以及实时的进行大小端转换,这样可以使得我们可以在不同系统之间正常实现数据同步。
linux大小端转换函数linux大小端
linux查看内存和磁盘大小?
答方法如下
1、打开linux系统,在linux的桌面的空白处右击。
?
2、在弹出的下拉选项里,点击打开终端。
?
3、在命令窗口中输入查询语句df-h,然后按回车键运行语句,就可以查看到我的服务器磁盘的使用率和大小了,
?
4、还可以使用查询语句df,效果和df-h差不多,就是容量大小会具体到kb单位。
linux根分区的大小一般是多少?
分区的大小,主要看你的系统磁盘空间情况和你的具体应用。如果只是日常使用,建议10-20G即可满足大部分需求。
如果你的系统提供多用户登录的话,这样可以适当的放大一些,一般每个用户分配500-1024M也可满足需要了。
建议给/var/和/usr/local做成独立的分区,也可以适当的多分配些空间,但一般每个区10G也够用了。
如果还有剩余空间,可以根据需要划分城一个独立分区,或多个逻辑分区,以供不同的应用使用。
各个版本linux的所占空间大小?
一般linux占用大小差不多,主要是桌面占用的大小,kde,gnome要400M。。。lxde只要几十M服务版(没桌面)的基本上都在100以下
Linux系统多大?
一般6-10G,建议20G以上。
由于Linux的内核的来源是一样的,但由于发行版本不同,具体需要磁盘大小看具体系统需求。
Linux内核比较小,安装系统其实用不了多大的磁盘空间,不像MAXOS和windows。为了获得完整的用户体验,建议磁盘空间保证在20G以上,如果需要安装很多软件和服务,那么自然就要扩大磁盘容量了。当然也可以在系统装好之后扩充磁盘容量,但为了避免麻烦和数据损失,建议在安装时多分一点儿空间
linux系统有多大?
一般linux系统最小化安装后,不到8GB,随着安装软件越来越多,肯定越占越多的。
所谓的最小化安装,是不安装图形界面,不安装常用的软件服务。所有的都是安装好系统之后自己定义安装到其他说明位置。
在线安装的话,默认会把配置文件很多都要安装到/etc/下面,会占用多一点的空间。