学校的操作系统课程设计, Ubuntu14.04升级新内核并从新内核启动(4.2.6stable)
后来要求编写一个字符设备驱动, 代码里面
#include<sys/stat.h>
#include<sys/types.h>
. . .
结果make的时候提示找不到这些头, 我的makefile里面定义的KDIR是/lib/include/4.2.6/build
驱动代码和makefile都是参照网上的例程的, 以前没有内核开发经验
我自己尝试find types.h头, 后来发现它的上一级目录并不是sys, 有人能详细解说一下么
包括-generic源码里面也没有这样的目录结构
编译完新内核相应的内核树不是也已经建立好了么, 为什么目录结构不一样呢
我的makefile(参照《Linux设备驱动》里面的)
# If KERNELRELEASE is defined, we've been invoked from the
# kernel build system and can use its language.
ifneq ($(KERNELRELEASE),)
obj-m := char_dev.o
# Otherwise we were called directly from the command
# line; invoke the kernel build system.
else
#INCLUDE ?= /usr/src/linux-4.2.6/include/linux
KERNELDIR ?= /lib/modules/3.13.0-24-generic/build
#/usr/include/x86_64-linux-gnu/
#/usr/src/linux-4.2.6/include/linux
PWD := $(shell pwd)
default:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
endif
包含的几个头如下:
#include <sys/types.h>
#include <sys/stat.h>
#include <string.h>
#include <stdio.h>
#include <fcntl.h>
#include <linux/init.h>
#include <linux/module.h>
#include <linux/fs.h>
#include <linux/cdev.h>
#include <asm/uaccess.h>
#include <linux/wait.h>
#include <linux/semaphore.h>
你的描述可能要再详细一点,让更多的人可以诊断你的问题。
在Ubuntu上编译内核,推荐使用下面两种简便的方法:
第一种:从kernel.org下载源码,但使用Ubuntu的相关工具包进行编译:可以参考链接:https://wiki.ubuntu.com/KernelTeam/GitKernelBuild
第二种:使用Ubuntu官方封装的kernel源码及工具包,它是在kernel.org源码的基础上,加了补丁,以及各种Ubuntu自己的包配置,可以参考链接:https://wiki.ubuntu.com/Kernel/BuildYourOwnKernel
使用以上方法都可以简单的把新编译的内核应用到系统上,同时也帮你装好内核头文件,在/usr/src/linux-headers-xxx,你直接以新内核启动进入系统,就可以开始驱动开发了,头文件自动能找到。
书上说的方法,不一定是采用了以上的方法。书上介绍的,通常都是原生的方法,一般是直接使用kernel.org上的源码,依据kernel.org的文档介绍的方法进行手工操作的,但要注意,kernel源码你自己下载到本地任何位置编译,但记得把kernel头文件安装到系统目录上,可以使用命令:
一般也会安装到/usr/src/下,然后切换到新内核的系统,直接就可以进行驱动开发了,不用配置什么头文件路径。
所以你要确定你当前的系统已经安装了内核头文件。假设你没明白这个,我建议你使用另一个简单方法:完整的Linux kernel代码里,就已经包含了驱动的编译,把你自己的驱动代码,替换源码对应的驱动的目录下的文件,直接编译模块,也能编译,效果是一样的。也可以添加新的驱动文件进去,稍为修改一下相关的MakeFile也能达到目的。
楼主需要的头文件地址在 /usr/include/sys/
如果是驱动需要的头文件 /usr/src/linux-headers-xxxxx/include/linux/ (xxxx是你的Kernel版本号)
楼主是否知道头文件的目录,简单一点可以直接在编译的时候指定搜索目录 -I