Linux의 가상 파일 시스템으로 작업하는 동안 경로 이름이 이미 디렉토리 항목 캐시에 디렉토리 항목으로 캐시된 경우 경로 이름을 확인하는 방법에 대한 작은 문제에 직면했습니다.
나는 확인된 경로 이름의 향후 조회 속도를 높이기 위해 다양한 디렉토리 항목이 해시 테이블에 구성되어 있음을 이해합니다. 지금 읽고 있는 책에는 이런 말이 있다.
d_hash (디렉토리 항목, 이름)
해시 값을 생성합니다. 이 함수는 dentry 해시 테이블에 대한 파일 시스템별 해시 함수입니다. dentry 매개변수는 구성요소가 포함된 디렉토리를 식별합니다. name 매개변수는 찾을 경로 이름 부분과 해시 함수에 의해 생성된 값을 포함하는 구조를 가리킵니다.
...
해시 테이블은 dentry_hashtable 배열을 통해 구현됩니다. 각 요소는 동일한 해시 테이블 값을 해시하는 디렉터리 항목 목록에 대한 포인터입니다. 배열의 크기는 일반적으로 시스템에 설치된 RAM의 양에 따라 달라집니다. 기본값은 RAM 메가바이트당 256개 항목입니다. dentry 개체의 d_hash 필드에는 단일 해시 값과 관련된 목록의 인접 요소에 대한 포인터가 포함되어 있습니다. 해시 함수는 디렉터리의 dentry 개체와 파일 이름에서 값을 생성합니다.Linux 커널에 대해 알아보기
"/home/test/file" 경로가 있다고 가정합니다. VFS는 이제 "/", "home", "test" 및 "file"에 대한 디렉토리 항목을 생성합니다.
이제 각 덴트리에 해당하는 해시 값이 어떻게 계산되는지, VFS가 해시 테이블에서 캐시된 덴트리를 통해 경로 이름을 찾는 방법을 이해할 수 없습니다. 내가 이해한 바에 따르면 VFS는 다음을 수행합니다.
- "/"의 dentry 해시와 파일 이름 "home"을 계산합니다.
- 해시 테이블에서 "home"에 해당하는 dentry의 해시 값을 찾습니다.
- "home"의 dentry 해시 값과 "test"라는 파일 이름을 계산합니다.
- 해시 테이블에서 "test"에 해당하는 dentry의 해시 값을 찾습니다.
- "test"의 dentry와 파일 이름 "file"의 해시 값을 계산합니다.
- 해시 테이블에서 "file"에 해당하는 dentry의 해시 값을 찾습니다.
그러나 인터넷의 일부 사이트에서는 VFS가 전체 경로 이름을 한 번만 해시한 다음 결과 해시를 사용하여 해당 dentry를 찾는 것처럼 들립니다.
그래서 누군가가 어둠 속에 빛을 가져올 수 있다면 좋을 것입니다.