【讯为Linux驱动开发】3.内核空间和用户空间

【问】内存空间的组成部分??

内存空间分为内核空间用户空间

1.内核空间控制硬件资源,提供系统调用接口,保护系统自身安全稳定

2.用户空间实现业务逻辑

【问】如何进入内核空间使用硬件资源?

1.系统调用

2.软中断

3.硬件中断

【问】用户空间与内核空间的数据如何交换?

1.配合read函数:

copy_to_user(void __user *to , const void *from , unsigned long n);

把内核空间数据给用户空间

2.配合write函数:

copy_from_user(void *to , const void __user *from , unsigned long n);

把内核空间数据给用户空间

【驱动模版中完善read和write函数】

cs 复制代码
static ssize_t cdev_read(struct file *filp, char __user *buf, size_t cnt, loff_t *offt)
{
    /* 模拟寄存器数据 */
    char kbuf[32] = "this is cdev_read!";
    /* 把这个数组的数据拷贝到寄存器中 */
    if(copy_to_user(buf, kbuf , strlen(kbuf))!= 0);
    {
       printk("copy_to_user error !\n");
       return -1;
    }
    printk("cdev_read success\n");
    return 0;
}

static ssize_t cdev_write(struct file *filp, const char __user *buf, size_t cnt, loff_t *offt)
{
    /* 把buf中的数据写进内核的kbuf中 */
    char kbuf[32] = {0};
    if(copy_from_user(kbuf, buf ,sizeof(buf))!= 0);
    {
       printk("copy_from_user error !\n");
       return -1;
    }
    printk("cdev_write success\n");
    return 0;            
}

【APP应用层】

cs 复制代码
int main(int argc, char *argv[])
{
   int fd;
   char buf1[32] = {0};
   char buf2[32] = "Ni Hao !!";
   fd = open("/dev/test", HELLO);  /* 打开设备节点 */   
   
   /* 读内核中的kbuf数据放进buf1中 */
   read(fd, buf1 ,sizeof(buf1));
   printf("buf is %s\n",buf1);
   
   /* 写buf2数据(ni hao)进内核中的kbuf中*/
   write(fd, buf2 ,sizeof(buf2));
   close(fd);
   return 0;  
}
相关推荐
可可嘻嘻大老虎3 小时前
nginx无法访问后端服务问题
运维·nginx
JiMoKuangXiangQu4 小时前
ARM64 进程虚拟地址空间布局
linux·arm64 虚拟地址布局
阳光九叶草LXGZXJ4 小时前
达梦数据库-学习-47-DmDrs控制台命令(LSN、启停、装载)
linux·运维·数据库·sql·学习
无忧智库4 小时前
某市“十五五“地下综合管廊智能化运维管理平台建设全案解析:从数字孪生到信创适配的深度实践(WORD)
运维·智慧城市
春日见5 小时前
如何避免代码冲突,拉取分支
linux·人工智能·算法·机器学习·自动驾驶
珠海西格5 小时前
“主动预防” vs “事后补救”:分布式光伏防逆流技术的代际革命,西格电力给出标准答案
大数据·运维·服务器·分布式·云计算·能源
无垠的广袤5 小时前
【VisionFive 2 Lite 单板计算机】边缘AI视觉应用部署:缺陷检测
linux·人工智能·python·opencv·开发板
阿波罗尼亚5 小时前
Kubectl 命令记录
linux·运维·服务器
Fᴏʀ ʏ꯭ᴏ꯭ᴜ꯭.6 小时前
Keepalived单播模式配置与实战指南
linux·服务器·负载均衡
IDC02_FEIYA6 小时前
Linux文件搜索命令有哪些?Linux常用命令之文件搜索命令find详解
linux·运维·服务器