/ proc 파일 입력 기능을 사용하여 Linux 커널 모듈에서 변수를 읽거나 쓰려고합니다. 커널 모듈이 성공적으로 컴파일되지만 다음을 통해 작성하려고 할 때
echo 1 > My_file
이 작업은 끝나지 않았습니다.
또한 dmesg 콘솔은 지속적으로 임의의 값으로 넘쳐납니다.
[ 1171.481231] proc_write_flag New_Flag 1124646486
[ 1171.481245] proc_write_flag New_Flag 1124646486
[ 1171.481259] proc_write_flag New_Flag 1124646486
[ 1171.481271] proc_write_flag New_Flag 1124646486
[ 1171.481473] ^C
나는 리눅스 장치 드라이버를 처음 사용 /proc
하고 리눅스 커널에서 제공 하는 기능 을 사용하려고합니다 . 이 커널 모듈을 제거하려고했지만 다시 작업이 완료되지 않았습니다 .
이 동작의 원인은 무엇이며 어떻게 해결할 수 있습니까?
다음은 코드입니다.
int my_flag;
static struct proc_dir_entry *pdir = NULL;
MODULE_LICENSE("GPL");
MODULE_AUTHOR("GPL");
static ssize_t proc_read_flag(struct file* page,char __user * data, size_t count, loff_t *offset);
static ssize_t proc_write_flag(struct file *file, const char __user* ubuf, size_t count, loff_t* offset);
static struct file_operations myops =
{
.owner = THIS_MODULE,
.read = proc_read_flag,
.write= proc_write_flag,
};
//ssize_t (*read) (struct file *, char __user *, size_t, loff_t *);
//Updated Read function after the reply.
static ssize_t proc_read_flag(struct file* page,char __user * data, size_t count,loff_t *offset)
{
int ret;
if( count >my_flag) //my_flag holds the count of chars received by write function.
count = my_flag;
ret = copy_to_user(data, my_buf, my_flag );
printk("%s: ret = %d ,my_flag %d\n",__FUNCTION__, ret, my_flag);
return ( my_flag - ret );
}
//ssize_t (*write) (struct file *, const char __user *, size_t, loff_t *);
//Updated Write function After the reply.
static ssize_t proc_write_flag(struct file *file, const char __user* ubuf, size_t count, loff_t* offset)
{
if( copy_from_user(my_buf,ubuf,count) ){ //Returns No. of bytes could not copy
return -EFAULT;
}
my_flag = count;
printk("%s New_Flag %d Data: %s\n",__FUNCTION__,my_flag,my_buf);
return count;
}
int init_module(void)
{
struct proc_dir_entry *pfile = NULL;
pdir = proc_mkdir("My_dir",NULL);
if(!pdir){
return -ENOMEM;
}
pfile = proc_create("My_file", 0666, pdir, &myops);
if(!pfile)
return -ENOMEM;
printk("Proc_entry Created Successfully, Module initialized\n");
return 0;
}
void cleanup_function(void)
{
remove_proc_entry("My_file", pdir);
remove_proc_entry("My_dir", NULL);
printk("Removing Proc_entry!!!");
}
쓰기 함수는 처리 한 바이트 수를 반환해야합니다.
귀하의 경우 'proc_write_flag'함수는 'ret'(0)을 반환합니다. 이는 'ubuf'에서 'count'바이트 수를 처리 할 때까지 반복적으로 호출됨을 의미합니다.
마찬가지로 'proc_read_flag'는 'data'에 쓴 바이트 수를 반환해야합니다. 귀하의 경우 0 (len)을 반환합니다.
'proc_write_flag'함수에는 다른 문제가 있습니다.
'buf'배열이 초기화되지 않았고 'buf'(address)를 int로 캐스팅하면 예상되는 답변이 제공되지 않습니다.
http://tuxthink.blogspot.com/2013/12/creating-directory-under-proc-in-kernel.html로 시작하십시오.
그런 다음 kstrtol () 함수를 살펴보십시오.
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다