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