Linux v6.18.37 · 개념과 코드 읽기

파일 이름과 열린 파일을 관리할 저장소를 준비합니다

이 코드는 어떤 문제를 푸나요?

경로 문자열, dentry, inode, 열린 파일, mount는 서로 다른 역할의 객체입니다. VFS 초기화는 이들을 위한 저장소와 관리 체계를 준비합니다. 저장소를 만들었다고 디스크의 모든 파일 내용을 읽어 오는 것은 아닙니다.

읽을 범위: v6.18.37 · fs/dcache.c · vfs_caches_init 3264–3276행입니다. 아래에 이 범위의 원문과 각 줄의 설명을 실었습니다. 주제 전체의 흐름과 다른 경로는 기존 분석에서 함께 읽으실 수 있습니다.

먼저 알아둘 개념

dentry와 inode

dentry는 이름과 디렉터리 탐색 관계, inode는 파일 객체의 메타데이터를 표현합니다.

file 객체

열린 파일의 상태와 동작을 나타내며 디스크 데이터 캐시와 구분합니다.

처음 읽을 때

코드를 읽을 때 경로 이름을 담는 캐시를 만듭니다. 그다음 어느 상태가 바뀌는지 각 줄에서 확인하세요.

더 깊이 살펴볼 때

이 경로의 호출 문맥, 잠금·인터럽트 상태, 오류 시 남는 자원을 함께 추적해 보세요. 호출된 함수가 수행하는 작업과 현재 함수가 직접 보장하는 범위를 구분하는 것이 중요합니다.

그림으로 보는 변화

파일 이름과 열린 파일을 관리할 저장소를 준비합니다의 단계별 개념 그림
각 단계에 화살표 의미와 생략 범위를 표시했습니다. 주소·숫자 예제는 실제 장치 값을 뜻하지 않습니다.
1단계 설명

1단계 고정

GIF 원본 열기

1. 이름 버퍼 준비

경로 이름을 담는 캐시를 만듭니다.

초기화 순서를 나타내며 실제 경로 탐색은 아닙니다.

2. VFS 객체 준비

dentry·inode·file 관리 체계를 초기화합니다.

파일 내용 전체를 읽어 들이는 단계가 아닙니다.

3. 장치와 mount 기반

mount 및 블록·문자 장치 연결을 준비합니다.

장치 종류별 실제 동작은 각 구현이 담당합니다.

vfs_caches_init를 한 줄씩 읽기

줄 번호는 v6.18.37 원문 기준입니다. 주석·빈 줄을 포함한 함수 전체를 먼저 보고, 그 아래에서 각 줄을 설명합니다.

void __init vfs_caches_init(void)
{
	names_cachep = kmem_cache_create_usercopy("names_cache", PATH_MAX, 0,
			SLAB_HWCACHE_ALIGN|SLAB_PANIC, 0, PATH_MAX, NULL);

	dcache_init();
	inode_init();
	files_init();
	files_maxfiles_init();
	mnt_init();
	bdev_cache_init();
	chrdev_init();
}
void __init vfs_caches_init(void)

VFS가 경로 이름, inode, 열린 파일과 mount 정보를 관리할 저장소를 초기화합니다. 여러 파일 시스템이 공유할 공통 기반을 만든 뒤 실제 파일 시스템과 장치 사용으로 이어집니다.

	names_cachep = kmem_cache_create_usercopy("names_cache", PATH_MAX, 0,

정해진 크기의 객체 캐시를 만들면서 사용자와 복사할 수 있는 바이트 범위를 제한합니다.

			SLAB_HWCACHE_ALIGN|SLAB_PANIC, 0, PATH_MAX, NULL);

경로명 버퍼 캐시를 캐시라인에 맞추고 생성 실패 시 부팅을 중단하도록 지정합니다. offset 0부터 PATH_MAX바이트를 usercopy 허용 범위로 주며 객체 생성자 콜백은 없습니다. 앞줄에서 시작한 호출이나 식에 이어지는 부분이므로, 이 줄만으로 별도의 함수 호출이 생기지는 않습니다.

	dcache_init();

이름을 통해 dentry를 찾고 보관할 캐시 기반을 초기화합니다.

	inode_init();

파일 메타데이터 객체인 inode를 관리할 초기 상태를 준비합니다.

	files_init();

열린 파일 객체 관리 기반을 초기화합니다.

	files_maxfiles_init();

시스템이 사용할 열린 파일 수 제한을 초기화합니다.

	mnt_init();

mount 및 초기 파일 시스템 연결 상태를 준비합니다.

	bdev_cache_init();

블록 장치 객체를 관리할 캐시를 준비합니다.

	chrdev_init();

문자 장치 번호와 동작 연결을 관리할 초기 상태를 준비합니다.

함께 생각해 볼 질문

names_cache는 파일 내용 캐시인가요?

경로 이름을 저장할 객체 캐시입니다.

inode와 fd는 같은가요?

inode는 파일 메타데이터 객체이고 fd는 프로세스의 열린 파일 테이블 인덱스입니다.

모든 파일 시스템 드라이버가 여기서 초기화되나요?

VFS 공통 기반과 각 파일 시스템 드라이버의 등록은 구분해야 합니다.

출처와 읽은 범위

Linux stable v6.18.37 · fs/dcache.c

해당 버전 원본 파일 · 기존 코드 분석 · 설명 원고

맨 위로 ↑