Linux Kernel(4.19) Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

230224
1178
109352


[리눅스커널] 질문: user application은 내가 open한 파일이 어느 파일시스템에서 관리하는지 어떻게 알까? 13. Virtual Filesystem

제 블로그에 감사하게도 '어떤 분이' 댓글로 질문을 주셨습니다. 
'각 파일시스템마다 ioctol()을 다르게 구현할 텐데, user application은 내가 open한 파일이 어느 파일시스템에 있는 파일인지 모르지 않습니까?'

답신이 길어져 새롭게 포스팅을 하고자 합니다.
 
ioctl() 함수를 사용하기 전에 open() 이나 create() 함수를 써서 fd 즉, 파일 디스크립터를 가져오게 됩니다.
#include <stdio.h>
#include <unistd.h>
#include <sys/ioctl.h>
#include <stdlib.h>
#include <fcntl.h>

int main()
{
int fd;
char buf[256];

fd = open("/dev/hdd_info", O_RDWR);
if (fd < 0)
{
printf("Device open error.\n");
return -1;
}

ioctl(fd, 0, buf);

printf("buf : %s\n", buf);

close(fd);

return 0;

다음 코드에서 fd를 얻어 온 후 fd를 첫 번째 인자로 ioctl() 함수를 호출하게 됩니다.
fd = open("/dev/hdd_info", O_RDWR);
...
ioctl(fd, 0, buf);

유저 공간에서 open() 시스템 콜을 호출하면 아래 함수가 호출됩니다.
[https://elixir.bootlin.com/linux/v4.19.30/source/fs/open.c]
SYSCALL_DEFINE3(open, const char __user *, filename, int, flags, umode_t, mode)
{
if (force_o_largefile())
flags |= O_LARGEFILE;

return do_sys_open(AT_FDCWD, filename, flags, mode);
}

이후 아래 path로 VFS 함수들이 호출됩니다.
   * do_sys_open
   * do_filp_open
   * path_openat
   * link_path_walk
   * do_last 
   * vfs_open
   * do_dentry_open

이 때 다음 동작을 수행합니다. 

   * open하려는 파일이 위치한 디렉토리가 어떤 파일 시스템으로 관리하는지 체크
   
관련 핵심 코드는 다음과 같습니다.
[https://elixir.bootlin.com/linux/v4.19.30/source/fs/open.c]
static int do_dentry_open(struct file *f,
  struct inode *inode,
  int (*open)(struct inode *, struct file *))
{
static const struct file_operations empty_fops = {};
int error;

path_get(&f->f_path);
f->f_inode = inode;
f->f_mapping = inode->i_mapping;   

정리하면 파일을 오픈하는 open 시스템을 호출할 때 커널에서 해당 파일이 어떤 파일시스템에서 관리하는지 알게 됩니다.

핑백

덧글

  • 살벌한 눈의여왕 2019/10/08 09:12 # 답글

    답변 감사드립니다. vfs를 이해하는데 써주신 글들이 큰 도움이 됩니다.
댓글 입력 영역