what is iofile_vtable

우리가 일반적으로 쓰는 stdin stdout stderr 는 IO_file 구조체와 vtable로 이루어져 있다.

위 사진과 같이 file 구조체와 vtable 이 2개가 합쳐진 구조체를 IO_file_plus 구조체 라고 한다.

C
read(0 , buf, 0x100)

다음과 같은 코드를 우리는 많이 쓴다. 여기서 0은 stdin 파일디스크립터를 나타내는 것은 다들 알것이다. 이제 키보드 버퍼에서 인터럽트를 보내고 이를 내부버퍼로 가져오면 _IO_read_ptr, _IO_read_base, _IO_read_end 얘내들이 내부버퍼를 가리키게 된다 _IO_read_base 는 현재 어디까지 썼는지 가리키며 _IO_write_base, _IO_write_ptr, _IO_write_end 반대로 얘내 셋은 내가 쓰려는 곳 즉. buf에 위치는 가리키게 된다. 이런식으로 얘내가 관리는 하게 된다.

그럼 저 아래에 vtable은 뭘까 vtable은 read , write가 사용하지는 않고 fread나 fwrite에서 stdin ,out ,err 등을 사용할때 쓰게 된다.

read 함수와 vtable의 사용:

  • read 시스템 콜: 이는 직접적으로 운영 체제의 파일 시스템 인터페이스를 사용하여 데이터를 읽습니다. read는 FILE 구조체의 vtable을 사용하지 않으며, 이는 read가 라이브러리 수준의 추상화가 아닌, 운영 체제 수준에서 직접적으로 파일을 다루기 때문입니다. read는 단순히 파일 디스크립터, 버퍼의 위치, 그리고 읽을 바이트 수를 인자로 받아 해당 파일 디스크립터에서 데이터를 읽습니다.

fread 함수와 vtable의 사용:

  • fread 함수: 이는 FILE 구조체를 사용하며, 내부적으로 FILE의 vtable에 정의된 함수들을 사용할 수 있습니다. fread는 FILE 구조체를 통해 파일의 현재 위치를 추적하고, 필요에 따라 파일 시스템에서 데이터를 미리 읽어 내부 버퍼에 저장합니다. 이후 요청받은 데이터를 이 버퍼에서 사용자가 제공한 버퍼로 복사합니다. 이 과정에서 vtable에 있는 함수들이 사용될 수 있습니다, 예를 들면 버퍼 관리, 파일 위치 조정 등의 기능을 수행합니다.

vtable인 _IO_file_jumps 는 다음과 같이 여러 file 관련 함수들의 함수 위치를 저장하고 있다. 따라서 이 iofile_vtable 을 overwrtie 하게 되면 fread나 fprintf 와 같이 file 관련 함수를 호출할때 흐름제어를 가져갈 수 있다.

좀더 자세하게 다뤄보자