最近在研究关于ext2 文件系统相关的内容,拿一张4G的SD卡做实验。过程曲折离奇,问题不断,但最让我痛疼就是调用pread 或者lseek 时,当偏移量过大就会出现Invalid argument 的错误。断断续续这个问题折磨了我两天,今天终于搞定,心情舒畅……好了,闲话少扯,回归正题。 
      当首次遇到这个问题时我首先man 了一下pread 和lseek 发现其中的offset 参数定义为 off_t, 不清楚 off_t 到底是有符号还是无符号,上网google 了一下,很不幸被我看到的第一个答案是错误的,他说 off_t 定义为 unsigned long。╮(╯▽╰)╭ 就这样我误认为, offset 的上限应该是32位无符号整数,当做4G SD卡的地址正好。可惜事实是 off_t 在<sys/type.h>中被定义为 long……我勒个去,头发掉了一把的教训,以后直接看源码算了……
      问题是发现了,但怎么解决呢?很简单,使用pread64 或是lseek64 将地址范围扩大成64位。在使用lseek64时别忘了在包含头文件前加上宏定义,宏定义加在包含的头文件之后没有意义。eg:

#define _LARGEFILE64_SOURCE
#include <stdlib.h>
#include <stdio.h>
#include < string.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <errno.h>

OK, 搞定ext2文件系统分析,找时间写个总结。下一步:usb驱动 + LCD驱动