tty

노요셉·2021년 7월 7일
0

tty

tty는 리눅스 디바이스 드라이버중 콘솔이나 터미널을 의미한답니다.
출처: https://m.blog.naver.com/snazzy79/70148845500
터미널을 나타내는 장치 파일은 전통적으로 tty 이란 이름으로 존재하며 복수개의 터미널이 존재하는 경우 tty0, tty1, tty2 뒤쪽에 번호를 붙여서 구분한다.

리눅스 디바이스 드라이버

유닉스 계열 시스템에서 모든 것은 파일로 취급됩니다. '모니터'라는 디바이스도 파일이고, '키보드'라는 디바이스도 파일이며, '마우스'도 파일입니다. 물론 파일시스템을 통해 디스크에 저장되어 있는 '파일'도 당연히 파일이며 앞으로 '정규파일'이라고 부름. 따라서 사용자 태스크는 현재 접근하려는 파일이 '모니터'인지, '키보드'인지, '마우스'인지, '정규파일'인지 신경 쓸 필요 없이 그저 파일만 접근하면 된다.
다시 말해, open(), read(), write(), close() 등의 일관된 함수 인터페이스를 통해 '모니터', '키보드', '마우스', '정규파일' 등의 파일을 접근하는 것이 가능하다는 뜻. 장치를 가리키는 파일을 'device file'이라고 부르고, 파일시스템을 통해 저장된 파일을 'regular file'이라고 부른다.

디바이스 드라이버는 두 가지 관점에서 생각해 볼 수 있다.

첫째는 사용자 태스크 관점에서의 디바이스 드라이버.

사용자 태스크가 접근하는 장치파일이라는 개념은 VFS가 제공하는 파일 객체를 의미한다. 파일 객체에 사용자 태스크가 행할 수 있는 연산은 linux/include/linux/fs.h 파일 내에 struct file_operations라는 이름으로 정의되어 있다. 사용자 태스크가 정규 파일에 접근한다면 파일시스템에서 제공하는 함수를 호출하게 된다. 그럼 사용자 태스크가 장치 파일에 접근할 때는?
키보드의 입력값을 얻기 위해 '키보드'장치 파일에 read()를 호출했다면, 키보드에서 입력값을 확인하고 이 값을 사용자 태스크에 넘겨주는 함수를 호출해야할 것이다. 즉, '사용자 태스크가 file_operations 구조체에 정의되어 있는 함수를 통해 장치 파일에 접근할 때 호출하는 함수를 정의하고 구현해주는 것'이 바로 디바이스 드라이버이다.

리눅스에서 사용하는 장치는 한 두가지가 아니라서, 리눅스에서는 시스템에 존재하는 여러개의 디바이스를 구분하기 위해 디바이스 마다 고유 번호를 정해준다. Major number라고 부른다. 주 번호가 같으면 같은 디바이스 드라이버에 의해 구동되겠죠.

개발자 입장에서 디바이스 드라이버

디바이스 드라이버라는 말 자체는 하드웨어로써 존재하는 디바이스를 구동시키기 위한 소프트웨어를 부르는 말이다. 디바이스라는 하드웨어는 어느 운영체제이건 심지어 운영체제가 없는 환경에서도 사용될 수 있기 때문에, 당연히 디바이스 드라이버라는 소프트웨어도 어느 운영체제이건, 혹은 운영체제가 없는 환경에서도 동작되도록 제작되어야 한다. 그런데, 운영체제마다 디바이스 드라이버를 관리하는 방식이 다 다르기 때문에, 어느 운영체제에 상관없이 동작하는 디바이스 드라이버를 만드는건 쉬운 일이 아니다.
하드웨어 밀접한 부분과, 운영체제 밀접한 부분을 구분하는게 바람직하다.
리눅스 디바이스 드라이버는 특정 하드웨어를 위한 디바이스 드라이버 코어와 코어를 리눅스에서 사용가능한 형태로 만들어주기 위한 일종의 래퍼로 구성된다. 디바이스 드라이버 코어는 하드웨어 매뉴얼을 참조하여 해당 하드웨어의 특성에 맞도록 작성하게 된다. 작성된 코어를 리눅스 커널이 알 수 있도록 커널에 등록시키고, 사용자 태스크가 장치 파일을 통해 접근 할 수 있게 해주려면 사용자 태스크가 호출한 함수들과 코어의 함수를 연결시켜줘야 한다. 이것이 바로 래퍼의 역할이다. 리눅스 커널은 드라이버의 래퍼가 제공해야할 함수를 미리 정의해 두었다. 즉 디바이스 드라이버 개발자는 어떤함수를 사용자 태스크에게 제공해야 할지 고민할 필요없이, file_operations 자료 구조에 이미 정의 되어 있는 함수들에 대해서만 제공하면 된다.

파일시스템

사용자에게 이름이라는 속성으로 접근되는 추상적인 객체인 '파일' 이라는 개념을 제공함으로써 영속적인 객체의 저장을 지원하는 소프트웨어인 것이다. 조금 다르게 표현하자면 '이름'을 입력으로 받아 해당 데이터를 리턴해주는 소프트웨어가 바로 파일시스템이다. 리눅스에서 사용하는 파일시스템은 한개가 아니다. 'linux file system'이라 구글링 해도 한개가 아님을 알 수 있다.
어느 파일시스템에 속해 있던 상관없이, 늘 하던대로 open(), read(), write(), close() 등의 함수만을 통해 접근 하려면 어떻게 해야할까? 파일시스템과 사용자 태스크 사이에 가상층을 하나 도입하는 것이다. 가상 층에서 하는 일은 상위 계층에서 open(), read() 등의 단일한 함수를 통해 파일 시스템에 접근하려하면, 인자에 담겨있는 파일 이름을 보고 파일을 관리하는 파일 시스템이 무엇인지 판단할 수 있다. 그런 뒤 해당 파일시스템의 함수를 살펴보고, 사용자가 원하는 일을 해줄 수 있는 파일시스템의 고유 함수를 호출한다. 파일 시스템의 함수가 결과를 리턴하면, 이를 사용자 태스크에게 건네준다. 이 구조가 리눅스가 채택한 가상 파일 시스템(VFS)

가상 파일 시스템(VFS)

VFS를 통해 리눅스에서 다양한 파일 시스템을 지원하는 것이 가능해졌다. 기존 유닉스의 파일시스템인 UFS, 리눅스의 Ext3, SUN에서 개발한 NFS 등 다양한 파일 시스템을 지원한다.

리눅스

리눅스 커널을 의미하는 리눅스
커널만 가지고는 할 수 있는게 없다.

리눅스 배포판을 의미하는 리눅스
리눅스 커널을 기반으로 만들어진 운영체제들을 리눅스 배포판이라고 부른다.

운영체제

자원 관리자라고 정의됩니다.
자원은 컴퓨터에 있는 CPU, 메모리, 네트워크, 디스크 등을 말합니다.
즉 컴퓨터 내부에 있는 CPU, 메모리, 네트워크 디스크 등을 관리합니다.

우리가 보는 데이터는 대부분 디스크의 파일형태로 저장되어, 프로그램이 수행될때 메모리에 올려져서 CPU에서 연산을 하게 되어, 그 결과를 눈으로 보거나 파일을 저장하는 형태가 되는데, 지금 얘기하는 일들들이 OS가 하는 일입니다.

참고: 리눅스 커널 내부구조 (백승재)

profile
서로 아는 것들을 공유해요~

0개의 댓글