리눅스 사용자 공간과 커널 간 인터페이스 - 1
사용자 공간의 어플리케이션이 커널과 통신하거나 커널에 의해 노출된 정보를 읽는 방법을 소개함. 예를 들어 ifconfig나 route 같은 사용자 공간 설정 명령어와 이 설정을 적용하는 커널 핸들러 사이의 인터페이스를 이야기할 때 주로 언급되는 방법을 말한다.
어플리케이션 프로그래머가 정확한 정보를 위해 사용하는 전통적인 시스템 호출 모음 외에 3개의 특별한 인터페이스가 있다.
- procfs (/proc 파일시스템)
/proc에 마운트 되는 가상 파일 시스템으로 커널은 이를 통해 내부 정보를 사용자 공간에 파일 형태로 노출한다.
Ubuntu System 안에서의 /proc 아래의 디렉터리 모습이다.
이 파일들은 실제로 디스크에 있지는 않지만, cat이나 more을 통해 읽을 수 있고, 쉘 리다이렉터인 >로 정보를 쓸 수 있다. 실제 파일 처럼 권한을 부여할 수 있으며, 이 파일을 만드는 커널 컴포넌트는 누가 이 파일을 읽고 쓰는지 지정할 수 있다.
2. sysctl ( /proc/sys 디렉터리 )
이 인터페이스는 사용자 공간에서 커널 변수를 읽거나 변경할 수 있게 해준다. 모든 커널 변수에 대해 사용할 수 없고, 커널이 명시적으로 이 인터페이스를 통해 보이도록 한 변수들만 설정 가능하다.
사용자 공간에서는 sysctl을 통해 노출된 이 변수에 2가지 방법으로 접근한다. 하나는 sysctl 시스템 호출 통해서 이고 다른 하나는 procfs이다. 커널이 procfs를 지원할 경우에는 /proc 아래에 특별한 디렉터리(/proc/sys)를 추가해서 sysctl이 노출하는 변수를 파일로서 포함하도록 한다. 이 명령어는 /proc/sys에 정보를 기록함으로써 커널과 통신한다.
My Note > 커널의 변수를 수정할 수 있는 항목들을 파일로 떨어뜨려주는데 그 부분이 /proc/sys 아래의 항목들이고 직접 echo나 쉘 리다이레션을 통해서 커널의 변수를 파일로써 수정할 수 있다. 그리고 사용자가 쉽게 사용할 수 있도록 sysctl를 제공하는 것으로 이해가 된다.
3. sysfs(/sys 파일 시스템)
procfs와 sysctl이 수년간에 걸쳐 남용되면서 새로운 파일 시스템이 필요로 하게 됐고 그것이 sysfs이다. sysfs는 많은 양의 정보를 깨끗하고 규칙성 있게 제공한다. 커널 2.6 이상에만 지원한다. ( ubuntu 20.04 쓰는데 커널버전이 5.13이다… 회사에서 옛날 버전이던가 임베디드 커널 보면 2.X 대인데… 호달달)
이것은 디폴트로 활성화가 되어있지 않다. 모듈로서 컴파일을 해야한다.
4. ioctl 시스템 호출
ioctl( 입출력 제어 ) 시스템 호출은 파일에 적용되고, 흔히 표준 시스템 호출에서 제공되지 않는 특수한 장치의 작업에 수행하는데 사용된다. ioctl은 소켓 디스크립터에도 사용 되는데, 네트워킹 코드에서 소켓 시스템 호출의 반환 값을 형태로 사용된다. 이 인터페이스는 ifconfig와 route 같은 전통적인 명령어에서 사용된다.
5. Netlink 소켓
이것은 네트워킹 어플리케이션이 커널과 통신하는 새롭고 선호하는 방식이다. IPROUTE2 패키지 명령어들이 이것을 사용한다. ⇒ 처음 봄……
책이 너무너무 어렵다... 한장한장 넘기는데 시간이 너무 오래 걸리고, 책 출판이 오래되어서 그런지 소스코드 위치도 많이 다르다. 일단 이해가 안되더라고 일단 Keep going