Linux 内核使用register_filesystem添加自定义文件系统deanfs
来源:互联网 发布:js如何给div赋id 编辑:程序博客网 时间:2024/06/08 02:09
内核版本:3.0.35
先上码:
#include <linux/module.h>#include <linux/fs.h>#include <linux/pagemap.h>#include <linux/highmem.h>#include <linux/time.h>#include <linux/init.h>#include <linux/string.h>#include <linux/backing-dev.h>#include <linux/ramfs.h>#include <linux/sched.h>#include <linux/parser.h>#include <linux/magic.h>#include <linux/slab.h>#include <asm/uaccess.h>static struct dentry *deanfs_mount(struct file_system_type *fs_type, int flags, const char *dev_name, void *data){ printk(KERN_INFO"dean: %s =>> %s ==>>%d\n",__FILE__,__FUNCTION__,__LINE__); return 0;}void kill_dean_super(struct super_block *sb){ printk(KERN_INFO"dean: %s =>> %s ==>>%d\n",__FILE__,__FUNCTION__,__LINE__);}static struct file_system_type deanfs_fs_type = { .name= "deanfs", .mount= deanfs_mount, // mount -t deanfs /mnt /mnt 执行此函数 .kill_sb= kill_dean_super,};static int __init init_deanfs_fs(void){ printk(KERN_INFO"dean: %s =>> %s ==>>%d\n",__FILE__,__FUNCTION__,__LINE__); return register_filesystem(&deanfs_fs_type);}static void __exit exit_deanfs_fs(void){ printk(KERN_INFO"dean: %s =>> %s ==>>%d\n",__FILE__,__FUNCTION__,__LINE__); unregister_filesystem(&deanfs_fs_type);}module_init(init_deanfs_fs)module_exit(exit_deanfs_fs)MODULE_LICENSE("GPL");
编译,执行:
/tmp # insmod deanfs.ko
[ 2219.088567] dean: /home/dawu/network/filesystem/deanfs/deanfs.c =>> init_deanfs_fs ==>>39
/tmp #
nodev sysfs
nodev rootfs
nodev bdev
nodev proc
nodev tmpfs
nodev debugfs
nodev sockfs
nodev pipefs
nodev anon_inodefs
nodev rpc_pipefs
nodev devpts
ext3
ext2
ext4
cramfs
squashfs
nodev ramfs
vfat
msdos
nodev nfs
ntfs
nodev autofs
nodev fuse
fuseblk
nodev fusectl
nodev mqueue
nodev oprofilefs
nodev deanfs //我们新添加的文件系统
/tmp #
/tmp # mount -t deanfs /mnt /mnt
[ 2313.598446] dean: /home/dawu/network/filesystem/deanfs/deanfs.c =>> deanfs_mount ==>>20 //这里调用mount回调函数
[ 2313.607580] Unable to handle kernel NULL pointer dereference at virtual address 00000058
[ 2313.615776] pgd = e40ec000
[ 2313.618532] [00000058] *pgd=39ed7831, *pte=00000000, *ppte=00000000
[ 2313.625088] Internal error: Oops: 17 [#2] PREEMPT SMP
[ 2313.630144] Modules linked in: deanfs [last unloaded: deanfs]
[ 2313.635941] CPU: 0 Tainted: G D (3.0.35 #3)
[ 2313.641271] PC is at mount_fs+0x30/0xdc
[ 2313.645123] LR is at __schedule+0x2cc/0x79c
[ 2313.649313] pc : [<c0771c94>] lr : [<c0b22d88>] psr: 00000013
[ 2313.649318] sp : e9cb9ea0 ip : e9cb9cf8 fp : e9cb9ecc
[ 2313.660809] r10: e9ee17e0 r9 : e9ee1a60 r8 : 00000000
[ 2313.666038] r7 : 00008000 r6 : bf0081c8 r5 : 00000000 r4 : e9fc9a80
[ 2313.672570] r3 : 00000002 r2 : 00000001 r1 : e9ec8be0 r0 : 00000000
[ 2313.679104] Flags: nzcv IRQs on FIQs on Mode SVC_32 ISA ARM Segment user
[ 2313.686245] Control: 10c53c7d Table: 340ec04a DAC: 00000015
[ 2313.691996] Process mount (pid: 633, stack limit = 0xe9cb82f0)
[ 2313.697834] Stack: (0xe9cb9ea0 to 0xe9cba000)
[ 2313.702199] 9ea0: 00000000 bf0081c8 bf0081c8 e9fc9a80 bf0081c8 e9ee17e0 00000000 e9ee1a60
[ 2313.710384] 9ec0: e9cb9ef4 e9cb9ed0 c078b52c c0771c70 00000000 bf0081c8 e9ee1a60 00000000
[ 2313.718570] 9ee0: e9ee17e0 00008000 e9cb9f1c e9cb9ef8 c078b9e4 c078b4dc 00000000 00000020
[ 2313.726756] 9f00: 00000000 00008000 00000000 00008000 e9cb9f6c e9cb9f20 c078d2a4 c078b9ac
[ 2313.734940] 9f20: be8e8f88 00001000 e9fc9940 e60c4f70 c07493bc c07492b0 e9cb9f80 be8e8f88
[ 2313.743125] 9f40: 00000000 e9e36000 be8e8f88 00000000 00008000 c0683104 e9cb8000 00000000
[ 2313.751310] 9f60: e9cb9fa4 e9cb9f70 c078d96c c078ce98 00000000 00000000 00000000 e9ee1a60
[ 2313.759494] 9f80: e9ee17e0 00000000 00000000 00000000 be8e8f88 00000015 00000000 e9cb9fa8
[ 2313.767679] 9fa0: c0682ec0 c078d8e4 00000000 00000000 be8e8f88 be8e8f8d be8e8f81 00008000
[ 2313.775864] 9fc0: 00000000 00000000 be8e8f88 00000015 be8e8f8d 00000000 be8e8f81 00000000
[ 2313.784050] 9fe0: 00008000 be8e8b6c 0007e4f8 4028fb64 60000010 be8e8f88 7bfdffff 6ff9fcff
[ 2313.792254] [<c0771c94>] (mount_fs+0x30/0xdc) from [<c078b52c>] (vfs_kern_mount+0x5c/0x9c)
[ 2313.800533] [<c078b52c>] (vfs_kern_mount+0x5c/0x9c) from [<c078b9e4>] (do_kern_mount+0x44/0xe4)
[ 2313.809245] [<c078b9e4>] (do_kern_mount+0x44/0xe4) from [<c078d2a4>] (do_mount+0x418/0x708)
[ 2313.817609] [<c078d2a4>] (do_mount+0x418/0x708) from [<c078d96c>] (sys_mount+0x94/0xd4)
[ 2313.825628] [<c078d96c>] (sys_mount+0x94/0xd4) from [<c0682ec0>] (ret_fast_syscall+0x0/0x30)
[ 2313.834077] Code: e12fff3c e3700a01 e1a05000 8a000011 (e5904058)
[ 2313.840401] ---[ end trace 6fbf4607db252efa ]---
Segmentation fault
/tmp #
注:这里出现oops是因为这个只是不完整的文件系统,还差很多东西填充,接下去有空会慢慢完善。
- Linux 内核使用register_filesystem添加自定义文件系统deanfs
- Linux 文件系统注册register_filesystem与注销unregister_filesystem源码详解
- 使用 /sys 文件系统访问 Linux 内核
- 使用 /sys 文件系统访问 Linux 内核
- 使用 /sys 文件系统访问 Linux 内核
- 使用/sys文件系统访问Linux内核
- 使用/sys文件系统访问Linux内核
- 使用 /sys 文件系统访问 Linux 内核
- 使用 /sys 文件系统访问 Linux 内核
- 使用 /sys 文件系统访问 Linux 内核
- 使用 /sys 文件系统访问 Linux 内核
- 使用 /sys 文件系统访问 Linux 内核
- 使用 /sys 文件系统访问 Linux 内核
- 使用 /sys 文件系统访问 Linux 内核
- 使用 /sys 文件系统访问 Linux 内核
- 使用 /sys 文件系统访问 Linux 内核
- 使用 /sys 文件系统访问 Linux 内核
- 使用 /sys 文件系统访问 Linux 内核
- 快速排序算法和冒泡排序算法的java实现
- ndkr8d编译x264-snapshot-20140213-2245
- CentOS 安装ftp服务器vsftpd记录
- hadoop 创建用户及hdfs权限,hdfs操作等常用shell命令
- FMDB 简单使用
- Linux 内核使用register_filesystem添加自定义文件系统deanfs
- HDU 4815 Little Tiger vs. Deep Monkey 背包问题
- C++ STL 中 map 容器的说明和使用技巧
- hdu 4858 项目管理(STL容器)
- HDU4283——You Are the One(区间DP)
- 彻底解决Android因加载多个大图引起的OutOfMemoryError,内存溢出的有关问题
- 使用Flume Log4j Appender正确的姿势
- LaTeX新人教程,30分钟从完全陌生到基本入门
- poj 2533 动态规划 最长子序列