한량처럼 살고 싶다

sysfs 본문

리눅스 커널/혼자 분석한 내용

sysfs

투영 2025. 1. 16. 19:02

GPIO 관련 커널 모듈 프로그래밍 / 드라이버 프로그래밍을 하며 공부한 내용을 정리하려고 한다.

 

sysfs 요약 

사용자 공간과 커널 공간 간의 인터페이스로 작동하며, 사용자가 커널 데이터에 쉽게 접근할 수 있도록 만든다.

 

리눅스는 모든 것이 파일 시스템이기 때문에 대부분이 cat으로 출력이 되는데, 이 점으로 인해 sysfs가 여러 개의 파일을 저장하고 있는 폴더로 인식했다.

 

검색해보니 sysfs는 파일을 저장하고 있는 것이 아닌, 커널이 실시간으로 (동적으로) 사용자가 정보를 요청하면 정보를 반환하는 인터페이스라고 한다.

 

부팅하고서도 내용이 계속 변할 수 있으며 사용자가 요청할 때마다 업데이트 된다.

 

 

sysfs 주요 기능

1. 커널 데이터 노출

1) 커널 내부의 데이터 구조를 파일 및 디렉토리 형태로 노출한다.

2) 커널 데이터의 예시: 하드웨어 정보, 장치 드라이버 정보, GPIO 상태 

 

2. 설정 변경

1) 사용자는 sysfs 를 통해 커널 속성을 읽거나 설정할 수 있다.

2) 설정의 예시: GPIO 핀의 상태를 출력 모드로 변경

 

3. 표준화된 인터페이스

1) 모든 장치 드라이버와 커널 데이터는 일관된 방식으로 sysfs에 노출된다.

2) 디렉토리와 파일 계층 구조를 사용한다. 

 

 

sysfs - GPIO 상관관계로 sysfs 이해하기

동작 원리

1) 커널이 하드웨어 (GPIO) 와 통신

  • 커널 내부에서 GPIO 핀의 값을 gpio_get_value() 와 같은 API로 읽어온다.
  • GPIO 값을 커널 내부의 데이터 구조에 저장한다.

 

2) sysfs 를 통해 사용자 공간에 노출 

  • 커널 드라이버는 sysfs_create_file()을 사용하여 sysfs에 파일을 생성
  • GPIO 값은 sysfs 파일을 통해 사용자 공간에 노출됨
  • 사용자 프로그램이 해당 파일을 읽으면, 커널이 GPIO 값을 대신 제공

 

sysfs에 값이 저장되는가?

sysfs는 값을 저장하지 않는다. 

sysfs는 실시간으로 값을 요청하는 인터페이스일 뿐, 값 자체는 sysfs 파일에 저장되지 않고, 커널이 값을 동적으로 생성하여 반환한다. 

 

즉, 

 

커널이 하드웨어(GPIO) 값을 읽어와 사용자 공간에서 쉽게 접근할 수 있도록 sysfs라는 폴더를 통해 실시간으로 제공한다.

 

sysfs는 값이 저장되지 않고, 사용자 요청 시 커널이 동적으로 값을 생성하여 반환하는 것이며

그 값을 얻어오기위해 sysfs 내부의 값을 읽어오는 동작을 하면 그 반환값을 받는 것이다. (약간 창문 같은 느낌)

 

sysfs 파일에 값이 적힌다 는 틀린 문장이며, 커널이 요청에 따라 값을 계산하거나 읽어서 반환한다는 표현이 좀 더 정확하다.

sysfs 파일은 하드웨어 값이나 커널 상태를 보여주기 위한 인터페이스일 뿐 실제 데이터를 저장하지 않기 때문이다. 

 

 

sysfs는 커널 모듈이 로드될 때 생성된다.

부팅 시 커널 모듈이 실행되면, sysfs_create_file() 이나 sysfs_create_group() 등을 호출하여 sysfs 구조를 설정한다.

 

 

커널 모듈의 `module_init` 함수에서 sysfs 파일을 생성한다고 가정했을 때,

static int __init gpio_driver_init(void) {
	gpio_request(gpio_pin, "sysfs");     
	gpio_direction_input(gpio_pin);     
	sysfs_create_file(kernel_kobj, &gpio_value_attr.attr);     
	return 0;
}

module_init(gpio_driver_init);

 

위와 같은 코드가 실행된다고 생각하면 된다. 



 

sysfs와 사용자 간의 관계

  • 부팅 시 초기화
    • sysfs 구조는 커널 모듈 로드 시 설정된다.
    • sysfs 파일과 디렉토리가 생성되는 시점이며, 값은 하드웨어 상태를 실시간으로 반영한다.
  • 실시간 제공
    • 사용자가 sysfs 파일을 읽거나 쓰는 순간, 커널이 해당 값을 계산하거나 요청하여 반환한다
    • 값이 파일에 저장되는 것이 아니라, 사용자 요청 시에만 동적으로 생성된다.