커 널 파일 시스템 등록
5364 단어 파일 시스템
이 박문 은 내부 파일 시스템 의 등록 을 토론 한다.
1. 파일 시스템 은 어디로 등록 합 니까?
파일 시스템 등록 을 설명 하기 전에 일부 파일 시스템 이 어디로 등록 되 는 지 알 아 보 는 것 은 본질 적 으로 커 널 이 이미 등 록 된 모든 파일 시스템 을 어떻게 관리 하 는 지 하 는 것 이다.운영 체제 에 파일 시스템 을 추가 하려 면 커 널 은 이 파일 시스템 의 정 보 를 어디 에 저장 해 야 합 니까?
커 널 은 파일 시스템 을 전역 변수 에 저장 하고 원본 파일 filesystems. c 파일 에서 정의 합 니 다.
static struct file_system_type *file_systems;
이것 은 전역 변수 로 시스템 에 등 록 된 모든 파일 시스템 을 저장 하기 때문에 struct file 을 상상 할 수 있 습 니 다.system_type 은 반드시 링크 와 같은 저장 구 조 를 유지 해 야 합 니 다.2. 데이터 구조
등 록 돼 야 할 모든 파일 시스템 은 아래 구조 로 표 시 됩 니 다.
struct file_system_type {
const char *name;
int fs_flags;
int (*get_sb) (struct file_system_type *, int,
const char *, void *, struct vfsmount *);
void (*kill_sb) (struct super_block *);
struct module *owner;
struct file_system_type * next;
struct list_head fs_supers;
struct lock_class_key s_lock_key;
struct lock_class_key s_umount_key;
struct lock_class_key i_lock_key;
struct lock_class_key i_mutex_key;
struct lock_class_key i_mutex_dir_key;
struct lock_class_key i_alloc_sem_key;
};
상기 구조의 필드 에 대해 다음 과 같이 설명 한다.3. 파일 시스템 등록
rootfs 파일 시스템 의 등록 을 예 로 들 면 이 파일 시스템 은 시스템 초기 화 기간 에 등 록 된 것 입 니 다. 호출 경 로 는 다음 과 같 습 니 다.
asmlinkage void __init start_kernel(void)
{
。。。。。。
vfs_caches_init(num_physpages);
。。。。。。
}
void __init vfs_caches_init(unsigned long mempages)
{
。。。。。。
mnt_init();
。。。。。。
}
void __init mnt_init(void)
{
。。。。。。
init_rootfs();
。。。。。。
}
int __init init_rootfs(void)
{
int err;
err = bdi_init(&ramfs_backing_dev_info);
if (err)
return err;
err = register_filesystem(&rootfs_fs_type);
if (err)
bdi_destroy(&ramfs_backing_dev_info);
return err;
}
rootfs 파일 시스템 의 정 의 는 다음 과 같다.static struct file_system_type rootfs_fs_type = {
.name = "rootfs",
.get_sb = rootfs_get_sb,
.kill_sb = kill_litter_super,
};
그리고 register 호출 가능filesystem 은 파일 시스템 의 등록 을 완 료 했 습 니 다. 이 정 의 는 비교적 간단 합 니 다. 다른 파일 시스템 으로서 다음 과 같이 정의 합 니 다.static struct file_system_type ext2_fs_type = {
.owner = THIS_MODULE,
.name = "ext2",
.get_sb = ext2_get_sb,
.kill_sb = kill_block_super,
.fs_flags = FS_REQUIRES_DEV,
};
위의 구조 인 스 턴 스 는 바로 EXT 2 파일 시스템 입 니 다. 본 고 는 이 파일 시스템 의 등록 과정 을 토론 하지 않 지만 결국은 register 를 호출 할 것 입 니 다.filesystem 함수 등록 완료.
int register_filesystem(struct file_system_type * fs)
{
int res = 0;
struct file_system_type ** p;
BUG_ON(strchr(fs->name, '.'));
if (fs->next)
return -EBUSY;
INIT_LIST_HEAD(&fs->fs_supers);
write_lock(&file_systems_lock);
p = find_filesystem(fs->name, strlen(fs->name));
if (*p)
res = -EBUSY;
else
*p = fs;
write_unlock(&file_systems_lock);
return res;
}
static struct file_system_type **find_filesystem(const char *name, unsigned len)
{
struct file_system_type **p;
for (p=&file_systems; *p; p=&(*p)->next)
if (strlen((*p)->name) == len &&
strncmp((*p)->name, name, len) == 0)
break;
return p;
}
위의 과정 은 비교적 간단 하 다. 바로 전역 변수 file시스템 에서 같은 파일 시스템 을 찾 았 습 니 다. 파일 시스템 이 존재 한다 면 이 파일 시스템 에 등 록 된 것 을 설명 합 니 다. 링크 에 존재 하지 않 으 면 이 파일 을 링크 에 추가 하여 파일 시스템 의 등록 을 완성 합 니 다. 따라서 등록 과정 은 파일 시스템 의 데이터 결 구 를 전체적인 링크 에 추가 하 는 것 입 니 다.4. 파일 시스템 의 마 운 트 해제
마 운 트 해제 과정 이 비교적 간단 합 니 다. unregister 호출filesystem 함수 완성:
int unregister_filesystem(struct file_system_type * fs)
{
struct file_system_type ** tmp;
write_lock(&file_systems_lock);
tmp = &file_systems;
while (*tmp) {
if (fs == *tmp) {
*tmp = fs->next;
fs->next = NULL;
write_unlock(&file_systems_lock);
return 0;
}
tmp = &(*tmp)->next;
}
write_unlock(&file_systems_lock);
return -EINVAL;
}
이 과정 은 파일 시스템 의 데이터 구조 인 스 턴 스 를 전체 링크 에서 삭제 하 는 것 입 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Cognos에서 파일 시스템 (폴더)에 보고서를 출력하는 방법Cognos BI & Analytics에서 Cognos 서버의 파일 시스템(폴더)에 보고서를 파일로 출력하는 절차입니다. 최근 질문을 받았으므로 드디어 게시합니다. Cognos 서버에 보고서를 출력할 폴더를 만듭니다...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.