如何为其他设备映射内存?为什么我的驱动程序的 mmap() 没有被调用?

发布于 2025-01-12 14:09:38 字数 1375 浏览 0 评论 0原文

驱动程序的 mmap() 入口点未被调用。

这是我的设备驱动程序的源代码:

struct miscdevice my_dev = {
    .minor = MISC_DYNAMIC_MINOR,
    .name = "mymma",
    .fops = &my_fops,
};

static const struct file_operations my_fops = {
    .owner                = THIS_MODULE,

    .mmap                 = my_mmap,
};


static int __init my_module_init(void)
{
    return my_init();
}

static void __exit my_module_exit(void)
{
    my_exit();
}

int my_init(void)
{
    int ret =0;
    if ((ret = misc_register(&my_dev)))
    {
        printk(KERN_ERR "Unable to register \"my mma\" misc device\n");
        return ret;
    }
    printk("kernel module installed\n");
    return ret;
}

但是我的驱动程序的 mmap() 入口点没有被调用。 这是调用它的用户空间程序:

#include <stdio.h>

 #include <sys/mman.h>
#include <fcntl.h>
int main(){

int fd=open("/dev/mymma",O_RDONLY);

if(fd<0)
exit(0);
printf("helllo\n");
int N=5;
int *ptr = mmap ( NULL, N*sizeof(int),
 PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, fd, 0 );

if(ptr == MAP_FAILED){
    printf("Mapping Failed\n");
    return 1;
}

for(int i=0; i<N; i++)
    ptr[i] = i*10;

for(int i=0; i<N; i++)
    printf("[%d] ",ptr[i]);

printf("\n");
int err = munmap(ptr, 10*sizeof(int));
if(err != 0){
    printf("UnMapping Failed\n");
    return 1;
}

return 0;
}

Driver's mmap() entry point not getting called.

This is the source code of my device driver:

struct miscdevice my_dev = {
    .minor = MISC_DYNAMIC_MINOR,
    .name = "mymma",
    .fops = &my_fops,
};

static const struct file_operations my_fops = {
    .owner                = THIS_MODULE,

    .mmap                 = my_mmap,
};


static int __init my_module_init(void)
{
    return my_init();
}

static void __exit my_module_exit(void)
{
    my_exit();
}

int my_init(void)
{
    int ret =0;
    if ((ret = misc_register(&my_dev)))
    {
        printk(KERN_ERR "Unable to register \"my mma\" misc device\n");
        return ret;
    }
    printk("kernel module installed\n");
    return ret;
}

But my driver's mmap() entry point is not getting called.
This is the user space program calling it:

#include <stdio.h>

 #include <sys/mman.h>
#include <fcntl.h>
int main(){

int fd=open("/dev/mymma",O_RDONLY);

if(fd<0)
exit(0);
printf("helllo\n");
int N=5;
int *ptr = mmap ( NULL, N*sizeof(int),
 PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, fd, 0 );

if(ptr == MAP_FAILED){
    printf("Mapping Failed\n");
    return 1;
}

for(int i=0; i<N; i++)
    ptr[i] = i*10;

for(int i=0; i<N; i++)
    printf("[%d] ",ptr[i]);

printf("\n");
int err = munmap(ptr, 10*sizeof(int));
if(err != 0){
    printf("UnMapping Failed\n");
    return 1;
}

return 0;
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

阳光下慵懒的猫 2025-01-19 14:09:38

提供驱动程序的 mmap() 入口点。

我可以注意到设备节点已打开RDONLY,但您正在使用PROT_READ/WRITE调用mmap()。此外,MAP_ANONYMOUS 使 mmap() 忽略文件描述符:您只是在内存中分配一些空间。这就是为什么你联系不到司机的原因。

Provide the mmap() entry point of your driver.

I can notice that the device node is opened RDONLY but you are calling mmap() with PROT_READ/WRITE. Moreover MAP_ANONYMOUS makes mmap() ignore the file descriptor: you are merely allocating some space in memory. That is why you don't reach your driver.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文