Device Driver에서 Sysfs 등록
Sysfs란?
sysfs
는 Linux 커널에서 제공하는 가상 파일 시스템으로, 커널 객체의 속성과 정보를 사용자 공간에 노출하기 위해 사용됩니다. 이를 통해 디바이스 드라이버와 사용자 간의 인터페이스를 단순하고 효율적으로 제공할 수 있습니다.
/sys
디렉토리 아래에 구성된 sysfs
는 트리 구조로 이루어져 있으며, 각 노드에 해당하는 디바이스나 커널 객체의 정보를 표현합니다. 디바이스 드라이버 개발자는 sysfs
를 통해 사용자 정의 속성을 추가하거나 시스템 속성을 관리할 수 있습니다.
Sysfs 등록의 장점
- 가독성: 트리 구조로 조직화되어 있어 정보 접근이 용이합니다.
- 표준화: 통일된 인터페이스로 사용자가 디바이스 상태를 확인하거나 설정을 변경할 수 있습니다.
- 유연성: 디바이스 드라이버 개발자는 필요한 사용자 정의 속성을 추가할 수 있습니다.
Sysfs 등록 기본 구조
sysfs
에 속성을 등록하기 위해서는 다음과 같은 과정이 필요합니다:
kobject
또는device
생성 및 초기화sysfs
파일 생성- 속성을 관리할
show
및store
함수 구현 - 속성 파일 제거
다음은 간단한 예제를 통해 설명하겠습니다.
간단한 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 등록 예제 모듈");
실행 및 테스트
위 코드를
sysfs_example.c
로 저장합니다.모듈을 컴파일합니다.
make -C /lib/modules/$(uname -r)/build M=$(pwd) modules
모듈을 로드합니다.
sudo insmod sysfs_example.ko
sysfs
에 생성된 파일을 확인합니다.ls /sys/kernel/example/
출력:
example_value
값을 읽고 씁니다.
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
는 사용자와 커널 간의 소통을 단순화할 수 있는 강력한 도구입니다. 실제 프로젝트에 적용하여 시스템 관리와 디버깅을 더욱 효율적으로 수행해 보세요.
'Linux > Kernel Driver' 카테고리의 다른 글
Embedded Linux Kernel: I2C 드라이버 작성 및 사용법 (0) | 2025.03.20 |
---|---|
Embedded Linux Kernel: Platform Driver 작성하기 (0) | 2025.03.19 |
Embedded Linux: Character Device Driver 작성 (0) | 2025.03.17 |
Linux Kernel 모듈 기본 (0) | 2025.03.16 |
Embedded Linux에서 Root Filesystem 생성하기 (0) | 2025.03.15 |