Чтение ext2 суперблока в вопросы структуры ext2_super_block - PullRequest
3 голосов
/ 17 мая 2011

Я видел несколько вопросов по чтению суперблока раздела ext2, но у меня есть некоторые вопросы, на которые не были даны ответы.
Вот они:
1. использование read () для чтения с диска в структуру ext2_super_block должно потребовать, чтобы все поля в структуре были скомпилированы в том порядке, в котором они представлены в коде, а также необходимость отсутствия заполнения структуры (или правильной структура заполнения). Как это гарантировано?
2. Как ведет себя Linux при попытке чтения с устройства в непривилегированном состоянии? Для чтения должно быть начальное смещение (точнее, отображение, запрещающее доступ к первым N байтам), потому что программа, которую я написал, работает только при запуске от имени пользователя root. В любом случае, как ведет себя Linux в такой ситуации?
3. Где я могу найти хорошую документацию по работе с ext2 / ext3? До сих пор я читал /usr/include/linux/ext2_fs.h и некоторые случайные документы в Интернете, но пока не нашел ничего завершенного.

Я также хотел бы услышать предложения / исправления в приведенном ниже коде, который на данный момент отлично работает на моем компьютере (для краткости опущено, программа выводит "ef53"):

int main() {
  int fd;
  char boot[1024];
  struct ext2_super_block super_block;

  fd = open("/dev/sda1", O_RDONLY);

  /* Reads the boot section and the superblock */
  read(fd, boot, 1024);
  read(fd, &super_block, sizeof(struct ext2_super_block));

  /* Prints the Magic Number */
  printf("%x\n", super_block.s_magic);

  close(fd);

  return 0;
}

Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 03 августа 2011

Я столкнулся с некоторыми вашими вопросами в своем поиске ответов.

  1. ext2_super_block struct уже настроен на порядок / дополнен спецификацией.Вы можете создать свой собственный или использовать стандартный.

  2. Функция open () вернет меньше 0, если произошла ошибка, и вы можете вызвать printf("Error: %s\n", strerror(errno));, чтобы напечатать ошибку.Если он возвращает что-то вроде «Отказано в доступе», тогда используйте sudo chmod 777 /dev/yourdevice, если в терминале Ubuntu для предоставления разрешения ему.

  3. Я не могу найти слишком много документации сам, я могу передатьВы мой код, чтобы открыть устройство, если это помогает.

0 голосов
/ 08 сентября 2013

ПОПРОБУЙТЕ ЭТО;

#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <./linux/ext2_fs.h> 
int main(int argc, char *argv[])
{
struct ext2_super_block es;
int f;
char but[1024];

  f = open("/dev/sda1", O_RDONLY);
  read(f, but, 1024);  
  read(f, &es, sizeof(struct ext2_super_block));
  printf("El tamano de int es %d byts\n", sizeof(int));
  printf("El tamano de char es %d byts\n", sizeof(char));
  printf("Número de inodos: %d \n", es.s_inodes_count);
  printf("Número de bloques: %d \n", es.s_blocks_count); 
  printf("Número de bloques libres: %d \n", es.s_free_blocks_count); 
  printf("Número de inodos libres: %d \n", es.s_free_inodes_count);
  printf("Tamano del bloque: %d \n", es.s_log_block_size);
  printf("Bloques en un grupo: %d \n", es.s_blocks_per_group);
  printf("Fragmentos en un grupo: %d \n", es.s_frags_per_group);
  printf("NM: %x\n", es.s_magic);

return (0);
}
0 голосов
/ 17 мая 2011

все поля в структуре компилируются в порядке их представления в коде

Я не знаю компилятора C, который переупорядочивает поля в структурах.Я не думаю, что это допускается стандартом C.Для alingnemt и padding посмотрите объявление структуры.Здесь задействованы некоторые макросы.

Как ведет себя Linux при попытке чтения с устройства в непривилегированном виде?

Давайте спросим ls:

j@linux:~> ls -l /dev/sda
brw-rw---- 1 root disk 8, 0 15. Mai 17:51 /dev/sda

Вы можете читать только как root или если вы в группе disk.

Где найти хорошую документацию по работе с ext2 / ext3?

Используйте источник, Люк.Не забывайте, что ядро ​​Linux может читать больше, чем ext2 / 3.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...