Linux 커널 모듈 내의 파일 읽기/쓰기
커널에서 파일을 읽고 쓰지 않는 이유에 대한 모든 논의를 알고 있습니다.그 대신 /proc 또는 netlink를 사용하여 파일을 읽는 방법을 알고 있습니다.어쨌든 읽고 쓰고 싶다.Driving Me Nuts - 커널에서 절대 해서는 안 되는 것들도 읽었습니다.
문제는 이 수출되지 입니다.sys_read()
오히려 로 싸여 있다.SYSCALL_DEFINE3
모듈에서 사용하면 다음과 같은 경고가 나타납니다.
WARNING: "sys_read" [xxx.ko] undefined!
WARNING: "sys_open" [xxx.ko] undefined!
론. 뻔. obviously. obviously.insmod
링크가 올바르게 실행되지 않기 때문에 모듈을 로드할 수 없습니다.
질문:
- 커널 (여기서 2.6.22는 / 쓰기)
sys_read()
/sys_open()
(export) SYSCALL_DEFINEn()
맹이안??? ??
커널 4. 이후 버전 4.14vfs_read
★★★★★★★★★★★★★★★★★」vfs_write
함수는 더 이상 모듈에서 사용하기 위해 내보내지 않습니다.대신 커널의 파일 액세스 전용 기능이 제공됩니다.
# Read the file from the kernel space.
ssize_t kernel_read(struct file *file, void *buf, size_t count, loff_t *pos);
# Write the file from the kernel space.
ssize_t kernel_write(struct file *file, const void *buf, size_t count,
loff_t *pos);
ㅇㅇㅇㅇ.filp_open
사용자 공간 문자열을 더 이상 받아들이지 않기 때문에 커널에 직접 액세스하기 위해 사용할 수 있습니다(와 함께 춤을 추지 않고).set_fs
를 참조해 주세요.
가능하면 Linux 커널 내에서 파일 I/O를 사용하지 않도록 해야 합니다.주요 아이디어는 시스템 핸들러가 아닌 VFS 수준의 함수를 직접 호출하는 것입니다.
내용:
#include <linux/fs.h>
#include <asm/segment.h>
#include <asm/uaccess.h>
#include <linux/buffer_head.h>
파일 열기(열기와 유사):
struct file *file_open(const char *path, int flags, int rights)
{
struct file *filp = NULL;
mm_segment_t oldfs;
int err = 0;
oldfs = get_fs();
set_fs(get_ds());
filp = filp_open(path, flags, rights);
set_fs(oldfs);
if (IS_ERR(filp)) {
err = PTR_ERR(filp);
return NULL;
}
return filp;
}
파일 닫기(닫기와 유사):
void file_close(struct file *file)
{
filp_close(file, NULL);
}
파일에서 데이터 읽기(사전 광고와 유사):
int file_read(struct file *file, unsigned long long offset, unsigned char *data, unsigned int size)
{
mm_segment_t oldfs;
int ret;
oldfs = get_fs();
set_fs(get_ds());
ret = vfs_read(file, data, size, &offset);
set_fs(oldfs);
return ret;
}
파일에 데이터 쓰기(pwrite와 유사):
int file_write(struct file *file, unsigned long long offset, unsigned char *data, unsigned int size)
{
mm_segment_t oldfs;
int ret;
oldfs = get_fs();
set_fs(get_ds());
ret = vfs_write(file, data, size, &offset);
set_fs(oldfs);
return ret;
}
동기화에 의해 파일이 변경됩니다(fsync와 유사).
int file_sync(struct file *file)
{
vfs_fsync(file, 0);
return 0;
}
[편집] 원래 새로운 커널 버전에서는 없어진 file_fsync를 사용할 것을 제안했습니다.변화를 제안했지만 거절당한 가난한 사람 덕분이다.제가 검토하기도 전에 편집이 거부되었습니다.
언급URL : https://stackoverflow.com/questions/1184274/read-write-files-within-a-linux-kernel-module
'IT이야기' 카테고리의 다른 글
JVM을 크래시하려면 어떻게 해야 합니까? (0) | 2022.07.25 |
---|---|
LocalDateTime을 사용하여 날짜를 해석/포맷하는 방법(자바 8) (0) | 2022.07.25 |
신호와 신호의 차이점은 무엇입니까? (0) | 2022.07.25 |
Vue js에서 프로토타입을 사용하는 것과 플러그인을 사용하는 것의 차이점 (0) | 2022.07.25 |
Vue.js 컴파일 오류: no-used-vars 및 no-define (0) | 2022.07.25 |