linux设备驱动程序学习笔记一:在ubuntu 14.04.3 LTS下调试ldd的scull代码

  • 操作系统版本

[email protected]:~/vm_disk_dpdk/study/drive/examples/scull# sudo lsb_release -a

No LSB modules are available.

  • Distributor ID: Ubuntu

Description:    Ubuntu 14.04.3 LTS
Release:        14.04
Codename:       trusty
[email protected]:~/vm_disk_dpdk/study/drive/examples/scull# uname -a
Linux ubuntu 3.13.0-66-generic #108-Ubuntu SMP Wed Oct 7 15:20:27 UTC 2015 x86_64 x86_64 x86_64 GNU/Linux

  • 问题一:scripts/Makefile.build:49: *** CFLAGS was changed in "/home/enjoy/vm_disk_dpdk/study/drive/examples/scull/Makefile". Fix it to use ccflags-y.  Stop.

change
 CFLAGS += $(PSTN_DEF) -Wall -O $(INCLUDES) -fno-common -DTARGET_CATAWBA
to
 EXTRA_CFLAGS += $(PSTN_DEF) -Wall -O $(INCLUDES) -fno-common -DTARGET_CATAWBA
and try

you could use something like this:
sed -i ‘s/^CFLAGS/EXTRA_CFLAGS/‘ Makefile

  • 问题二:/home/enjoy/vm_disk_dpdk/study/drive/examples/scull/main.c:17:26: fatal error: linux/config.h: No such file or directory

现在不用config.h,而是autoconf.h

[email protected]:/usr/src/linux-headers-3.13.0-66-generic/include/linux# ln -s ../generated/autoconf.h config.h
[email protected]:/usr/src/linux-headers-3.13.0-66-generic/include/linux# ll config.h
lrwxrwxrwx 1 root root 23 Dec 10 01:01 config.h -> ../generated/autoconf.h

  • 问题三:/home/enjoy/vm_disk_dpdk/study/drive/examples/scull/main.c:32:46: fatal error: asm/system.h: No such file or directory

直接注释,有问题后面接着加别的头文件

This file was removed in Linux 3.4, commit f05e798ad4c0; its contents have been moved into various other headers.

It‘s possible that just removing the #include <asm/system.h> might work, but it‘s much more likely that your driver is simply incompatible with current Linux versions.

  • 问题四:/home/enjoy/vm_disk_dpdk/study/drive/examples/scull/main.c:556:2: error: unknown field ‘ioctl’ specified in initializer

这个错误网上搜索发现2.6.38版本内核 file_operation结构体已经删除了ioctl函数,取代的是:
long (*unlocked_ioctl) (struct file *, unsigned int, unsigned long);
long (*compat_ioctl) (struct file *, unsigned int, unsigned long);
file_operation结构体在 include/linux/fs.h定义
解决方案:
替换为unlocked_ioctl 即可,注意函数原型,第一个参数不需要(代码中没用到),还有返回值为long类型。

  • 问题五:/home/enjoy/vm_disk_dpdk/study/drive/examples/scull/main.c:652:3: error: implicit declaration of function ‘init_MUTEX’ [-Werror=implicit-function-declaration]

2.6.25及以后的linux内核版本废除了init_MUTEX函数,新版本使用sema_init函数

static inline void init_MUTEX (struct semaphore *sem)
{
    sema_init(sem, 1);
}  
  • 问题六:include/linux/wait.h:307:31: error: ‘TASK_INTERRUPTIBLE’ undeclared (first use in this function)

增加头文件:#include <linux/sched.h>

  • 问题七:/usr/src/linux-source-3.2.0/drivers/scull/access.c:98:34: error: ‘SPIN_LOCK_UNLOCKED’未声明(不在函数内)

将:static spinlock_t scull_u_lock = SPIN_LOCK_UNLOCKED;
改为:static DEFINE_SPINLOCK(scull_u_lock);

  • 问题八:

/usr/src/linux-source-3.2.0/drivers/scull/access.c:107:29: 错误: 提领指向不完全类型的指针
解决办法是在access.c中就加入两个头文件 #include<linux/sched.h>

  • 问题九:‘struct task_struct’ has no member named ‘uid’、‘euid’

/home/enjoy/vm_disk_dpdk/study/drive/examples/scull/access.c:107:29: error: ‘struct task_struct’ has no member named ‘uid’
/home/enjoy/vm_disk_dpdk/study/drive/examples/scull/access.c:108:29: error: ‘struct task_struct’ has no member named ‘euid’

current->uid 修改为 current->cred->uid.val
current->euid 修改为 current->cred->euid.val

编译OK:

[email protected]:~/vm_disk_dpdk/study/drive/examples/scull# ls
access.c  main.c  Makefile       Module.symvers  pipe.o   scull.init  scull_load   scull.mod.o  scull_unload
access.o  main.o  modules.order  pipe.c          scull.h  scull.ko    scull.mod.c  scull.o

时间: 2024-10-09 23:07:14

linux设备驱动程序学习笔记一:在ubuntu 14.04.3 LTS下调试ldd的scull代码的相关文章

Linux设备驱动程序学习笔记(一)

1.设备驱动程序扮演的角色:       设备程序是一个独立的“黑盒子”,使其某个特定硬件响应一个定义良好的内部编程接口,这些接口完全隐藏了设备的工作细节.用户的操作通过一组标准化的调用执行,而这些调用独立于特定的驱动程序.将这些调用映射到作用于实际硬件的设备特有操作上,则是设备驱动程序的任务.2.驱动程序的作用:        驱动程序应该处理如何使用硬件可用的问题,而将怎样使用硬件的问题留给上层应用.(提供机制,而不是策略)3.内核功能划分:        进程管理    内存管理    文

【DDD/CQRS/微服务架构案例】在Ubuntu 14.04.4 LTS中运行WeText项目的服务端

在<WeText项目:一个基于.NET实现的DDD.CQRS与微服务架构的演示案例>文章中,我介绍了自己用Visual Studio 2015(C# 6.0 with .NET Framework 4.6.1)开发的DDD/CQRS/微服务架构的案例项目:WeText.文章发出后反响很好,也很感谢大家的关注.在本文中我将介绍如何在Ubuntu 14.04.4 LTS中运行WeText项目的服务端. 为跨平台而生 从一开始的设计,我就把WeText的服务端跨平台纳入了实践目标,因此,所选择的框架

Ubuntu 12.04 Server LTS下安装桌面及vncserver

亲测通过 1. 安装相关的包: apt-getupdate apt-get install ubuntu-desktop apt-getinstall vnc4server apt-get install x-window-system-core apt-get install gdm apt-get install gnome-panel 2. 设置vncserver Vncpasswd 以root身份chmod +x/etc/X11/xinit/xinitrc Vi /root/.vnc/x

Ubuntu 14.04.4 LTS设置DNS

Ubuntu 14.04.4 LTS中DNS信息是由/etc/resolv.conf提供的,它是每次开机时,由/sbin/resolvconf生成的 /etc/resolv.conf是/run/resolvconf/resolv.conf的符号链接 #ls -al /etc/resolv.conf #lrwxrwxrwx 1 root root 29 Mar  4 18:57 /etc/resolv.conf -> ../run/resolvconf/resolv.conf 在文件/etc/re

在Ubuntu 14.04.5 LTS上搭建WordPress环境

晚饭后闲着无聊,看着自己虚拟机里很久前安装的 Ubuntu 14.04.5 LTS ,突然想在上面搭建个网站,选来选去,决定使用WordPress环境,下面就来一步步搭建它. 1.下载WordPress程序包 wget https://cn.wordpress.org/wordpress-4.8.1-zh_CN.tar.gz 下载界面 2.安装Apache2.0 apt-get install apache2 由于我当前用户是root,如果是非root用户要在上面的命令中加上sudo 没有报错,

ubuntu 14.04.3 LTS 版本 通过 nginx + keepalived 配置 高可用 负载均衡集群演示

系统版本:ubuntu 14.04.3 LTS 服务器准备: lb01-> ifconfig 显示结果: 192.168.91.136 作用:安装keepalived 及 nginx lb02-> ifconfig 显示结果: 192.168.91.135 作用:安装keepalived 及 nginx web01-> ifconfig 显示结果: 192.168.91.134 作用:安装nginx 负责展示 index.html页面 web02-> ifconfig 显示结果:

Ubuntu 14.04.3 LTS 配置 DNS Server

我们目的是用一台局域网机器完成 192.168.1.113 <-->cloudshield.com的解析,指定A记录和CNAME; 0.关于Ubuntu 14.04.2 LTS 下载.安装.更新这里就直接跳过了; 1.下载安装工具 bind9 sudo apt-get install bind9 DNS 配置文件在/etc/bind 目录中.安装bind9后会生成如下三个配置文件: named.conf: named.conf.options: named.conf.local: 其中 nam

Linux设备驱动程序学习随笔1--从头文件 linux/moudle.h开始

所有的程序员入门的第一个程序都是从 Holle World 开始,linux嵌入式驱动开发也不例外,<Linux设备驱动程序>这本书的第一个程序就是hello world.然而,人生写驱动程序的第一次编译就异常的艰难. 以下是hello world 的程序,很简单,基本上学过C就能看懂,该程序包括两个头文件,引用了4个外部函数,内建2个函数. 1 #include <linux/init.h> 2 #include <linux/module.h> 3 4 MODULE

Linux设备驱动程序学习 高级字符驱动程序操作[阻塞型I/O和非阻塞I/O]【转】

转自:http://blog.csdn.net/jacobywu/article/details/7475432 阻塞型I/O和非阻塞I/O 阻塞:休眠 非阻塞:异步通知 一 休眠 安全地进入休眠的两条规则: (1) 永远不要在原子上下文中进入休眠,即当驱动在持有一个自旋锁.seqlock或者 RCU锁时不能睡眠:关闭中断也不能睡眠.持有一个信号量时休眠是合法的,但你应当仔细查看代码:如果代码在持有一个信号量时睡眠,任何其他的等待这个信号量的线程也会休眠.因此发生在持有信号量时的休眠必须短暂,而