当前位置:Linux教程 - Linux文化 - linux中在big-endian机器下fat文件系统是否还是按spec.中所说的little-endian模式进行存储?

linux中在big-endian机器下fat文件系统是否还是按spec.中所说的little-endian模式进行存储?


看到ms的fat32的spec中有一段话说到fat的endian的问题

“All of the FAT file systems were originally developed for the IBM PC machine architecture. The importance of this is that FAT file system on disk data structure is all “little endian.” If we look at one 32-bit FAT entry stored on disk as a series of four 8-bit bytes—the first being byte[0] and the last being byte[4]—here is where the 32 bits numbered 00 through 31 are (00 being the least significant bit):

byte[3]3 3 2 2 2 2 2 2 1 0 9 8 7 6 5 4

byte[2]2 2 2 2 1 1 1 1 3 2 1 0 9 8 7 6

byte[1]1 1 1 1 1 1 0 0 5 4 3 2 1 0 9 8

byte[0]0 0 0 0 0 0 0 0 7 6 5 4 3 2 1 0

This is important if your machine is a “big endian” machine, because you will have to translate between big and little endian as you move data to and from the disk.”

按这样的说法无论在big/little endian的机器中,fat管理的存储器都是按照little endian的格式进行存储的,这样的话在big-endian机器中,在将数据写到fat管理的存储器或者从fat管理的存储器中读数据时就必须先对数据进行endian的转换了,如此一来cpu的loading不是占用很厉害?!

很迷惑这点,想知道big endian下的fat文件系统相对于little endian下时是怎样组织和工作的,MS或linux是如何处理的?那位朋友知道的恳请告知一二,实万分感谢!谢谢!

>>> 此贴的回复 >> 并不关cpu的loading的事情,关键是你在内核中一些结构体的定义,如果全部都是按char类型进行操作,那么就不需要字节序转换,如果使用了大于1个字节的成员读取数据,就需要对大小端进行处理,而最底层的存储器操作,你完全可以基于一个字节进行读取(假定存储器是按一个字节一个字节进行操作的,在某些FLASH存储中,一次只能对两个字节进行操作),只是在读取数据的后续操作中需要人为地进行字节序转换,这就是内核与驱动中要做的事情了,比如你需要获得第一个分区所在物理磁盘扇区号,假定这个号被存储在存储器的第一个扇区的最后四个字节中,而这个号是一个整型值,此时,你需要首先读取这四个字节到一个char数组中,但是这个数组中的具体数值都是按little endian的格式进行存储,而此时你的CPU却按big-endian方式操作,那么你在内核驱动中就需要显示地完成将这个char数组转换成int型,这时就需要明确处理大小端的情况,不能直接用C库函数的方式来转换,必须先进行存储方式的转换,再调用函数进行转换,诸如此类的地方还有很多,所以在设计文件驱动时都要注意这个问题的