Linux Kernel(4.19) Hacks

rousalome.egloos.com

포토로그 Kernel Crash


통계 위젯 (화이트)

136199
1107
135864


[리눅스커널] 가상 파일시스템이란? 13. 가상 파일 시스템

가상 파일시스템이란 무엇일까요? ext4나 proc과 같은 파일시스템일까요? 가상 파일시스템은 ext4나 proc과 같은 파일시스템은 아닙니다. 리눅스 커널에서 다양한 파일시스템이 공존하며 동적으로 실행할 수 있는 가상 소프트웨어 계층입니다. 

참고로, ext4는 Extended File System 4 약자로 리눅스 저널링 파일시스템입니다.
라즈베리파이에서 특정 파일을 생성해서 쓰고 저장할 때 ext4 파일시스템이 해당 파일을 관리합니다.

가상 파일시스템이란 용어 자체가 리눅스 커널을 처음 접하는 분에게 혼돈을 줄 수 있으니 이 용어에 대해 조금 더 짚어 봅시다. 가상이란 용어는 객체 지향에서 말하는 추상화와 유사한 개념입니다. 추상화 계층(Abstraction Layer)은 소프트웨어를 전체 구조를 설계할 때 쓰는 기법입니다. 특정 모듈의 상세한 기능을 숨기고 인터페이스 용으로 선언된 특정 함수로만 다른 계층과 인터페이싱하는 방법입니다.

소프트웨어 구조 관점으로 가상 파일시스템을 생각해봅시다. 
가상 파일시스템은 파일시스템 위에 있는 계층으로 파일시스템 계층에 접근하기 전 실행합니다. 파일시스템을 관리할 수 있는 공통 자료구조(슈퍼블록 객체, 아이노드 객체, 파일 객체, 덴트리 객체)로 파일시스템 속성을 관리하며 함수 오퍼레이션을 써서 파일시스템별 세부 함수를 호출합니다.

다음 그림을 보면서 가상 파일시스템 계층에 대해 생각해 봅시다.
 

위 그림은 유저 공간과 커널 공간에서 가상 파일시스템 계층을 표현합니다. 시스템 콜 일부분을 예로 들었습니다.

가상 파일시스템은 open(), write(), read() 함수를 유저 어플리케이션에서 호출하면 시스템 콜 실행으로 다양한 파일 시스템에 접근할 수 있는 소프트웨어 계층입니다. 이 중에는 실제 파일 시스템이 제공하는 각 연산을 지원하기 위한 필드나 함수가 있습니다. open(), read() 그리고 write() 함수들이 호출되면 각각 파일시스템별로 구현된 함수를 호출합니다. 

가상 파일시스템(Virtual File System)은 파일시스템 인터페이스를 사용자 어플리케이션에 제공하고 모든 파일시스템은 가상 파일시스템을 통해 접근 가능합니다. 또한 open(), write(), read() 함수와 같이 리눅스 표준 저수준 함수를 써서 파일에 접근하니 유저 어플리케이션 입장에서는 리눅스 커널에 파일 시스템이 하나인 것처럼 느낄 수 있습니다.

가상 파일시스템을 적용하면서 얻게 되는 특징은 다음과 같습니다.
첫째, 새로운 파일시스템을 적용해도 유저 어플리케이션나 디바이스 드라이버 코드는 호환성을 유지하며 개발할 수 있습니다. 가상 파일시스템에서 추상화 인터페이스를 지원하기 때문입니다.

둘째, 유저 어플리케이션에서 open(), write() 함수를 호출하면 시스템 콜이 실행되고 가상 파일 시스템 계층을 접근합니다. 대부분 가상 파일시스템 계층에서 제공하는 함수는 vfs_xxx() 형태입니다.


"혹시 궁금한 점이 있으면 댓글로 질문 남겨주세요. 아는 한 성실히 답변 올려드리겠습니다!" 

Thanks,
Austin Kim(austindh.kim@gmail.com)


Reference(가상 파일시스템)

가상 파일시스템 소개
파일 객체
파일 객체 함수 오퍼레이션 동작
프로세스는 파일객체 자료구조를 어떻게 관리할까?
슈퍼블록 객체
아이노드 객체
덴트리 객체
가상 파일시스템 디버깅


핑백

덧글

  • Hans 2020/02/12 08:07 # 삭제 답글

    안녕하세요. 김현수입니다. 제가 Flash 기반의 Embedded 제품을 개발해서 사용중이였습니다. ST32M3 칩셋의 경우 적은 RAM과 512KB의 Flash를 가지고 있어서 Flash Address를 직접 읽거나 쓰기등을 했는데 리눅스 환경 제품을 개발하다 보니 RAM은 512MB, Flash는 NAND flash로 512MB라는 큰 space가 있고 Flash 기반 code를 리눅스로 옮기려고 하니 문제가 발생했습니다. Flash기반 Read/Write등이 곤란하게 되었습니다.
    제가 궁금한것은 두개의 ELF 파일이 있는데 한개의 ELF 파일에서 다른 ELF 파일의 함수를 호출할 방법이 있는지 궁금합니다. 구글을 검색해도 찾지도 못하겠고.. 아이디어도 없고.. 말로 물어보기도 어렵구요.
    예를 들면 A라는 파일이 있는데 이는 리눅스에서 실행되는 파일입니다. B라는 파일이 있는데 이것은 main()이 없고 A 파일이 부를 함수가 있습니다. 가장 간단하게 A 파일에는 main() 함수가 있고 B 파일은 main()이 없이 AA(), BB() 함수만 존재합니다. AA, BB에는 그냥 기본적인 printf()만 추가했습니다. A파일의 main()에서 다른 실행파일인 B의 AA()를 호출하고 싶은데 어떻게 호출해야 할지를 모르겠습니다. 혹시 아시거나 아이디어 있으면 좀 가르쳐 주시면 감사하겠습니다.
    기존 Flash 기반일떄 B 파일을 특정 Address에 써서 이 Address를 읽어서 함수를 호출했는데 리눅스로 오니 Address 방식으로 접근이 되지 않고 파일로 관리를 해야 해서 어떻게 해야 할지를 모르겠네요. 구글 검색어로 뭐라고 해야 할지도 몰라서 이것 저것 찾고 있지만 찾지를 못하고 있구요.

    감사합니다.
  • AustinKim 2020/02/14 17:04 #

    죄송하지만 ST32M3 칩셋 환경에서 개발을 한 적이 없어 도움을 드리지 못할 것 같습니다.
댓글 입력 영역