jollen.org

Jollen 的 Blog
Jollen's email: jollen # jollen.org
more:  Jollen's Training

[教育訓練紀錄] 從 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 的狀況。

Tags:

純手工打造說明:技術專欄文章為 Jollen 原創,內容皆為人工撰寫,無 AI 生成。轉載請註明出處與作者,並全文引用。轉載時請在文章開頭或結尾明顯處註明「本文出處:https://www.jollen.org,已取得原作者同意並授權使用。」
訂閱電子報:不定期 Jollen's Blog 精選文章隨 Moko365 電子報寄送;請透過 Moko365 電子報訂閱(可隨時取消)。

Copyright(c) 2001–2008 www.jollen.org. All rights reserved.
Last update: 2026-07-22