-
[LINUX][KERNEL] sysfs store/show 함수의 반환값Linux/kernel 2023. 8. 3. 02:28
글 쓴 목적
- sysfs에 attribute를 만들면서 매번 반환값을 sprintf() 함수로 반환했는데, 상황에 따라 어떤 반환값을 반환해야 하는지를 이번에 정확히 알아보자.
내용
- 커널의 공식 문서를 참고하는게 가장 좋은 방법으로 보인다. 아래 Reference에서 제일 첫 번째 링크를 참고했다. 내가 중요하다 생각되는 부분만 가져왔다.
1. sysfs는 buffer의 사이즈를 PAGE_SIZE 만큼 할당하고 store() / show() 함수에 전달한다. 2. show() 함수는 buffer에 써진 바이트의 수를 반환해야 한다. 3. show() 함수는 formating value를 return 해야 하는 경우 sysfs_emit() or sysfs_emi_at() 함수를 사용해야 한다. formating value란 "%d %s 0.%x"등의 우리가 흔히 사용하는 printk 에 들어가는 그 포맷에 맞춰진 값을 의미한다. 4. store() 함수는 buffer에서 사용된 만큼의 바이트 수를 반환해야 한다. 만약 전체 버퍼가 사용된 경우 count 인수를 반환해야 한다. 5. show() / store() 함수 모두 만약 잘못된 파라미터가 인자로 올 경우, error를 리턴할 수 있다. 이제 위 내용들을 하나하나 확인해보자. 일단 공식문서의 예제는 다음과 같다.
/* 아래의 예제는 2번, 3번의 내용을 보여주고 있습니다. */ static ssize_t show_name(struct device *dev, struct device_attribute *attr, char *buf) { return sysfs_emit(buf, "%s\n", dev->name); /* 2번 | 3번 */ } /* * 4번의 내용과 일치하지 않을 수 있는 내용임. * 실제 사용되는 버퍼의 값을 반환해야 한다고 되어 있는데, 무조건 count를 반환한다. */ static ssize_t store_name(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { // (Note that the real implementation doesn’t allow userspace to set the name for a device.) snprintf(dev->name, sizeof(dev->name), "%.*s", (int)min(count, sizeof(dev->name) - 1), buf); return count; } static DEVICE_ATTR(name, S_IRUGO, show_name, store_name);
1, 4, 5번을 확인하기가 어렵다. 그래서 이제 예제로 직접 테스트를 해보자.
5번 `show() / store() 함수 모두 만약 잘못된 파라미터가 인자로 올 경우, error를 리턴할 수 있다.`
/* * 아래의 에러 값들을 반화하면 Shell에서 사용자에게 아래의 문구들을 출력한다. 반환되는 에러에 맞게 문자열이 출력된다. */ static ssize_t buttons_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t n) { struct iic1602_chip *iic1602 = dev_get_drvdata(dev); return -ENODEV; // bash: echo: write error: No such device return -EINVAL; // bash: echo: write error: Invalid argument }
4번 `store() 함수는 buffer에서 사용된 만큼의 바이트 수를 반환해야 한다. 만약 전체 버퍼가 사용된 경우 count 인수를 반환합니다.`
- 이거는 아래의 링크를 참조하는게 가장 좋을 듯 싶다.
1번 `sysfs는 buffer의 사이즈를 PAGE_SIZE 만큼 할당하고 store() / show() 함수에 전달한다.`
- 이건 소스 레벨에서 확인이 어려울 것 같다. 일단 페이지 사이즈는 `getconf PAGESIZE` or `getconf PAGE_SIZE`를 통해 알 수 있다.
- Reference
1. https://docs.kernel.org/filesystems/sysfs.html
'Linux > kernel' 카테고리의 다른 글
[리눅스] Linux kernel headers (0) 2023.08.03 [LINUX][KERNEL] sysfs attribute 구조체 및 매크로 상속 관계 (0) 2023.08.03 [리눅스 커널] Interrupt - high level reference (0) 2023.08.03 [리눅스 커널] platform driver probe를 호출하는 4가지 방법. (0) 2023.08.03 [커널][디바이스트리] 디바이스 트리에서 8, 16, 64 비트값 선언하고 읽기. (0) 2023.08.03