Tôi đang cố gắng viết trình điều khiển thiết bị Linux. Tôi đã có nó để làm việc thực sự tốt, cho đến khi tôi đã cố gắng sử dụng "memcpy". Tôi thậm chí không nhận được một lỗi biên dịch, khi tôi "làm cho" nó chỉ cảnh báo tôi:Trình điều khiển thiết bị Linux: Biểu tượng "memcpy" không được tìm thấy
WARNING: "memcpy" [/root/homedir/sv/main.ko] undefined!
OK và khi tôi cố gắng để tải qua insmod, tôi nhận được trên giao diện điều khiển:
insmod: error inserting './main.ko': -1 Unknown symbol in module
và trên dmesg:
main: Unknown symbol memcpy (err 0)
tôi bao gồm:
#include <linux/module.h>
#include <linux/moduleparam.h>
#include <linux/init.h>
#include <linux/kernel.h> /* printk() */
#include <linux/slab.h> /* kmalloc() */
#include <linux/fs.h> /* everything... */
#include <linux/errno.h> /* error codes */
#include <linux/types.h> /* size_t */
#include <linux/fcntl.h> /* O_ACCMODE */
#include <linux/cdev.h>
#include <asm/system.h> /* cli(), *_flags */
#include <asm/uaccess.h> /* copy_*_user */
Chức năng sử dụng memcpy:
static int dc_copy_to_user(char __user *buf, size_t count, loff_t *f_pos,
struct sv_data_dev *dev)
{
char data[MAX_KEYLEN];
size_t i = 0;
/* Copy the bulk as long as there are 10 more bytes to copy */
while (i < (count + MAX_KEYLEN)) {
memcpy(data, &dev->data[*f_pos + i], MAX_KEYLEN);
ec_block(dev->key, data, MAX_KEYLEN);
if (copy_to_user(&buf[i], data, MAX_KEYLEN)) {
return -EFAULT;
}
i += MAX_KEYLEN;
}
return 0;
}
một người nào đó có thể giúp tôi? Tôi nghĩ rằng điều này là trong linux/string.h, nhưng tôi nhận được lỗi chỉ giống nhau. Tôi đang sử dụng kernel 2.6.37-rc1 (tôi đang làm trong user-mode-linux, nó chỉ hoạt động từ 2.6.37-rc1). Bất kỳ trợ giúp nào cũng được đánh giá rất cao.
# Context dependent makefile that can be called directly and will invoke itself
# through the kernel module building system.
KERNELDIR=/usr/src/linux
ifneq ($(KERNELRELEASE),)
EXTRA_CFLAGS+=-I $(PWD) -ARCH=um
obj-m := main.o
else
KERNELDIR ?= /lib/modules/$(shell uname -r)/build
PWD = $(shell pwd)
all:
$(MAKE) V=1 ARCH=um -C $(KERNELDIR) M=$(PWD) modules
clean:
rm -rf Module.symvers .*.cmd *.ko .*.o *.o *.mod.c .tmp_versions *.order
endif
Tôi nghĩ rằng bạn đang thiếu '#include' ... rõ ràng trừ khi một trong các tiêu đề linux đã bao gồm nó: p –
Machinarius
@Drknezz nó không và đó là bởi vì bạn không thể sử dụng nó. Hạt nhân không phải là môi trường được lưu trữ và không có stdio. Và mã không bao gồm stdio vì vậy cũng không có * lý do * để bao gồm nó. – hobbs
@Hinton là lỗi liên kết chứ không phải lỗi biên dịch. Bạn đang xây dựng mô-đun của mình như thế nào? – hobbs