【问】内存空间的组成部分??
内存空间分为内核空间 和用户空间
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;
}