2 nikobelic8 nikobelic8 于 2016.03.22 20:07 提问

linux2.6内核编译报错

做操作系统内核编译模块实验遇到的问题。
Makefile

 ifneq ($(KERNELRELEASE),)
# We were called by kbuild

obj-m += clock.o

else  # We were called from command line

KDIR := /lib/modules/$(shell uname -r)/build
#KDIR := /home/cynove/src/kernel/linux-source-2.6.31
PWD  := $(shell pwd)

default:
    @echo '    Building target module 2.6 kernel.'
    @echo '    PLEASE IGNORE THE "Overriding SUBDIRS" WARNING'
    $(MAKE) -C $(KDIR) SUBDIRS=$(PWD) modules

install:
    ./do_install.sh *.ko

endif  # End kbuild check
######################### Version independent targets ##########################

clean:
    rm -f -r *.o *.ko .*cmd .tmp* core *.i

clock.c文件

 #include <linux/module.h>
#include <linux/types.h>
#include <linux/proc_fs.h>
#include <linux/time.h>

#define BUF_LEN 100

static int read_clock(  char *buf_not_used,
char **my_buf_ptr,
off_t offset,
int buf_len,
int  *eof_flag,
void *data_not_used )
{
    struct timeval ktv;
    static char my_buf[BUF_LEN];    
    if(offset > 0) return 0;
    buf_len = BUF_LEN;
    *my_buf_ptr = my_buf;
    cli();
    ktv = xtime;    
    sti();

    sprintf(my_buf, "%ld %ld\n", ktv.tv_sec, ktv.tv_usec);
    for(buf_len=0; buf_len < BUF_LEN; buf_len++)
        if(my_buf[buf_len] == '\0') break;
            eof_flag = 0;
    return buf_len;
}
/*开始下面的结构定义不对*/
struct proc_dir_entry clock_proc_file = {
namelen:    5,
name:   "clock",
mode:   S_IFREG | S_IRUGO,
size:   100,
owner:  THIS_MODULE,
read_proc:  read_clock,
};

int init_clock(void)
{
    //return proc_register(&proc_root, &clock_proc_file);
    create_proc_read_entry("clock",0,NULL,read_clock,NULL);
    return 0;
}

void exit_clock(void)
{
    //proc_unregister(&proc_root, clock_proc_file.low_ino);
    remove_proc_entry("clock",&proc_root);
}
module_init(init_clock)
module_exit(exit_clock)
MODULE_LICENSE("GPL");  /*主要是为了去掉加载的时候的一个警告*/

编译时报错
[root@hadoop01 ~]# make
Building target module 2.6 kernel.
PLEASE IGNORE THE "Overriding SUBDIRS" WARNING
make -C /lib/modules/2.6.32-358.el6.x86_64/build SUBDIRS=/root modules
make[1]: Entering directory /usr/src/kernels/2.6.32-358.el6.x86_64'
CC [M] /root/clock.o
/root/clock.c: In function ‘read_clock’:
/root/clock.c:20: error: implicit declaration of function ‘cli’
/root/clock.c:21: error: ‘xtime’ undeclared (first use in this function)
/root/clock.c:21: error: (Each undeclared identifier is reported only once
/root/clock.c:21: error: for each function it appears in.)
/root/clock.c:22: error: implicit declaration of function ‘sti’
/root/clock.c: At top level:
/root/clock.c:36: error: unknown field ‘owner’ specified in initializer
/root/clock.c:36: warning: initialization from incompatible pointer type
/root/clock.c: In function ‘exit_clock’:
/root/clock.c:50: error: ‘proc_root’ undeclared (first use in this function)
make[2]: *** [/root/clock.o] Error 1
make[1]: *** [_module_/root] Error 2
make[1]: Leaving directory
/usr/src/kernels/2.6.32-358.el6.x86_64'
make: *** [default] Error 2

原因可能是因为我的linux内核版本是2.6的,我看论坛上其他人的2.4内核可以正常编译。请问我要如何修改程序来适配2.6的内核?

3个回答

nikobelic8
nikobelic8   2016.03.23 11:19
已采纳

我在StackOverFlow上找到了答案,重新修改了一下Makefile。多谢各位。

oyljerry
oyljerry   Ds   Rxr 2016.03.23 07:47

主要是头文件等要配置正确。定义找不到

nikobelic8
nikobelic8   2016.03.23 11:19

我在StackOverFlow上找到了答案,重新修改了一下Makefile。多谢各位。

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
Linux 2.6内核新变化
<br />Linux 2.6内核新变化2010/06/17 01:18 A.M.<br />http://www.lupaworld.com/action_viewstutorial_itemid_3196.html<br />Linux 内核的开发已经经历了一个漫长的过程,最初是 Linus Torvalds于1991年发布的原始的0.1版本,这个版本中包括一个基本的调度器、IPC(进程间通信)和内存管理算法。而现在它已经是一个以往操作系统的实用的替代品,在市场上表现出了强大的竞争力。越来越多的政府机构
基于ubuntu14.04下编译linux-2.6.34版本内核的步骤和遇到的一些问题及解决
1、先在终端查询自己的gcc版本和ubuntu版本,然后到官网www.kernel.org下载所需的内核版本; 2、将下载的内核解压到/usr/src目录下,不是一定但建议解压到里面,使用tar -xvf +压缩包名或者tar -xzvf +压缩名都行,可能有些只支持其中一种,压缩包名比如linux-2.6.34.tar.gz(看你下载的内核压缩包名字即可); 3、进入解压后的
Linux 2.6内核配置说明
Linux 2.6内核配置说明 (国嵌)                Code maturity level options                  代码成熟度选项 Prompt for development and/or incomplete code/drivers 显示尚在开发中或尚未完成的代码与驱动.除非你是测试人员或者开发者,否则请勿选择
linux-2.6.29 添加驱动模块到内核
linux设备驱动归纳总结(一):内核的相关基础概念 http://blog.chinaunix.net/uid-25014876-id-59413.html linux设备驱动归纳总结(一):内核的相关基础概念 xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
linux2.6.1内核源码注释
包含LINUX内核同步、信号、内存、调度、文件系统、网络系统、时钟等部分的源码注释。前后历时三年,算是干货。
Linux 2.6、4.3内核编译过程的感受与总结
之前编译过2.4.10的内核,很好编译,中间曾经漏下了SCSI low-level drivers下的BusLogic SCSI support选项导致没法启动系统,后来打开该选项后就行了,随手关闭一些没用的选项后编译速度非常快,30秒之内完成编译。当初以为内核编译也不过如此,直到这四天开始编译更新的内核才让我吃了大亏。 我起初的想法是编译一个极其简洁的内核,去掉网络、USB、光驱、等等所有
ubuntu05.04 linux2.6.10 内核安装
linux内核编程4部曲之一:linux内核编译(2.6.12版本)图文解说 2012-05-17 00:38:37 分类: LINUX   linux内核编程4部曲之一:linux内核编译(2.6.12版本)图文解说 linux内核编程4部曲之二:增加linux内核系统调用 linux内核编程4部曲之三:修改O(1)调度算法 linux内核编程4部曲之四:模块编程
编译和安装linux内核2.6.24,并且写一个简单的内核驱动测试之
好久没有编译过内核了,最近要弄驱动,查看了一下在/usr/src下面有两个文件夹,里面都是空的,没有任何内核源代码。我用的是CentOS 5.1,其实红帽系列在redora出现之后就一直没有附带linux内核源代码了,所以这些个头文件什么的在你安装好系统那刻起是都不会有的了。当然了,不管是什么发行版本的linux系统,下面方法都应该适用。自己从新安装一个就是,现下载:www.kernel.org下
Linux内核(2.6)进程调度算法
1.1      进程状态 在Sched.h(include\linux)中定义了进程的状态。 /*  *Task state bitmask. NOTE! These bits are also  *encoded in fs/proc/array.c: get_task_state().  *  * Wehave two separate sets of flags: task
Linux 2.6内核在S3C2440平台上移植
此教程适合2.6.38之前的版本,其中2.6.35之前使用同一yaffs补丁包,2.6.36--2.6.28 yaffs文件系统有所改变,2.6.39之后的暂时不支持,源码下载请到:http://www.kernel.org/ 1.解压linux-2.6.34.tar.bz