我正在为文件作为类项目实现基于日志的文件系统.我有大量的工作在我的64位OS X笔记本电脑上,但当我尝试在CS部门的32位Linux机器上运行代码时,我得到一个seg错误.
我们给出的API允许一次写入DISK_SECTOR_SIZE(512)字节.我们的日志记录包括用户想要写入的512字节以及一些元数据(他想要写入哪个扇区,操作类型等).
总而言之,"记录"对象的大小为528字节,这意味着每个日志记录跨越磁盘上的2个扇区.
第一个记录在扇区0上写0-512,在扇区1上写0-15.第二个记录在扇区1写入16-512,在扇区2写入0-31.第三个记录在扇区2写入32-512,并且扇区3上的0-47.
所以我所做的是将我要修改的两个扇区读入2个新分配的缓冲区,从记录开始复制到buf1 + 512个偏移字节的计算偏移量.这在两台机器上都能正常工作.
但是,第二个memcpy失败了.具体来说,"record + DISK_SECTOR_SIZE-offset"在下面的代码段错误中,但仅限于linux机器上.运行一些随机测试,它会变得更加好奇.linux机器将sizeof(Record)报告为528.因此,如果我尝试将记录+ 500的memcpy转换为buf 1个字节,那么它应该没有问题.
事实上,我从记录中获得的最大偏移量是254.也就是说,memcpy(buf1,记录+ 254,1)可以工作,但是memcpy(buf1,记录+ 255,1)段错误.
有谁知道我错过了什么?
Record *record = malloc(sizeof(Record));
record->tid = tid;
record->opType = OP_WRITE;
record->opArg = sector;
int i;
for (i = 0; i < DISK_SECTOR_SIZE; i++) {
record->data[i] = buf[i]; // *buf is passed into this function
}
char* buf1 = malloc(DISK_SECTOR_SIZE);
char* buf2 = malloc(DISK_SECTOR_SIZE);
d_read(ad->disk, ad->curLogSector, buf1); // API to read a specified sector into a buffer
d_read(ad->disk, ad->curLogSector+1, buf2);
memcpy(buf1+offset, record, DISK_SECTOR_SIZE-offset);
memcpy(buf2, …Run Code Online (Sandbox Code Playgroud)