C 如何将ramfs模块插入linux内核

C 如何将ramfs模块插入linux内核,c,linux,linux-kernel,kernel-module,vfs,C,Linux,Linux Kernel,Kernel Module,Vfs,我想编译一个非常简单的文件系统——ramfs的源代码。但当我将模块插入Linux内核3.10时,我遇到了一个问题: could not insert module myramfs.ko: Device or resource busy 我不知道哪一步我做错了。下面是我的代码 源代码:ramfs #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #包括 #定义RAMFS_默认_模式0755 #包括 #包括 #包括 常量结构地址空间操作ramfs

我想编译一个非常简单的文件系统——ramfs的源代码。但当我将模块插入Linux内核3.10时,我遇到了一个问题:

could not insert module  myramfs.ko: Device or resource busy
我不知道哪一步我做错了。下面是我的代码

源代码:ramfs

#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#包括
#定义RAMFS_默认_模式0755
#包括
#包括
#包括
常量结构地址空间操作ramfs aops={
.readpage=简单的\u readpage,
.write\u begin=simple\u write\u begin,
.write\u end=simple\u write\u end,
.set\u page\u dirty=\uu set\u page\u dirty\u no\u写回,
};
常量结构文件操作ramfs文件操作={
.read=do_sync_read,
.aio\u read=通用文件\u aio\u read,
.write=do_sync_write,
.aio\u write=通用文件\u aio\u write,
.mmap=通用文件mmap,
.fsync=noop_fsync,
.splice\u read=通用文件\u splice\u read,
.splice\u write=通用文件\u splice\u write,
.llseek=generic_file_llseek,
};
常量结构inode_操作ramfs_文件inode_操作={
.setattr=simple\u setattr,
.getattr=simple\u getattr,
};
静态常量结构超级操作ramfs操作;
静态常量结构inode_操作ramfs_dir_inode_操作;
静态结构支持\u开发信息ramfs\u支持\u开发信息={
.name=“ramfs”,
.ra_pages=0,/*无预读*/
.capabilities=BDI\U CAP\U NO\U ACCT\U和\U写回|
BDI_CAP_MAP_DIRECT | BDI_CAP_MAP|u副本|
BDI_CAP_READ_MAP | BDI_CAP_WRITE_MAP | BDI_CAP_EXEC_MAP |,
};
结构inode*ramfs\u get\u inode(结构超级块*sb,
常量结构索引节点*dir,umode\u t mode,dev\u t dev)
{
结构索引节点*索引节点=新索引节点(sb);
if(inode){
inode->i_ino=get_next_ino();
inode_init_所有者(inode、dir、mode);
inode->i_映射->a_ops=&ramfs\u aops;
inode->i_映射->backing_dev_info=&ramfs_backing_dev_info;
映射设置gfp屏蔽(inode->i\u映射,gfp\u高用户);
映射\u集\u不可战胜(inode->i\u映射);
inode->i_atime=inode->i_mtime=inode->i_ctime=CURRENT\u TIME;
开关(模式和S_IFMT){
违约:
初始化特殊inode(inode,mode,dev);
打破
案例S_IFREG:
inode->i_op=&ramfs\u文件\u inode\u操作;
inode->i\u fop=&ramfs\u file\u操作;
打破
案例S_IFDIR:
inode->i_op=&ramfs_dir_inode_操作;
inode->i_fop=&simple_dir_操作;
/*目录索引节点以i_nlink==2开始(对于“.”条目)*/
公司链接(inode);
打破
案例S_IFLNK:
inode->i_op=&page_symlink_inode_操作;
打破
}
}
返回inode;
}
/*
*文件创建。分配一个inode,我们就完成了。。
*/
/*SMP安全*/
静态整数
ramfs_mknod(struct inode*dir,struct dentry*dentry,umode_t mode,dev_t dev)
{
结构inode*inode=ramfs\u get\u inode(dir->i\u sb,dir,mode,dev);
int error=-ENOSPC;
if(inode){
d_实例化(dentry,inode);
dget(齿状突起);/*额外计数-将齿状突起固定在芯中*/
误差=0;
目录->输入时间=目录->输入时间=当前时间;
}
返回误差;
}
静态int-ramfs_-mkdir(结构索引节点*dir,结构索引*dentry,umode_-t模式)
{
int retval=ramfs_mknod(dir,dentry,mode | S_IFDIR,0);
如果(!retval)
公司(董事);
返回返回;
}
静态int-ramfs_-create(结构inode*dir、结构dentry*dentry、umode\u-t模式、bool-excl)
{
返回ramfs_mknod(dir,dentry,mode | S_IFREG,0);
}
静态int-ramfs_符号链接(结构inode*dir、结构dentry*dentry、常量char*symname)
{
结构inode*inode;
int error=-ENOSPC;
inode=ramfs_get_inode(dir->i_sb,dir,S|IFLNK | S_IRWXUGO,0);
if(inode){
int l=strlen(符号名)+1;
错误=页面\符号链接(索引节点,符号名称,l);
如果(!错误){
d_实例化(dentry,inode);
dget(丹特里);
目录->输入时间=目录->输入时间=当前时间;
}否则
iput(inode);
}
返回误差;
}
静态常量结构inode_操作ramfs_dir_inode_操作={
.create=ramfs\u create,
.lookup=简单查找,
.link=简单链接,
.unlink=simple\u unlink,
.symlink=ramfs\u symlink,
.mkdir=ramfs_mkdir,
.rmdir=simple\u rmdir,
.mknod=ramfs\u mknod,
.rename=简单的\u重命名,
};
静态常量结构超级操作ramfs\u ops={
.statfs=simple\u statfs,
.drop\u inode=generic\u delete\u inode,
.show\u options=通用的\u show\u选项,
};
结构ramfs_mount_opts{
umode_t模式;
};
枚举{
Opt_模式,
选择错误
};
静态常量匹配表令牌={
{Opt_mode,“mode=%o”},
{Opt_err,NULL}
};
结构ramfs\u fs\u信息{
结构ramfs_mount_opts mount_opts;
};
静态int-ramfs\u-parse\u选项(char*data、struct-ramfs\u-mount\u-opts*opts)
{
子字符串参数[最大选项参数];
int选项;
int标记;
char*p;
opts->mode=RAMFS\u默认\u模式;
while((p=strep(&data,“,”)!=NULL){
如果(!*p)
继续;
令牌=匹配令牌(p,令牌,args);
交换机(令牌){
案例选择单元模式:
if(匹配八进制(&args[0],&option))
返回-艾因瓦尔;
选项->模式=选项&S_IALLUGO;
打破
/*
*我们可能会在这里报告错误的装载选项;
*但传统上ramfs忽略了所有装载选项,
*因为它被用作!CONFIG_SHMEM的简单替代品
*对于tmpfs,最好继续忽略其他装载选项。
*/
}
}
返回0;
}
int-ramfs\u-fill\u-super(结构超级块*sb,void*数据,int-silent)
{
结构ramfs\u fs\u info*fsi;
结构
ifneq ($(KERNELRELEASE),)
    obj-m := myramfs.o 
else        
    KERNELDIR ?= /lib/modules/$(shell uname -r)/build
    PWD := $(shell pwd) 
default:
    $(MAKE) -C $(KERNELDIR) M=$(PWD) modules
endif

clean:
    rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions *.order *.symvers *.unsigned