[教育訓練紀錄] 從 kernel-space 讀取 user-space 的字串

jollen 發表於 June 22, 2008 11:47 AM

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 的狀況。

讀者留言 (0)

留言功能維護中。將於近日重新開放。

連絡作者

Jollen Chen,Moko365(仕橙3G教室)講師,熱愛研究 Linux 與 Android 技術。曾為 Motorola、HTC、Foxconn、LG、OPPO、騰迅、廣達電腦、緯創、仁寶等超過 50 家企業講授課程。目前在 MokoVersity 擔任軟體工程師,撰寫 Node.js 程式,也在幾家科技廠兼任 Android Framework 研發顧問。您可透過電子郵件 <jollen (at) jollen (dot) org> 或這裡與我連絡。