Linux/Kernel Driver

Device Driver에서 Sysfs 등록

임베디드 친구 2025. 3. 18. 07:44
728x90
반응형

Device Driver에서 Sysfs 등록

Sysfs란?

sysfs는 Linux 커널에서 제공하는 가상 파일 시스템으로, 커널 객체의 속성과 정보를 사용자 공간에 노출하기 위해 사용됩니다. 이를 통해 디바이스 드라이버와 사용자 간의 인터페이스를 단순하고 효율적으로 제공할 수 있습니다.

/sys 디렉토리 아래에 구성된 sysfs는 트리 구조로 이루어져 있으며, 각 노드에 해당하는 디바이스나 커널 객체의 정보를 표현합니다. 디바이스 드라이버 개발자는 sysfs를 통해 사용자 정의 속성을 추가하거나 시스템 속성을 관리할 수 있습니다.

Sysfs 등록의 장점

  1. 가독성: 트리 구조로 조직화되어 있어 정보 접근이 용이합니다.
  2. 표준화: 통일된 인터페이스로 사용자가 디바이스 상태를 확인하거나 설정을 변경할 수 있습니다.
  3. 유연성: 디바이스 드라이버 개발자는 필요한 사용자 정의 속성을 추가할 수 있습니다.

Sysfs 등록 기본 구조

sysfs에 속성을 등록하기 위해서는 다음과 같은 과정이 필요합니다:

  1. kobject 또는 device 생성 및 초기화
  2. sysfs 파일 생성
  3. 속성을 관리할 showstore 함수 구현
  4. 속성 파일 제거

다음은 간단한 예제를 통해 설명하겠습니다.


간단한 Sysfs 등록 예제

예제 설명

다음 예제는 Rockchip RK3399 시스템에서 sysfs를 이용해 사용자 정의 속성을 등록하고 읽기/쓰기 기능을 구현하는 방법을 보여줍니다.

소스 코드

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/kobject.h>
#include <linux/sysfs.h>
#include <linux/string.h>

static struct kobject *example_kobj;
static int example_value = 0;

/* sysfs에서 값을 읽을 때 호출되는 함수 */
static ssize_t example_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf)
{
    return sprintf(buf, "%d\n", example_value);
}

/* sysfs에서 값을 쓸 때 호출되는 함수 */
static ssize_t example_store(struct kobject *kobj, struct kobj_attribute *attr, const char *buf, size_t count)
{
    sscanf(buf, "%d", &example_value);
    return count;
}

/* kobj_attribute 구조체 생성 */
static struct kobj_attribute example_attr = __ATTR(example_value, 0664, example_show, example_store);

/* 모듈 초기화 함수 */
static int __init example_init(void)
{
    int retval;

    /* kobject 생성 */
    example_kobj = kobject_create_and_add("example", kernel_kobj);
    if (!example_kobj)
        return -ENOMEM;

    /* sysfs 속성 파일 추가 */
    retval = sysfs_create_file(example_kobj, &example_attr.attr);
    if (retval) {
        kobject_put(example_kobj);
        return retval;
    }

    printk(KERN_INFO "Sysfs example module loaded.\n");
    return 0;
}

/* 모듈 종료 함수 */
static void __exit example_exit(void)
{
    kobject_put(example_kobj);
    printk(KERN_INFO "Sysfs example module unloaded.\n");
}

module_init(example_init);
module_exit(example_exit);

MODULE_LICENSE("GPL");
MODULE_AUTHOR("소프트웨어 공장");
MODULE_DESCRIPTION("Sysfs 등록 예제 모듈");

실행 및 테스트

  1. 위 코드를 sysfs_example.c로 저장합니다.

  2. 모듈을 컴파일합니다.

    make -C /lib/modules/$(uname -r)/build M=$(pwd) modules
  3. 모듈을 로드합니다.

    sudo insmod sysfs_example.ko
  4. sysfs에 생성된 파일을 확인합니다.

    ls /sys/kernel/example/

    출력:

    example_value
  5. 값을 읽고 씁니다.

    cat /sys/kernel/example/example_value
    echo 42 > /sys/kernel/example/example_value
    cat /sys/kernel/example/example_value

주요 코드 설명

  • example_show 함수는 sysfs 속성 값을 읽을 때 호출됩니다.
  • example_store 함수는 sysfs 속성 값을 쓸 때 호출됩니다.
  • __ATTR 매크로를 사용해 kobj_attribute 구조체를 초기화합니다.
  • kobject_create_and_add 함수는 새로운 kobject를 생성하고 등록합니다.
  • sysfs_create_file 함수는 sysfs 파일을 생성합니다.

Rockchip RK3399에서의 활용

RK3399와 같은 임베디드 시스템에서는 특정 하드웨어의 동작 상태를 sysfs를 통해 노출하거나, 설정값을 동적으로 변경할 때 사용할 수 있습니다. 예를 들어:

  • CPU 주파수 스케일링 정보 노출
  • 사용자 정의 GPIO 핀 상태 관리
  • 디바이스 구성 정보 제공

이 예제를 바탕으로 RK3399의 실제 하드웨어와 연결된 기능을 확장해 보세요.


마무리

이번 포스팅에서는 sysfs를 통해 간단한 사용자 정의 속성을 등록하고 관리하는 방법을 알아보았습니다. sysfs는 사용자와 커널 간의 소통을 단순화할 수 있는 강력한 도구입니다. 실제 프로젝트에 적용하여 시스템 관리와 디버깅을 더욱 효율적으로 수행해 보세요.

반응형