字符设备驱动——memory编译问题及解决办法

1.fatal error:asm/system.h:No such file or directory

1 #include <linux/version.h>
2 #if LINUX_VERSION_CODE > KERNEL_VERSION(3, 3, 0)
3     #include <asm/switch_to.h>
4 #else
5     #include <asm/system.h>
6 #endif

2.error:type defaults to ‘int‘ in declaration specifiers

static memory_major = MEMORY_MAJOR;

static int memory_major = MEMORY_MAJOR; 

3.error: unknown field ‘ioctl’ specified in initializer

 1 static const struct file_operations globalmem_fops =
 2 {
 3   .owner = THIS_MODULE,
 4   .llseek = globalmem_llseek,
 5   .read = globalmem_read,
 6   .write = globalmem_write,
 7   //.ioctl 改为 .compat_ioctl
 8   .compat_ioctl = globalmem_ioctl,
 9   .open = globalmem_open,
10   .release = globalmem_release,
11 };  

4.error: implicit declaration of function ‘kmalloc’

 error: implicit declaration of function ‘kfree’

1 #include <linux/slab.h>

5.error: function declaration isn‘t a prototype

int memory init()

1 int memory init(void)

6.insmod: error inserting ‘memory.ko‘: -1 Device or resource busy

cat /proc/devices

主设备号冲突

1 //#define MEMORY_MAJOR 254    /*预设的globalmem的主设备号*/
2 #define MEMORY_MAJOR 255    /*预设的globalmem的主设备号*/  

7.cat: /dev/memory: No such device or address

把globalmem_read函数中的if (p >= GLOBALMEM_SIZE)改为if (p >GLOBALMEM_SIZE)就好了。具体原因是一次调用cat会读两次,每次读取4096个字节,此时文件读指针ppos就是4096了,在第二次读的时候,到if (p >=GLOBALMEM_SIZE)这里条件为真,globalmem_read就返回ENXIO错误了,所以才会出现No such device orbaddress"错误。

返回错误值才是正确的,因为读的位置已经越界,所以要返回错误。该返回错误的时候返回正确,那就是错误。改成if (p >GLOBALMEM_SIZE)是错误的。

时间: 2024-08-02 08:58:57

字符设备驱动——memory编译问题及解决办法的相关文章

Android字符设备驱动开发基于高通msm8916【原创 】

本人才疏浅学,写一篇文档总结自己在msm8916平台上移植自己编写的简单的字符设备驱动开发的整个流程.这个小项目的主要功能是开发一个简单的APP,APP通过JNI去调用位于kernel的字符设备驱动. APP的设计,开发平台Android Studio 主要的文件是下面的三个文件: MainActivity.java文件的内容如下: 1 package com.example.administrator.myled; 2 3 import android.nfc.Tag; 4 import an

SylixOS字符设备驱动框架

1.概述 本文档主要介绍SylixOS中字符设备驱动框架,适用于在SylixOS集成开发环境下进行字符设备驱动开发的学习. 注:文中xxx是指具体设备名,编写对应驱动时,自行命名(如RTC.COMPASS等). 2.SylixOS字符设备驱动简介 字符设备是指只能以字节为单位进行读写的设备,读取数据需按照先后顺序,不能随机读取设备内存中某一数据.常见的字符设备如:鼠标.键盘.串口等. 在SylixOS中,每个字符设备都会在/dev目录下对应一个设备文件,用户程序可通过设备文件(或设备节点)来使用

(57)Linux驱动开发之三Linux字符设备驱动

1.一般情况下,对每一种设备驱动都会定义一个软件模块,这个工程模块包含.h和.c文件,前者定义该设备驱动的数据结构并声明外部函数,后者进行设备驱动的具体实现. 2.典型的无操作系统下的逻辑开发程序是:这种三层的裸机驱动模型是足够满足低耦合.高内聚的特点的. 3.当有操作系统存在时,设备驱动成为了连接硬件和内核的桥梁,这时候的设备驱动对外表现为操作系统的API,与直接裸机开发不同,裸机开发时的设备驱动是应用工程师的API.如果设备驱动都按照操作系统给出的独立于设备的接口而设计,应用程序将可以使用统

字符设备驱动(程序设计)—①

via:http://blog.sina.com.cn/s/blog_7ec8fc2c010157lc.html 1.驱动程序设计 1)驱动分类 驱动这里分为 字符设备驱动.网络接口驱动.块设备驱动!这三类,其中前两者是重点. ①.字符设备 字符设备是一种 按自己来访问 的设备,字符驱动则负责驱动字符设备,这样的驱动通常是先 open.close.read和write 系统调用! ②.块设备 在大部分 Unix 系统中,块设备不能按照字节处理数据,只能一次传送一个或则会多个长度是 512 字节(

字符设备驱动(六)按键poll机制

title: 字符设备驱动(六)按键poll机制 tags: linux date: 2018-11-23 18:57:40 toc: true --- 字符设备驱动(六)按键poll机制 引入 在字符设备驱动(五)按键休眠中的App中虽然使用了休眠,但是如果Read没有返回的话会一直死等,类似阻塞,我们期望等待一段时间后自动返回,等待的时候程序依然是睡眠的,这里引入poll机制 应用程序的open/close/write/read都有对应的系统内核的sys_open/sys_close/sys

字符设备驱动一

一. 字符设备驱动之概念介绍 1. 应用程序.库.内核.驱动程序的关系 如下图,一个软件系统可以分为:应用程序.库.操作系统(内核).驱动程序. 以点亮LED为例: 1)应用程序使用库提供的 open 函数打开代表LED的设备文件 2)库根据 open 函数传入的参数执行 "swi" 指令,这条指令会引起CPU异常,进入内核 3)内核的异常处理函数根据这些参数找到相应的驱动程序,返回一个文件句柄给库,进而返回给应用程序 4)应用程序得到文件句柄后,使用库提供的 write 或 iocl

13、字符设备驱动的使用

编译和安装驱动 下面是通过一个例子来学会使用驱动程序: 1---驱动程序: Memdev.c #include <linux/module.h> #include <linux/fs.h> #include <linux/init.h> #include <linux/cdev.h> #include <asm/uaccess.h> int dev1_registers[5]; int dev2_registers[5]; struct cdev

字符设备驱动框架

scull from <Linux设备驱动程序> memdev.c /* * memdev.c * create at 2015/01/07 * 字符设备驱动程序框架 */ #include <linux/module.h> #include <linux/types.h> #include <linux/fs.h> #include <linux/errno.h> #include <linux/mm.h> #include <

字符设备驱动

在Linux内核中使用cdev结构体来描述字符设备,通过其成员dev_t来定义设备号(分为主.次设备号)以确定字符设备的唯一性.通过其成员file_operations来定义字符设备驱动提供给VFS的接口函数,如常见的open().read().write()等. 在Linux字符设备驱动中,模块加载函数通过register_chrdev_region( ) 或alloc_chrdev_region( )来静态或者动态获取设备号,通过cdev_init( )建立cdev与file_operati