我爲我的內核模塊實現了一個char設備併爲其實現了一個讀取函數。讀函數調用copy_to_user
將數據返回給調用者。我最初以阻塞的方式實現了讀取功能(使用wait_event_interruptible
),但即使以非阻塞方式實現讀取,問題也會再現。我的代碼在MIPS處理器上運行。copy_to_user在char設備讀取函數中返回一個錯誤
用戶空間程序打開char設備並讀入堆棧中分配的緩衝區。
我發現的是偶爾copy_to_user
將無法複製任何字節。此外,即使我用(僅用於檢查......我知道這不是正確的做法)調用替換copy_to_user
,然後立即打印目標緩衝區,我看到memcpy
失敗複製任何字節。
我真的不知道如何進一步調試 - 我如何確定爲什麼內存不被複制?流程上下文有可能是錯誤的嗎?
編輯:下面是一些僞代碼概述了代碼目前的樣子:
用戶模式(重複運行):
char buf[BUF_LEN];
FILE *f = fopen(char_device_file, "rb");
fread(buf, 1, BUF_LEN, f);
fclose(f);
內核模式:
char_device =
create_char_device(char_device_name,
NULL,
read_func,
NULL,
NULL);
int read_func(char *output_buffer, int output_buffer_length, loff_t *offset)
{
int rc;
if (*offset == 0)
{
spin_lock_irqsave(&lock, flags);
while (get_available_bytes_to_read() == 0)
{
spin_unlock_irqrestore(&lock, flags);
if (wait_event_interruptible(self->wait_queue, get_available_bytes_to_read() != 0))
{
// Got a signal; retry the read
return -ERESTARTSYS;
}
spin_lock_irqsave(&lock, flags);
}
rc = copy_to_user(output_buffer, internal_buffer, bytes_to_copy);
spin_unlock_irqrestore(&lock, flags);
}
else rc = 0;
return rc;
}
你的代碼有問題,但你不顯示它。 – Tsyvarev
@Tsyvarev添加了一些僞代碼,希望能夠說明代碼所做的工作。不幸的是,我還沒有能夠縮小到一個小的,再現的例子。 – YSK
@YSK你已經聲明瞭兩次'int rc'。從'int rc = copy_to_user(output_buffer,internal_buffer,bytes_to_copy)''行中刪除'int'。 – Gaurav