将ext2超级块读入ext2_super_block结构问题

时间:2011-05-17 17:30:56

标签: c linux filesystems

我已经看到了一些关于读取ext2分区超级块的问题,但我有一些问题没有在这些问题中得到解答。
他们走了:
1.使用read()从磁盘读取到ext2_super_block结构应该要求结构中的所有字段按照它们在代码中呈现的顺序进行编译,以及没有结构填充的必要性(或正确的struct padding)。怎么保证?
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 :(得分:0)

  

结构中的所有字段都按照它们在代码中显示的顺序进行编译

我知道没有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。

答案 1 :(得分:0)

我在寻求答案时遇到了一些问题。

  1. ext2_super_block struct已经设置为按顺序/填充到规范。您可以创建自己的或使用标准的。

  2. 如果出现错误,open()函数将返回小于0的值,您可以调用printf("Error: %s\n", strerror(errno));来打印错误。如果返回类似“权限被拒绝”的内容,则在Ubuntu终端中使用sudo chmod 777 /dev/yourdevice来授予权限。

  3. 我自己找不到太多文档,如果有帮助,我可以通过我的代码打开设备。

答案 2 :(得分:0)

尝试这个;

#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);
}