这一段时间开始学习liunx设备驱动程序,一开始接触到了些新的术语概念,这里总结一下近几天学习到的内容。
- 使用 linux-source-3.16
- 参考书目:《linux设备驱动程序》第三版,linux kernel 2.6.x
下载内核源码
uname -r 查看当前使用系统的内核版本号
ls /usr/src 查看当前系统中是否已有源码(一般发行版都没有)
apt-cache search linux-source 查看可下载的源码包
sudo apt-get install linux-source-3.16 下载源码编译
tar jxvf linux-source-2.6.20.tar.bz2 首先解压,注意使用sudo,以下均使用root权限
make oldconfig 配置内核
make 开始编译
make bzImage 完成后在当前目录下生成 vmlinux
make modules 编译模块
make modules_install 安装模块
/* 执行结束之后,会在/lib/modules下生成新的目录/lib/modules/2.6.22-14-generic/ */
编译完成,reboot即可
- 开始写 hello,world
源码和makefile请参考书目,这里主要记录编译时遇到的问题,大部分都是因为我使用的内核版本较高导致的,使用 2.6.x 内核的童鞋请飘过~~
>
scripts/Makefile.build:49: * CFLAGS was changed in “/home/jqzeng/workSpace/ldd3/ldd3-samples-1.0.0/scull/Makefile”. Fix it to use ccflags-y. Stop.
修改makefile中CFLAGS为EXTRA_CFLAGS
>
scull/main.c:17:26: fatal error: linux/config.h: No such file or directory
在源文件中把该头文件注释掉
>
scull/main.c:556:2: error: unknown field ‘ioctl’ specified in initializer
新的kerne不再支持ioctl方法,使用 unlocked_ioctl或者compat_ioctl.修改main.c中ioctl为unlocked_ioctl
同时,这个函数指针的原型改变为
long (unlocked_ioctl) (struct file , unsigned int, unsigned long);
修改main.c 和 scull.h 中相关定义的原型
>
scull/main.c:652:3: error: implicit declaration of function ‘init_MUTEX
新内核使用 sema_init(&sem,1) 替换 init_MUTEX(&sem)
>
pipe.c编译的时候出现了一大堆问题
大部分错误都是类型未定义,把sched.h加到pipe.c中
access.c 也是同样
>
scull/access.c:99:34: error: ‘SPIN_LOCK_UNLOCKED’ undeclared here (not in a function)
添加头文件 linux/spinlock_types.h
修改定义
static spinlock_t scull_u_lock = SPIN_LOCK_UNLOCKED;
为
static DEFINE_SPINLOCK(scull_u_lock);
>
scull/access.c:107:29: error: ‘struct task_struct’ has no member named ‘uid’
新的struct task_struct 定义有变化,uid和euid在cred结构体中。
解决办法:加头文件cred.h,
将 current->uid改为current->cred->uid
current->euid改为current->cred->euid
>
其他问题可参考以上方法解决