Я работаю над реализацией файловой системы на основе журнала для файла как проекта класса. У меня достаточно много работы на моем 64-битном ноутбуке с OS X, но когда я пытаюсь запустить код на 32-битных Linux-машинах отдела CS, я получаю ошибку seg.
API, который мы предоставляем, позволяет записывать DISK_SECTOR_SIZE (512) байтов за раз. Наша запись в журнале состоит из 512 байтов, которые пользователь хочет записать, а также некоторых метаданных (в какой сектор он хочет записать, тип операции и т. Д.).
В целом размер объекта «запись» составляет 528 байт, что означает, что каждая запись журнала занимает 2 сектора на диске.
Первая запись записывает 0-512 в секторе 0 и 0-15 в секторе 1.
Вторая запись записывает 16-512 в секторе 1 и 0-31 в секторе 2.
Третья запись записывает 32-512 в секторе 2 и 0-47 в секторе 3.
Т.Д.
Итак, что я делаю, так это читаю два сектора, которые я буду модифицировать в 2 вновь выделенных буфера, копируя, начиная с записи, в buf1 + вычисленное смещение для байтов с 512 смещением. Это работает правильно на обеих машинах.
Однако вторая memcpy не работает. В частности, "record + DISK_SECTOR_SIZE-offset" в приведенных ниже ошибках кода, но только на машине с Linux. Запустив несколько случайных тестов, становится любопытнее Машина Linux сообщает, что sizeof (Record) равен 528. Поэтому, если я попытаюсь записать memcpy из записи + 500 в buf за 1 байт, у него не должно возникнуть проблем.
На самом деле самое большое смещение, которое я могу получить из записи, - 254. То есть memcpy (buf1, record + 254, 1) работает, но memcpy (buf1, record + 255, 1) segfaults.
Кто-нибудь знает, что мне не хватает?
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, record+DISK_SECTOR_SIZE-offset, offset+sizeof(Record)-sizeof(record->data));