반응형
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.kosysfs에 생성된 파일을 확인합니다.출력:example_valuels /sys/kernel/example/- 값을 읽고 씁니다.
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는 사용자와 커널 간의 소통을 단순화할 수 있는 강력한 도구입니다. 실제 프로젝트에 적용하여 시스템 관리와 디버깅을 더욱 효율적으로 수행해 보세요.
반응형
'Embedded System > Linux Kernel & Device Drivers' 카테고리의 다른 글
| 리눅스 I2C 가이드: 터치 입력 드라이버 구현 및 인터럽트 활용 (0) | 2025.03.20 |
|---|---|
| 리눅스 플랫폼 드라이버 가이드: 디바이스 트리(DTS) 연동 및 실습 (0) | 2025.03.19 |
| 리눅스 캐릭터 디바이스 드라이버 가이드: cdev 및 fops 실습 예제 (0) | 2025.03.17 |
| 리눅스 커널 모듈 가이드: Hello World 작성 및 크로스 컴파일 실습 (0) | 2025.03.16 |
| 리눅스 루트 파일시스템(Rootfs) 구축 가이드: BusyBox부터 Yocto까지 (0) | 2025.03.15 |