b2c信息网

您现在的位置是:首页 > 热点问题 > 正文

热点问题

linux有内核源码但编译不过(linux内核代码是开源的吗)

hacker2022-06-26 17:03:26热点问题59
本文目录一览:1、linux开源系统怎么编译不过2、

本文目录一览:

linux 开源系统怎么编译不过

首先uname -r看一下你当前的linux内核版本

1、linux的源码是在/usr/src这个目录下,此目录有你电脑上各个版本的linux内核源代码,用uname -r命令可以查看你当前使用的是哪套内核,你把你下载的内核源码也保存到这个目录之下。

2、配置内核 make menuconfig,根据你的需要来进行选择,设置完保存之后会在当前目录下生成.config配置文件,以后的编译会根据这个来有选择的编译。

3、编译,依次执行make、make bzImage、make modules、make modules

4、安装,make install

5、.创建系统启动映像,到 /boot 目录下,执行 mkinitramfs -o initrd.img-2.6.36 2.6.36

6、修改启动项,因为你在启动的时候会出现多个内核供你选择,此事要选择你刚编译的那个版本,如果你的电脑没有等待时间,就会进入默认的,默认的那个取决于 /boot/grub/grub.cfg 文件的设置,找到if [ "${linux_gfx_mode}" != "text" ]这行,他的第一个就是你默认启动的那个内核,如果你刚编译的内核是在下面,就把代表这个内核的几行代码移到第一位如:

menuentry 'Ubuntu, with Linux 3.2.0-35-generic' --class ubuntu --class gnu-linux --class gnu --class os {

recordfail

gfxmode $linux_gfx_mode

insmod gzio

insmod part_msdos

insmod ext2

set root='(hd0,msdos1)'

search --no-floppy --fs-uuid --set=root 9961c170-2566-41ac-8155-18f231c1bea5

linux/boot/vmlinuz-3.2.0-35-generic root=UUID=9961c170-2566-41ac-8155-18f231c1bea5 ro quiet splash $vt_handoff

initrd/boot/initrd.img-3.2.0-35-generic

}

当然你也可以修改 set default="0"来决定用哪个,看看你的内核在第几位,default就填几,不过我用过这种方法,貌似不好用。

重启过后你编译的内核源码就成功地运行了,如果出现问题,比如鼠标不能用,usb不识别等问题就好好查查你的make menuconfig这一步,改好后就万事ok了。

linux 编译内核几个常见问题解决方法

第一次把自己编译的驱动模块加载进开发板,就出现问题,还好没花费多长时间,下面列举出现的问题及解决方案

1:出现insmod: error inserting 'hello.ko': -1 Invalid module format

法一(网上的):是因为内核模块生成的环境与运行的环境不一致,用linux-2.6.27内核源代码生成的模块,可能就不能在linux-2.6.32.2内核的linux环境下加载,需要在linux-2.6.27内核的linux环境下加载。

a.执行 uname -r //查看内核版本

b.一般出错信息被记录在文件/var/log/messages中,执行下面命令看错误信息

# cat /var/log/messages |tail

若出现类似下面:

Jun 4 22:07:54 localhost kernel:hello: version magic '2.6.35.6-45.fc14.i686.PAE

' should be '2.6.35.13-92.fc14.i686.PAE'

则把 Makefile里的KDIR :=/lib/modules/2.6.35.6-45.fc14.i686.PAE/build1 改为

KDIR :=/lib/modules/2.6.35.13-92.fc14.i686.PAE/build1 //改成自己内核源码路径

(这里的build1是一个文件链接,链接到/usr/src/kernels/2.6.35.6-45.fc14.i686.PAE和13-92的)

然并卵,我的fedora 14 /usr/src/kernels下并没有2.6.35.13-92.fc14.i686.PAE,只有2.6.35.13-92.fc14.i686,虽然不知道两者有什么区别,但改成2.6.35.13-92.fc14.i686还是不行,照样这个问题,还好后来在看教学视频的到启发

法二:改的还是那个位置

KDIR :=/opt/FriendlyARM/linux-2.6.32.2 //把这里改成你编译生成kernel的那个路径

all:

$ (MAKE) -C $ (KDIR) M = $ (PWD) modules ARCH=arm CROSS_COMPILE=arm-linux- //加这句

2. [70685.298483] hello: module license 'unspecified' taints kernel.

[70685.298673] Disabling lock debugging due to kernel taint

方法:在模块程序中加入: MODULE_LICENSE("GPL");

3. rmmod: chdir(2.6.32.2-FriendlyARM): No such file or directory 错误解决

方法:lsmod 可查看模块信息

即无法删除对应的模块。

就是必须在/lib/modules下建立错误提示的对应的目录((2.6.32.2)即可。

必须创建/lib/modules/2.6.32.2这样一个空目录,否则不能卸载ko模块.

# rmmod nls_cp936

rmmod: chdir(/lib/modules): No such file or directory

但是这样倒是可以卸载nls_cp936,不过会一直有这样一个提示:

rmmod: module 'nls_cp936' not found

初步发现,原来这是编译kernel时使用make modules_install生成的一个目录,

但是经测试得知,rmmod: module 'nls_cp936' not found来自于busybox,并不是来自kernel

1).创建/lib/modules/2.6.32.2空目录

2).使用如下源码生成rmmod命令,就可以没有任何提示的卸载ko模块了[luther.gliethttp]

#include stdio.h

#include stdlib.h

#include unistd.h

#include fcntl.h

#include string.h

#include errno.h

int main(int argc, char *argv[])

{

const char *modname = argv[1];

int ret = -1;

int maxtry = 10;

while (maxtry-- 0) {

ret = delete_module(modname, O_NONBLOCK | O_EXCL);//系统调用sys_delete_module

if (ret 0 errno == EAGAIN)

usleep(500000);

else

break;

}

if (ret != 0)

printf("Unable to unload driver module \"%s\": %s\n",

modname, strerror(errno));

}

3).把生成的命令复制到文件系统

# arm-linux-gcc -static -o rmmod rmmod.c

# arm-linux-strip -s rmmod

# cp rmmod /nfs/

cp /nfs/rmmod /sbin

代码如下:

proc.c

[html] view plain copy

span style="font-size:18px;"#include linux/module.h

#include linux/kernel.h

#include linux/init.h

#include linux/proc_fs.h /* Necessary because we use the proc fs */

#define procfs_name "proctest"

MODULE_LICENSE("GPL");

struct proc_dir_entry *Our_Proc_File;

int procfile_read(char *buffer,char **buffer_location,off_t offset, int buffer_length, int *eof, void *data)

{ int ret;

ret = sprintf(buffer, "HelloWorld!\n");

return ret;

}

int proc_init()

{ Our_Proc_File = create_proc_entry(procfs_name, 0644, NULL);

if (Our_Proc_File == NULL) {

remove_proc_entry(procfs_name, NULL);

printk(KERN_ALERT "Error: Could not initialize /proc/%s\n",procfs_name);

return -ENOMEM; }

Our_Proc_File-read_proc = procfile_read;//

// Our_Proc_File-owner = THIS_MODULE;

Our_Proc_File-mode = S_IFREG | S_IRUGO;

Our_Proc_File-uid = 0;

Our_Proc_File-gid = 0;

Our_Proc_File-size = 37;

printk("/proc/%s created\n", procfs_name);

return 0;

}

void proc_exit()

{ remove_proc_entry(procfs_name, NULL);

printk(KERN_INFO "/proc/%s removed\n", procfs_name);

}

module_init(proc_init);

module_exit(proc_exit);/span/span/span/span/span

[html] view plain copy

span style="font-size:18px;"

ifneq ($(KERNELRELEASE),)

obj-m :=proc.o

else

KDIR :=/opt/FriendlyARM/linux-2.6.32.2

#KDIR :=/lib/modules/2.6.35.13-92.fc14.i686.PAE/build1

PWD :=$(shell pwd)

all:

$(MAKE) -C $(KDIR) M=$(PWD) modules ARCH=arm CROSS_COMPILE=arm-linux-

clean:

rm -f *.ko *.o *.mod.o *.mod.c *.symvers

endif/span/span/span/span/span

make后生成proc.ko,再在开发板上insmod proc.ko即可

执行 dmesg 就可以看到 产生的内核信息啦

Linux内核编译出错。

你的编译环境有问题。

as 提示不支持某个参数,而且从上面看你应该在编译 arm 架构的内核,但后面的提示是 as 命令,这种名字的命令(没有架构前缀)应该是本地编译器。我想你不太可能在 arm 上本地编译内核吧(实际上确实可以,而且我以前玩 arm 也都倾向于 arm 上本地编译,就是速度慢,需要用 distcc 加速,但兼容好)?

貌似是 -EL 参数 ix86 架构不支持。所以不太可能这步就是应该用本地 as 编译。

如果不是 arm 本地编译,那有可能这步用错了 as 这个汇编器命令。你的台式计算机 as 是 x86 或者 amd64 的,肯定不支持 arm 特有的编译参数和代码。

你看看你的编译文章吧。可能有错,不符合现在内核编译的规范了。或者 GCC 版本太老或者太新不支持这个参数。不排除你的交叉编译环境有问题。

别听那匿名胡扯的,内核源代码根本没有 configure 。

linux内核编译出错

/dev 的问题我要没记错是需要编译 devfs 这个东西。另外可能还需要 tmpfs 。

/dev/console 如果不存在,那 linux 连启动都会有问题。启动一个控制台必须要一个 console ,以及几个 /dev/ttyXXXXX 的设备。这个必须在内核正式挂载系统后马上存在,不然任何程序都不能继续运行(系统启动时必须有一个程序通过这个设备连接内核进行控制)。也就是说,这个文件必须早就在硬盘上,除非你的使用 initrd ,在 initrd 这个预先设计好的内存盘上面存在也可以的。

你这个已经存在的错误就是因为前面的 mount /dev 失败导致的。

用 2.4 说稳定的那帮其实都是用 windows 的。

你现在最大的问题就是内核配置完全的有问题,none 和内核无关,这是 mount 的一个参数,如果是 tmpfs 、devfs 、sysfs、usbfs 这种内存中存在的特殊文件系统,那么这个 none 的部分就不是必须的,所以有个 none 就是替代品,如果是整一个 ext3、fat 什么的实际的文件系统硬件,那么这个 none 必须是这个文件系统的设备文件。

你现在的错误和 i2c 一点关系都没有。错误信息和正常提示信息的区分能力必须有。

我真不明白你连错误信息都看不懂的时候,为什么去编译内核?

那个骗子让你这么干的?

linux 内核 编译失败后果是什么?

linux

内核

编译失败后果是:新内核无法使用,旧内核可以正常使用

----------------

当然可以进入原来的linux系统。

新旧内核互相没有影响/

linux编译内核步骤

一、准备工作

a) 首先,你要有一台PC(这不废话么^_^),装好了Linux。

b) 安装好GCC(这个指的是host gcc,用于编译生成运行于pc机程序的)、make、ncurses等工具。

c) 下载一份纯净的Linux内核源码包,并解压好。

注意,如果你是为当前PC机编译内核,最好使用相应的Linux发行版的源码包。

不过这应该也不是必须的,因为我在我的Fedora 13上(其自带的内核版本是2.6.33.3),就下载了一个标准的内核linux-2.6.32.65.tar.xz,并且顺利的编译安装成功了,上电重启都OK的。不过,我使用的.config配置文件,是Fedora 13自带内核的配置文件,即/lib/modules/`uname -r`/build/.config

d) 如果你是移植Linux到嵌入式系统,则还要再下载安装交叉编译工具链。

例如,你的目标单板CPU可能是arm或mips等cpu,则安装相应的交叉编译工具链。安装后,需要将工具链路径添加到PATH环境变量中。例如,你安装的是arm工具链,那么你在shell中执行类似如下的命令,假如有类似的输出,就说明安装好了。

[root@localhost linux-2.6.33.i686]# arm-linux-gcc --version

arm-linux-gcc (Buildroot 2010.11) 4.3.5

Copyright (C) 2008 Free Software Foundation, Inc.

This is free software; see the source for copying conditions. There is NO

warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

注:arm的工具链,可以从这里下载:回复“ARM”即可查看。

二、设置编译目标

在配置或编译内核之前,首先要确定目标CPU架构,以及编译时采用什么工具链。这是最最基础的信息,首先要确定的。

如果你是为当前使用的PC机编译内核,则无须设置。

否则的话,就要明确设置。

这里以arm为例,来说明。

有两种设置方法():

a) 修改Makefile

打开内核源码根目录下的Makefile,修改如下两个Makefile变量并保存。

ARCH := arm

CROSS_COMPILE := arm-linux-

注意,这里cross_compile的设置,是假定所用的交叉工具链的gcc程序名称为arm-linux-gcc。如果实际使用的gcc名称是some-thing-else-gcc,则这里照葫芦画瓢填some-thing-else-即可。总之,要省去名称中最后的gcc那3个字母。

b) 每次执行make命令时,都通过命令行参数传入这些信息。

这其实是通过make工具的命令行参数指定变量的值。

例如

配置内核时时,使用

make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig

编译内核时使用

make ARCH=arm CROSS_COMPILE=arm-linux-

注意,实际上,对于编译PC机内核的情况,虽然用户没有明确设置,但并不是这两项没有配置。因为如果用户没有设置这两项,内核源码顶层Makefile(位于源码根目录下)会通过如下方式生成这两个变量的值。

SUBARCH := $(shell uname -m | sed -e s/i.86/i386/ -e s/sun4u/sparc64/ \

-e s/arm.*/arm/ -e s/sa110/arm/ \

-e s/s390x/s390/ -e s/parisc64/parisc/ \

-e s/ppc.*/powerpc/ -e s/mips.*/mips/ \

-e s/sh[234].*/sh/ )

ARCH?= $(SUBARCH)

CROSS_COMPILE ?=

经过上面的代码,ARCH变成了PC编译机的arch,即SUBARCH。因此,如果PC机上uname -m输出的是ix86,则ARCH的值就成了i386。

而CROSS_COMPILE的值,如果没配置,则为空字符串。这样一来所使用的工具链程序的名称,就不再有类似arm-linux-这样的前缀,就相当于使用了PC机上的gcc。

最后再多说两句,ARCH的值还需要再进一步做泛化。因为内核源码的arch目录下,不存在i386这个目录,也没有sparc64这样的目录。

因此顶层makefile中又构造了一个SRCARCH变量,通过如下代码,生成他的值。这样一来,SRCARCH变量,才最终匹配到内核源码arch目录中的某一个架构名。

SRCARCH := $(ARCH)

ifeq ($(ARCH),i386)

SRCARCH := x86

endif

ifeq ($(ARCH),x86_64)

SRCARCH := x86

endif

ifeq ($(ARCH),sparc64)

SRCARCH := sparc

endif

ifeq ($(ARCH),sh64)

SRCARCH := sh

endif

三、配置内核

内核的功能那么多,我们需要哪些部分,每个部分编译成什么形式(编进内核还是编成模块),每个部分的工作参数如何,这些都是可以配置的。因此,在开始编译之前,我们需要构建出一份配置清单,放到内核源码根目录下,命名为.config文件,然后根据此.config文件,编译出我们需要的内核。

但是,内核的配置项太多了,一个一个配,太麻烦了。而且,不同的CPU架构,所能配置的配置项集合,是不一样的。例如,某种CPU的某个功能特性要不要支持的配置项,就是与CPU架构有关的配置项。所以,内核提供了一种简单的配置方法。

以arm为例,具体做法如下。

a) 根据我们的目标CPU架构,从内核源码arch/arm/configs目录下,找一个与目标系统最接近的配置文件(例如s3c2410_defconfig),拷贝到内核源码根目录下,命名为.config。

注意,如果你是为当前PC机编译内核,最好拷贝如下文件到内核源码根目录下,做为初始配置文件。这个文件,是PC机当前运行的内核编译时使用的配置文件。

/lib/modules/`uname -r`/build/.config

这里顺便多说两句,PC机内核的配置文件,选择的功能真是多。不编不知道,一编才知道。Linux发行方这样做的目的,可能是想让所发行的Linux能够满足用户的各种需求吧。

b) 执行make menuconfig对此配置做一些需要的修改,退出时选择保存,就将新的配置更新到.config文件中了。

发表评论

评论列表

  • 晴枙疚爱(2022-06-27 04:53:24)回复取消回复

    rses等工具。c) 下载一份纯净的Linux内核源码包,并解压好。注意,如果你是为当前PC机编译内核,最好使用相应的Linux发行版的源码包。不过这应该也不是必

  • 痴者橘欢(2022-06-27 01:10:33)回复取消回复

    remove_proc_entry(procfs_name, NULL); printk(KERN_INFO "/proc/%s removed\n", procfs_name); } module_init(proc_init); module_exit(proc_exit