sysfs 시스템


- sysfs를 통해 커널과 사용자 영역간 통신

1. 커널 자료구조에 대한 정보를 포함하는 메모리기반 파일 시스템이다.

2. sysfs는 커널에서 구조화된 디바이스 모델의 사용자 영역 쪽의 인터페이스다.

3. 디바이스 모델

* 점점 복잡해지는 디바이스를 수많은 새로운 시스템에 일반적인 추상화를 지원하기위해 표준화된 리눅스 커널의 모델

* 시스템의 모든 장치(버스포함)의 연결 상태를 트리구조로 관리

* 전원관리와 시스템 종료의 추상화

* 전원관리와 시스템 종료의 추상화

* netlink socket을 이용하여 사용자 영역과 통신하는 uevent

* 핫 플러그 디바이스 : USB처럼 시스템이 동작 중에 장치 연결을 지원


- sysfs는 시스템 시동 시점에 /sys 아래에 마운트 된다.

1. mount -t sysfs sysfs /sys

2. /sys 디렉토리는 다음과 같다.

$ls /sys

block bus calss dev devices firmware fs kernel module power







sysfc 예제


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/device.h>
#include <linux/slab.h>
#include <linux/platform_device.h>
 
char value[1024];
 
static ssize_t show_value(struct device *dev, struct device_attribute *attr, char *buf) {
    return snprintf(buf, PAGE_SIZE, "%s\n", value);
}
 
static ssize_t store_value(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) {
    sscanf(buf, "%s", value);
    return strnlen(buf, PAGE_SIZE);
}
 
 
//dev_attr_value 변환 매크로
static DEVICE_ATTR(value, S_IRUGO | S_IWUSR, show_valuestore_value);
 
static void sysfs_test_dev_release(struct device *dev) {}
 
static struct platform_device the_pdev = {
    //생성할 디바이스 파일 이름을 지정
    .name = "sysfs_test_device",
    .id = -1,
 
    .dev = {
        .release = sysfs_test_dev_release,
    }
};
 
static int __init sysfs_test_init(void) {
    int err = 0;
 
    memset(value, 0sizeof(value));
 
    //the_pdev 를 커널에 등록한다.
    // /sys/device/platform/ 아래에 sysfs_test_device 디렉토리가 생성된다.
    err = platform_device_register(&the_pdev);
    if (err) {
        printk("platform_device_register error\n");
        return err;
    }
 
    // /sys/의 해당 디렉토리 아래 디바이스파일 value(_name)파일 생성된다.
    err = device_create_file(&the_pdev.dev, &dev_attr_value);
    if (err) {
        printk("sysfs_create_file error\n");
        goto sysfs_err;
    }
 
    return 0;
 
sysfs_err:
    // 디렉토리 삭제
    platform_device_unregister(&the_pdev);
    return err;
}
 
static void __exit sysfs_test_exit(void) {
    // 파일 삭제
    device_remove_file(&the_pdev.dev, &dev_attr_value);
    // 디렉토리 삭제
    platform_device_unregister(&the_pdev);
}
 
module_init(sysfs_test_init);
module_exit(sysfs_test_exit);
 
MODULE_LICENSE("GPL");
 
 
cs




출처 : 인지소프트웨어 기술포럼 ( 전유진 강사님 수업자료)

'임베디드 > 디바이스 드라이버' 카테고리의 다른 글

Misc 디바이스 드라이버1  (0) 2017.12.26
디바이스 드라이버 구조  (0) 2017.12.26
GPIO 제어  (0) 2017.12.26
PROCFS  (0) 2017.12.22
커널 모듈 구현  (0) 2017.12.21

+ Recent posts