커 널 파일 시스템 등록

5364 단어 파일 시스템
Liux 커 널 의 파일 관리 모듈 에서 VFS 체 제 는 큰 공 을 세 웠 고 VFS 는 virtual file system 의 줄 임 말로 가상 파일 시스템 을 나타 내 며 Linux 운영 체제 에서 여러 개의 서로 다른 파일 시스템 이 작업 할 수 있 고 서로 다른 파일 시스템 간 의 차이 점 은 응용 층 에 완전히 투명 하 다.VFS 자 체 는 기술 이 아니 라 여러 가지 기술 수단 과 데이터 구조의 집합 이다. 예 를 들 어 프로 세 스 에 대한 추상 적 인 파일 관리, 만약 에 시스템 파일 관 리 를 파일 외 장 블록 관리 로 전환 하면 파일 에 대한 조작 을 어떻게 가속 화 하 는 지, 예 를 들 어 이런 모든 것 을 합치 면 파일 관리 체 제 를 형성 하고 이런 체제 의 중간 부분 을커 널 에서 주로 관리 되 고 구체 적 인 파일 시스템 과 구동 에 의존 하지 않 으 며 인터페이스 만 제공 하고 조작 이 이 루어 지지 않 는 부분 을 VFS 체제 라 고 합 니 다.
이 박문 은 내부 파일 시스템 의 등록 을 토론 한다.
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;
};
상기 구조의 필드 에 대해 다음 과 같이 설명 한다.
  • name: 파일 시스템 의 이름 입 니 다.
  • fs_flags: 파일 시스템 의 속성 과 일부 특성 설정.
  • next: 이것 은 이해 하기 쉽 고 링크 의 여러 파일 시스템 을 유지 합 니 다.
  • fs_슈퍼 스: 주어진 파일 시스템 에 대응 하 는 슈퍼 블록 체인 시트 의 헤드 노드 를 표시 합 니 다. 슈퍼 블록 대상 을 이해 하려 면 먼저 파일 시스템 으로 간단하게 이해 할 수 있 습 니 다. 많은 외부 저장 소 (하 드 디스크 등 저장 장치) 를 관리 해 야 합 니 다. 파 티 션 으로 포맷 한 후에 파일 시스템 이지 만 사용 할 수 있 는 공간 이 많 습 니 다 (예 를 들 어 120 G).이때 슈퍼 블록 은 바로 이 파일 시스템 의 사용 디 렉 터 리 입 니 다. 사실은 많은 관리 와 저장 공간 등록 정 보 를 포함 하고 있 습 니 다.fs_슈퍼 스 는 시스템 에서 같은 파일 시스템 의 슈퍼 블록 대상 을 가리 키 는 링크 입 니 다.
  • get_sb: 이것 은 함수 포인터 입 니 다. 구체 적 인 파일 시스템 에 의존 하여 이 루어 집 니 다. 슈퍼 블록 대상 을 할당 하고 이미 존재 하 는 슈퍼 블록 대상 을 초기 화하 거나 읽 는 것 을 의미 합 니 다.
  • kill_sb: 슈퍼 블록 대상 삭제.
  • owner: 파일 을 실현 하 는 모듈 을 가리 키 는 지침 입 니 다. 파일 시스템 은 원본 코드 에서 직접 실현 할 수 있 고 모듈 로 설치 할 수 있 기 때 문 입 니 다.
  • 다른 필드: 다른 것 은 모두 잠 긴 필드 입 니 다.

  • 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;
    }

    이 과정 은 파일 시스템 의 데이터 구조 인 스 턴 스 를 전체 링크 에서 삭제 하 는 것 입 니 다.

    좋은 웹페이지 즐겨찾기