通过ramdisk内核模块研究Linux文件系统

转载 2012年03月22日 16:35:09

在《深入Linux设备驱动程序内核机制》第11章"块设备驱动程序” 11.2节当中给出了ramdisk的两个版本的实现,这个示例的目的除了让读者直观感受一下编写一个块设备驱动程序的大体框架和关键元素之外,还特别提到“这个例子还有一个非常重要的潜在用途,那就是通过ramdisk来研究Linux的文件系统,比如ext3等,因为mkfs.ext3工具会将ext3文件系统做到这个ramdisk中,这意味着ext文件系统家族的超级块、组描述符、数据位图、inode位图和inode表等一系列的重量级数据结构会被记录到ramdisk中,我们可以通过另外的方式去读/写这段RAM空间来获得现场的数据,这对理解Linux中ext文件系统家族的源代码是非常有帮助的...”,当时因为书的进度以及考虑到文件系统方面的内容跟书的主题并没有直接的关联,所以并没有做实际的尝试。。。
最近我在ramdisk的源码基础上将sdisk变量给export了出来:
  1. 01.char *sdisk[RAMHD_MAX_DEVICE] = {NULL,};

  2. 02.EXPORT_SYMBOL_GPL(sdisk);
然后又重新写了另一个内核模块ram_ext3,在这个模块中我会利用前面那个ramdisk模块导出的sdisk变量来获得ramdisk上ext3文件系统的超级块等数据,因为时间的关系我只做了个原型,在ram_ext3模块的初始化函数中打印ext3 super block的一些数据,尤其是其中的s_magic成员(EXT3_SUPER_MAGIC = 0xEF53),这样可以验证所读出的数据是否是我们所需要的东西。如果读者对ext3的内核源码感兴趣,可以在ram_ext3的基础上进行扩展,以方便观察在某些文件操作之后ext3系统中数据的变化。
这个示例的操作步骤我简单描述一下:
1. 将ramdisk内核模块加入系统 insmod ramhd_mkreq.ko,成功之后将在/dev目录下产生两个设备文件节点/dev/ramhda和/dev/ramhdb
2. 我只使用其中的/dev/ramhda,在上面用mkfs.ext3命令生成ext3文件系统,命令输出截屏如下(点击放大):
     
3. 步骤2中的输出当中有几个重要的数据: Block size = 1024, First data block=1,所以ext3的文件系统super block放置在第一个block上,换句话说是sdisk[0]所在地址再加上1024才是ext3文件系统的数据,所以ram_ext3内核模块初始化函数得做如下处理 ---
  1. 01.extern char *sdisk[2];

  2. 02.static int __init ramext3_init(void)

  3. 03.{

  4. 04. //EXT3_SUPER_MAGIC = 0xEF53

  5. 05. struct ext3_super_block *sb;

  6. 06. unsigned long tmp = (unsigned long)sdisk[0];

  7. 07. tmp += 1024;

  8. 08.

  9. 09. sb = (struct ext3_super_block *)tmp;

  10. 10. //printk("sdisk = %p\n", sdisk[0]);

  11. 11. printk("s_magic = 0x%X, s_inodes=%d, s_blocks=%d\n", sb->s_magic, sb->s_inodes_count, sb->s_blocks_count);

  12. 12. printk("s_blocks_per_group = %d, s_log_frag_size=%d, s_inodes_per_group=%d\n", sb->s_blocks_per_group, sb->s_log_frag_size, sb->s_inodes_per_group);

  13. 13. return 0;

  14. 14.}
4. 把ram_ext3.ko加入系统 insmod ram_ext3.ko,然后看到dmsg的输出截屏如下(点击放大):

可以看到文件magic值为s_magic = 0xEF53, inode数量是s_inodes=2048, block块数量是s_blocks=8192,...,这些数据都与我们当初在/dev/ramhda上创建ext3时mkfs.ext3工具所输出的数据相吻合。
对ext3感兴趣的同学可以继续利用这里的试验去挖掘自己所需要的东西。最后我将ramdisk和ram_ext3内核模块的源码作为附件放在这里。。。

创建嵌入式linux混合文件系统(ramdisk+jffs2)

1、 Ramdisk文件系统 Ramdisk就是将内存中的一块区域作为物理磁盘来使用的一种技术,内存盘的存取速度要远快于目前的物理硬盘,所以它具有读写速度高的优势。在嵌入式设备中,我们可以把Ramdi...
  • u013305541
  • u013305541
  • 2014年01月01日 14:33
  • 2365

linux内核启动ramdisk根文件系统的过程分析

先转载别人的文章,然后提出我的问题:内核编译链接过程是依靠vmlinux.lds文件,以arm为例vmlinux.lds文件位于kernel/arch/arm/vmlinux.lds,vmlinux-...
  • zhengmeifu
  • zhengmeifu
  • 2013年08月22日 11:27
  • 5275

ramdisk文件系统的介绍与制作

一、文件系统与根文件系统     1、文件系统         文件系统是操作系统用于明确存储设备(常见的是磁盘,也有基于NAND Flash的固态硬盘)分区上的文件的存储方法和数据结构,即在存储设备...
  • silent123go
  • silent123go
  • 2016年09月23日 20:21
  • 2745

制作Ramdisk文件系统

主机:ubuntu14.04 工具链:arm-none-linux-gnueabi-4.8.3 one_step: 配置内核: #make menuconfig ARCH=arm 打开配置菜单,修改两...
  • u014213012
  • u014213012
  • 2016年06月04日 08:54
  • 2401

Linux内核模块编程-proc文件系统进阶

proc作为输入关于proc的一些基本概念和基本使用以及一些核心数据结构可以参考我的上一篇文章 在上一篇文章中提到了利用proc作为内核空间传递数据给用户空间的一种方式,那么proc能否作为用户空间...
  • zhangyifei216
  • zhangyifei216
  • 2015年11月14日 11:04
  • 1032

制作ZedBoard上linux根文件系统(ramdisk)

在笔者所写上一篇博客【OpenHW12参赛手记】Zedboard-网络配置方法详解http://www.eefocus.com/jefby1990/blog/13-04/293499_5fa3a.ht...
  • linuxarmsummary
  • linuxarmsummary
  • 2015年04月03日 09:28
  • 1651

Linux根文件系统的挂载过程详细分析

简单的来说,根文件系统包括虚拟根文件系统和真实根文件系统。在Kernel启动的初始阶段,首先去创建虚拟的根文件系统,接下来再去调用do_mount来加载真正的文件系统,并将根文件系统切换到真正的文件系...
  • lp542718520
  • lp542718520
  • 2014年08月21日 14:42
  • 1570

Linux内核模块编程-proc文件系统

什么是procproc文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。用户和应用程序可以通过proc得到系统的信息,并可以改变内核的某...
  • zhangyifei216
  • zhangyifei216
  • 2015年11月11日 22:49
  • 1375

文件系统Ramdisk制作

1    dd命令的解释 dd:用指定大小的块拷贝一个文件,并在拷贝的同时进行指定的转换。 参数注释: Ø  if=文件名:输入文件名,缺省为标准输入。即指定源文件。 Ø  of=文件名:输出...
  • fzs333
  • fzs333
  • 2016年02月23日 15:28
  • 561

uboot启动ramdisk和nfs文件系统 Ubuntu 配置nfs

Linux编译生成zImage,但是uboot不能识别,uboot只能识别uImage的文件格式,uImage与zImage文件的区别是uImage比zImage多个文件头,我们现在利用uboot的m...
  • wang_xya
  • wang_xya
  • 2015年02月14日 16:42
  • 726
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:通过ramdisk内核模块研究Linux文件系统
举报原因:
原因补充:

(最多只允许输入30个字)