做本地網(wǎng)站賺錢嗎?2020最成功的網(wǎng)絡營銷
【問】內(nèi)存空間的組成部分??
內(nèi)存空間分為內(nèi)核空間和用戶空間
1.內(nèi)核空間控制硬件資源,提供系統(tǒng)調(diào)用接口,保護系統(tǒng)自身安全穩(wěn)定
2.用戶空間實現(xiàn)業(yè)務邏輯
【問】如何進入內(nèi)核空間使用硬件資源?
1.系統(tǒng)調(diào)用
2.軟中斷
3.硬件中斷
【問】用戶空間與內(nèi)核空間的數(shù)據(jù)如何交換?
1.配合read函數(shù):
copy_to_user(void __user *to , const void *from , unsigned long n);
把內(nèi)核空間數(shù)據(jù)給用戶空間
2.配合write函數(shù):
copy_from_user(void *to , const void __user *from , unsigned long n);
把內(nèi)核空間數(shù)據(jù)給用戶空間
?【驅(qū)動模版中完善read和write函數(shù)】
static ssize_t cdev_read(struct file *filp, char __user *buf, size_t cnt, loff_t *offt)
{/* 模擬寄存器數(shù)據(jù) */char kbuf[32] = "this is cdev_read!";/* 把這個數(shù)組的數(shù)據(jù)拷貝到寄存器中 */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中的數(shù)據(jù)寫進內(nèi)核的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應用層】
int main(int argc, char *argv[])
{int fd;char buf1[32] = {0};char buf2[32] = "Ni Hao !!";fd = open("/dev/test", HELLO); /* 打開設備節(jié)點 */ /* 讀內(nèi)核中的kbuf數(shù)據(jù)放進buf1中 */read(fd, buf1 ,sizeof(buf1));printf("buf is %s\n",buf1);/* 寫buf2數(shù)據(jù)(ni hao)進內(nèi)核中的kbuf中*/write(fd, buf2 ,sizeof(buf2));close(fd);return 0;
}