-
[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
sysfs - _The_ filesystem for exporting kernel objects — The Linux Kernel documentation
sysfs - _The_ filesystem for exporting kernel objects Patrick Mochel Mike Murphy Revised 16 August 2011 Original 10 January 2003 What it is sysfs is a RAM-based filesystem initially based on ramfs. It provides a means to export kernel data structures, thei
docs.kernel.org
Why a store function in the sysfs API of the Linux Kernel needs to return used bytes?
From the documentation: store() should return the number of bytes used from the buffer. If the entire buffer has been used, just return the count argument. What does it do with this va...
stackoverflow.com
'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