User application 使用 write() 函數將字串寫到裝置檔,所以在 driver 裡頭,就要實作 write system call。當字串的傳遞是透過 write system call 寫至 kernel-space 時,driver 就要使用 copy_from_user() 來讀取 user-space 的字串。以下是一個簡單的 write driver function 實作參考,此實作提供由 kernel-space 讀取 kernel-space 字串的方法,當然這裡頭包含諸多隱含在程式裡的重要關念,例如:
1. user-space page 是 valid 或 invalid。
2. 讓不同 device file 擁有私有資料結構的做法。
3. 同一個 process 在重覆進入 write driver function 時的同步問題尚未考慮,簡單來說就是同步問題還沒考慮到。
程式片段如下:
ssize_t card_write(struct file *filp, const char *buff,
size_t count, loff_t *offp)
{
struct cdata_s *cdata = (struct cdata_s *)filp->private_data;
char *str = cdata->buffer;
int idx = cdata->idx;
int i;
if (count == 0 || count > 64)
goto fail1;
/* get data from user-space */
for (i = 0; i < count; i++) {
if (idx >= 64) {
printk(KERN_ALERT "cdata: buffer full.\n");
goto fail2;
}
if (copy_from_user(str+idx, buff+i, 1))
goto fail2;
idx++;
}
fail1:
cdata->idx = idx;
return 0;
fail2:
cdata->idx = idx;
return -EFAULT;
}
課堂中提到,這是一個 nonblocking write 的實作,後續可加入一些機制來處理 buffer full 的狀況。
Jollen's Blog 使用 Github issues 與讀者交流討論。請點擊上方的文章專屬 issue,或 open a new issue
您可透過電子郵件 jollen@jollen.org,或是 Linkedin 與我連絡。更歡迎使用微信,請搜尋 WeChat ID:jollentw