- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在编写一个内核模块,它应该充当字符设备,充当循环 FIFO 设备,但是当我尝试编译它时,我遇到了一些错误,我不知道如何修复,这是我的源代码。如果我的英语不好,我很抱歉,如果我不写更多信息,我是 Linux 模块中的 C 新手,我使用的是 debian 6,我认为这是包含的问题,“cbuffer_t 是循环 FIFO(已提供给我,应该不会有问题。
我收到的编译消息:
make
make -C /lib/modules/2.6.39.4.mikernel/build M=/home/dsouser/Escritorio/Prac3/ParteB modules
make[1]: se ingresa al directorio `/usr/src/linux-headers-2.6.39.4.mikernel'
CC [M] /home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.o
/home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:3:19: error: fcntl.h: No existe el fichero o el directorio
In file included from /home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:11:
/usr/src/linux-headers-2.6.39.4.mikernel/arch/x86/include/asm/uaccess.h:27:1: warning: "KERNEL_DS" redefined
In file included from /home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:6:
include/asm-generic/uaccess.h:18:1: warning: this is the location of the previous definition
In file included from /home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:11:
/usr/src/linux-headers-2.6.39.4.mikernel/arch/x86/include/asm/uaccess.h:28:1: warning: "USER_DS" redefined
In file included from /home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:6:
include/asm-generic/uaccess.h:22:1: warning: this is the location of the previous definition
In file included from /home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:11:
/usr/src/linux-headers-2.6.39.4.mikernel/arch/x86/include/asm/uaccess.h:80:1: warning: "access_ok" redefined
In file included from /home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:6:
include/asm-generic/uaccess.h:40:1: warning: this is the location of the previous definition
In file included from /home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:11:
/usr/src/linux-headers-2.6.39.4.mikernel/arch/x86/include/asm/uaccess.h:95: error: redefinition of ‘struct exception_table_entry’
In file included from /home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:11:
/usr/src/linux-headers-2.6.39.4.mikernel/arch/x86/include/asm/uaccess.h:155:1: warning: "get_user" redefined
In file included from /home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:6:
include/asm-generic/uaccess.h:219:1: warning: this is the location of the previous definition
/usr/src/linux-headers-2.6.39.4.mikernel/arch/x86/include/asm/uaccess.h:221: error: conflicting types for ‘__put_user_bad’
include/asm-generic/uaccess.h:177: note: previous declaration of ‘__put_user_bad’ was here
In file included from /home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:11:
/usr/src/linux-headers-2.6.39.4.mikernel/arch/x86/include/asm/uaccess.h:250:1: warning: "put_user" redefined
In file included from /home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:6:
include/asm-generic/uaccess.h:163:1: warning: this is the location of the previous definition
In file included from /home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:11:
/usr/src/linux-headers-2.6.39.4.mikernel/arch/x86/include/asm/uaccess.h:491:1: warning: "__get_user" redefined
In file included from /home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:6:
include/asm-generic/uaccess.h:179:1: warning: this is the location of the previous definition
In file included from /home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:11:
/usr/src/linux-headers-2.6.39.4.mikernel/arch/x86/include/asm/uaccess.h:514:1: warning: "__put_user" redefined
In file included from /home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:6:
include/asm-generic/uaccess.h:143:1: warning: this is the location of the previous definition
In file included from /usr/src/linux-headers-2.6.39.4.mikernel/arch/x86/include/asm/uaccess.h:571,
from /home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:11:
/usr/src/linux-headers-2.6.39.4.mikernel/arch/x86/include/asm/uaccess_32.h:45: error: conflicting types for ‘__copy_to_user’
include/asm-generic/uaccess.h:108: note: previous definition of ‘__copy_to_user’ was here
/usr/src/linux-headers-2.6.39.4.mikernel/arch/x86/include/asm/uaccess_32.h:83: error: redefinition of ‘__copy_to_user’
/usr/src/linux-headers-2.6.39.4.mikernel/arch/x86/include/asm/uaccess_32.h:45: note: previous definition of ‘__copy_to_user’ was here
/usr/src/linux-headers-2.6.39.4.mikernel/arch/x86/include/asm/uaccess_32.h:90: error: conflicting types for ‘__copy_from_user’
include/asm-generic/uaccess.h:78: note: previous definition of ‘__copy_from_user’ was here
/usr/src/linux-headers-2.6.39.4.mikernel/arch/x86/include/asm/uaccess_32.h:138: error: redefinition of ‘__copy_from_user’
/usr/src/linux-headers-2.6.39.4.mikernel/arch/x86/include/asm/uaccess_32.h:90: note: previous definition of ‘__copy_from_user’ was here
/usr/src/linux-headers-2.6.39.4.mikernel/arch/x86/include/asm/uaccess_32.h:188: error: conflicting types for ‘copy_to_user’
include/asm-generic/uaccess.h:253: note: previous definition of ‘copy_to_user’ was here
/usr/src/linux-headers-2.6.39.4.mikernel/arch/x86/include/asm/uaccess_32.h:203: error: conflicting types for ‘copy_from_user’
include/asm-generic/uaccess.h:243: note: previous definition of ‘copy_from_user’ was here
/home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c: In function ‘init_module’:
/home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:67: warning: assignment from incompatible pointer type
/home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c: In function ‘cleanup_module’:
/home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:95: warning: passing argument 1 of ‘destroy_cbuffer_t’ from incompatible pointer type
/home/dsouser/Escritorio/Prac3/ParteB/cbuffer.h:19: note: expected ‘struct cbuffer_t *’ but argument is of type ‘struct cbuffer_t *’
/home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c: In function ‘device_read’:
/home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:156: warning: passing argument 1 of ‘size_cbuffer_t’ from incompatible pointer type
/home/dsouser/Escritorio/Prac3/ParteB/cbuffer.h:22: note: expected ‘struct cbuffer_t *’ but argument is of type ‘struct cbuffer_t *’
/home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:163: warning: passing argument 1 of ‘size_cbuffer_t’ from incompatible pointer type
/home/dsouser/Escritorio/Prac3/ParteB/cbuffer.h:22: note: expected ‘struct cbuffer_t *’ but argument is of type ‘struct cbuffer_t *’
/home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:164: warning: passing argument 1 of ‘size_cbuffer_t’ from incompatible pointer type
/home/dsouser/Escritorio/Prac3/ParteB/cbuffer.h:22: note: expected ‘struct cbuffer_t *’ but argument is of type ‘struct cbuffer_t *’
/home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:164: warning: value computed is not used
/home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:177: warning: passing argument 1 of ‘remove_items_cbuffer_t’ from incompatible pointer type
/home/dsouser/Escritorio/Prac3/ParteB/cbuffer.h:43: note: expected ‘struct cbuffer_t *’ but argument is of type ‘struct cbuffer_t *’
/home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c: In function ‘device_write’:
/home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:205: warning: passing argument 1 of ‘size_cbuffer_t’ from incompatible pointer type
/home/dsouser/Escritorio/Prac3/ParteB/cbuffer.h:22: note: expected ‘struct cbuffer_t *’ but argument is of type ‘struct cbuffer_t *’
/home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:207: warning: passing argument 1 of ‘insert_items_cbuffer_t’ from incompatible pointer type
/home/dsouser/Escritorio/Prac3/ParteB/cbuffer.h:37: note: expected ‘struct cbuffer_t *’ but argument is of type ‘struct cbuffer_t *’
/home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:211: warning: passing argument 1 of ‘nr_gaps_cbuffer_t’ from incompatible pointer type
/home/dsouser/Escritorio/Prac3/ParteB/cbuffer.h:25: note: expected ‘struct cbuffer_t *’ but argument is of type ‘struct cbuffer_t *’
/home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.c:212: warning: passing argument 1 of ‘insert_items_cbuffer_t’ from incompatible pointer type
/home/dsouser/Escritorio/Prac3/ParteB/cbuffer.h:37: note: expected ‘struct cbuffer_t *’ but argument is of type ‘struct cbuffer_t *’
make[2]: *** [/home/dsouser/Escritorio/Prac3/ParteB/driverPersonal.o] Error 1
make[1]: *** [_module_/home/dsouser/Escritorio/Prac3/ParteB] Error 2
make[1]: se sale del directorio `/usr/src/linux-headers-2.6.39.4.mikernel'
make: *** [all] Error 2
这是来源。很抱歉这篇文章很长,但我不知道如何解决它。我已经阅读了内核模块编程指南,但我还没有理解其中的一半,它并没有帮助我修复这个源代码。
#define MAX_BUFFER_SIZE 1024
#include <fcntl.h>
#include "cbuffer.h"
#include <linux/string.h>
#include <asm-generic/uaccess.h>
#include <linux/spinlock.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <asm/uaccess.h> /* for put_user */
#include <linux/semaphore.h>
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("Driver Module for DSO");
MODULE_AUTHOR("Kaostias");
/*
* Prototypes - this would normally go in a .h file
*/
int init_module(void);
void cleanup_module(void);
static int device_open(struct inode *, struct file *);
static int device_release(struct inode *, struct file *);
static ssize_t device_read(struct file *, char *, size_t, loff_t *);
static ssize_t device_write(struct file *, const char *, size_t, loff_t *);
#define SUCCESS 0
#define DEVICE_NAME "characterDevice" /* Dev name as it appears in /proc/devices */
#define BUF_LEN 80 /* Max length of the message from the device */
/*
* Global variables are declared as static, so are global within the file.
*/
static int Major; /* Major number assigned to our device driver */
static int Device_Open = 0; /* Is device open?
* Used to prevent multiple access to device */
static char msg[BUF_LEN]; /* The msg the device will give when asked */
static char *msg_Ptr;
struct cbuffer_t * buf;
/*semaphore_t fifoR = */DEFINE_SEMAPHORE(fifoR);
/*semaphore_t fifoW = */DEFINE_SEMAPHORE(fifoW);
static struct file_operations fops = {
.read = device_read,
.write = device_write,
.open = device_open,
.release = device_release
};
/*
* This function is called when the module is loaded
*/
int init_module(void)
{
Major = register_chrdev(0, DEVICE_NAME, &fops);
if (Major < 0) {
printk(KERN_ALERT "Registering char device failed with %d\n", Major);
return Major;
}
/*
* Creation of buffer;
*/
if( (buf = create_cbuffer_t(MAX_BUFFER_SIZE)) != NULL){
printk(KERN_ALERT "Error when creating the FIFO device.");
}
printk(KERN_INFO "Buffer created without error.\n");
printk(KERN_INFO "I was assigned major number %d. To talk to\n", Major);
printk(KERN_INFO "the driver, create a dev file with\n");
printk(KERN_INFO "'mknod /dev/%s c %d 0'.\n", DEVICE_NAME, Major);
printk(KERN_INFO "Try various minor numbers. Try to cat and echo to\n");
printk(KERN_INFO "the device file.\n");
printk(KERN_INFO "Remove the device file and module when done.\n");
return SUCCESS;
}
/*
* This function is called when the module is unloaded
*/
void cleanup_module(void)
{
/*
* Unregister the device
*/
/*int ret = */unregister_chrdev(Major, DEVICE_NAME);
/* if (ret < 0)
printk(KERN_ALERT "Error in unregister_chrdev\n");//, ret);*/
/*
* Destroys the FIFO buffer
*/
destroy_cbuffer_t (buf);
}
/*
* Methods
*/
/*
* Called when a process tries to open the device file, like
* "cat /dev/mycharfile"
*/
static int device_open(struct inode *inode, struct file *file)
{
static int counter = 0;
if (Device_Open)
return -EBUSY;
Device_Open++;
sprintf(msg, "The device %s has been open %d times.\n",DEVICE_NAME ,counter++);
msg_Ptr = msg;
try_module_get(THIS_MODULE);
return SUCCESS;
}
/*
* Called when a process closes the device file.
*/
static int device_release(struct inode *inode, struct file *file)
{
Device_Open--; /* We're now ready for our next caller */
/*
* Decrement the usage count, or else once you opened the file, you'll
* never get get rid of the module.
*/
module_put(THIS_MODULE);
return SUCCESS;
}
/*
* Called when a process, which already opened the dev file, attempts to
* read from it.
*/
static ssize_t device_read(struct file *filp, /* see include/linux/fs.h */
char *buffer, /* buffer to fill with data */
size_t length, /* length of the buffer */
loff_t * offset)
{
int i =0;
/*
* Number of bytes actually written to the buffer
*/
int bytes_read = 0;
/*
* If we're at the end of the message,
* return 0 signifying end of file
*/
if (size_cbuffer_t(buf)<=0)
return 0; //It should not be able to be less than 0 but just in case
/*
* If the size is higher than the current content, the size of lecture gets
* changed
*/
if(size_cbuffer_t(buf) < length)
length == size_cbuffer_t(buf);
/*
* The buffer is in the user data segment, not the kernel
* segment so "*" assignment won't work. We have to use
* put_user which copies data from the kernel data segment to
* the user data segment.
*/
//Se quita la cadena del buffer
remove_items_cbuffer_t (buf, msg_Ptr, length);
while ((i = length)> 0){
put_user(*(msg_Ptr++), buffer++);
length--;
bytes_read++;
}
/*
* Most read functions return the number of bytes put into the buffer
*/
return bytes_read;
}
/*
* Called when a process writes to dev file: echo "hi" > /dev/hello
*/
static ssize_t
device_write(struct file *filp, const char *buff, size_t len, loff_t * off)
{
//char[BUF_LEN] aux;
int ret = len;
if (sizeof(buff) == 0 || buff == NULL)
return -EINVAL;
while (len) {
get_user(*(msg_Ptr++), buff++);
len--;
}
if(size_cbuffer_t(buf) >= ret){
insert_items_cbuffer_t (buf, msg_Ptr, ret);
}else{
//strcpy(aux, msg_Ptr, size_cbuffer_t(buf));
ret = nr_gaps_cbuffer_t(buf);
insert_items_cbuffer_t(buf, msg_Ptr, ret);
}
return ret;
}
我的 makefile 是
obj-m = driverPersonal.o
all :
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean :
make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
最佳答案
找不到头文件fcntl.h...将其添加到包含路径。编译器标志为 -Idir_name。
您确定可以使用内核代码中的 libc 头文件吗?
关于导入文件中的类型冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20972543/
我正在尝试编写一个相当多态的库。我遇到了一种更容易表现出来却很难说出来的情况。它看起来有点像这样: {-# LANGUAGE ScopedTypeVariables #-} {-# LANGUAGE
谁能解释一下这个表达式是如何工作的? type = type || 'any'; 这是否意味着如果类型未定义则使用“任意”? 最佳答案 如果 type 为“falsy”(即 false,或 undef
我有一个界面,在IAnimal.fs中, namespace Kingdom type IAnimal = abstract member Eat : Food -> unit 以及另一个成功
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: What is the difference between (type)value and type(va
在 C# 中,default(Nullable) 之间有区别吗? (或 default(long?) )和 default(long) ? Long只是一个例子,它可以是任何其他struct类型。 最
假设我有一个案例类: case class Foo(num: Int, str: String, bool: Boolean) 现在我还有一个简单的包装器: sealed trait Wrapper[
这个问题在这里已经有了答案: Create C# delegate type with ref parameter at runtime (1 个回答) 关闭 2 年前。 为了即时创建委托(dele
我正在尝试获取图像的 dct。一开始我遇到了错误 The function/feature is not implemented (Odd-size DCT's are not implemented
我正在尝试使用 AFNetworking 的 AFPropertyListRequestOperation,但是当我尝试下载它时,出现错误 预期的内容类型{( “应用程序/x-plist” )}, 得
我在下面收到错误。我知道这段代码的意思,但我不知道界面应该是什么样子: Element implicitly has an 'any' type because index expression is
我尝试将 SignalType 从 ReactiveCocoa 扩展为自定义 ErrorType,代码如下所示 enum MyError: ErrorType { // .. cases }
我无法在任何其他问题中找到答案。假设我有一个抽象父类(super class) Abstract0,它有两个子类 Concrete1 和 Concrete1。我希望能够在 Abstract0 中定义类
我想知道为什么这个索引没有用在 RANGE 类型中,而是用在 INDEX 中: 索引: CREATE INDEX myindex ON orders(order_date); 查询: EXPLAIN
我正在使用 RxJava,现在我尝试通过提供 lambda 来订阅可观察对象: observableProvider.stringForKey(CURRENT_DELETED_ID) .sub
我已经尝试了几乎所有解决问题的方法,其中包括。为 提供类型使用app.use(express.static('public'))还有更多,但我似乎无法为此找到解决方案。 index.js : imp
以下哪个 CSS 选择器更快? input[type="submit"] { /* styles */ } 或 [type="submit"] { /* styles */ } 只是好
我不知道这个设置有什么问题,我在 IDEA 中获得了所有注释(@Controller、@Repository、@Service),它在行号左侧显示 bean,然后转到该 bean。 这是错误: 14-
我听从了建议 registering java function as a callback in C function并且可以使用“简单”类型(例如整数和字符串)进行回调,例如: jstring j
有一些 java 类,加载到 Oracle 数据库(版本 11g)和 pl/sql 函数包装器: create or replace function getDataFromJava( in_uLis
我已经从 David Walsh 的 css 动画回调中获取代码并将其修改为 TypeScript。但是,我收到一个错误,我不知道为什么: interface IBrowserPrefix { [
我是一名优秀的程序员,十分优秀!