linux内核树的构建

来源:互联网 发布:淘宝客分佣app制作 编辑:程序博客网 时间:2024/05/20 18:20

这一段时间开始学习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

>
其他问题可参考以上方法解决