当前位置:首页 » 编程软件 » 自编译内核源码合入caf

自编译内核源码合入caf

发布时间: 2022-08-27 07:12:09

⑴ 如何定制自己的linux内核

一 前言

为什么要编译自己的内核?这可能会有各种不同的答案,列举如下:
1 为了研究,学习内核源码
2 为了支持新的硬件或者打开某项内核功能。
3 升级内核到更新版本。
4 按自己的要求定制和优化内核功能。
如此种种...
折腾不需要理由,这里我就不在多说,下面直接进入主题。
编译方式
编译内核有多种方式,从kernel.org下载选择下载需要的版本的内核源码,
如:linux-2.6.32-rc1.tar.bz2,下载内核源码到/home/user/目录,进入下载目录,解压压缩包。

#cd /home/user/
#tar -xjvf linux-2.6.32-rc1.tar.bz2

二 准备编译环境

开始之前,首先确认下面软件包已经安装(编译中标普华4.0时,直接全部安装CD3可保证此条件)。
* rpmdevtools
* yum-utils
fedora系统可以使用如下命令安装:
#yum install yum-utils rpmdevtools

1. 生成一个rpmbuild命令工作所需的目录树,下面命令可以完成该操作,也可以手动建立目录树。
命令建立:
#rpmdev-setuptree

此命令将会在/usr/src/rpmbuild/目录下生成如下目录结构(如果此位置没有,则可能在当前用户目录下).

# tree /usr/src/rpmbuild/
rpmbuild/
|-- BUILD
|-- RPMS
|-- SOURCES
|-- SPECS
`-- SRPMS
上面部分是rpmbuild的环境建立。rpm
3. 安装内核源码包需要的依赖组件(在此可以跳过此步操作)

su -c 'yum-builddep kernel-<version>.src.rpm'
4.安装内核源码到系统,默认目录在/usr/src/neoshine:

rpm -Uvh kernel-<version>.src.rpm

三 配置内核(生成config配置文件)

下面将介绍如何解开源码包,并修改,配置和重新打包源码
1. 解开源码包并打上所有的补丁到BUILD目录

cd ~/rpmbuild/SPECS
rpmbuild -bp --target=`uname -m` kernel.spec

kernel源码将在这里找到:

/usr/src/neoshine/rpmbuild/BUILD/kernel-<version>/linux-<version>.<arch> directory

配置内核源码
1. 进入内核源码:

cd ~/rpmbuild/BUILD/kernel-2.6.$ver/linux-2.6.$ver.$arch/
2. 复制/boot/config*配置文件到源码目录下,此config文件也可以是已经配好或者其他地方备份的kernel配置文件:

cp /boot/config2.6- 2.6.$ver.$arch .config
3. 先检查kernel配置中新增的选项:

make oldconfig
4. 定制内核功能,关闭initrd支持选项,执行图形化内核配置工具:

make menuconfig
注:在generic setup选项下找到initial RAM system and RAM disk(initramfs and initrd) support 项,取消编译。同时确保跟文件系统对应的驱动和系统所在存储器对应的驱动都已经编译到内核(否则会无法启动系统).

5. 在.config文件第一行改为下面内容(注意:没有此行时,后面的编译会报错)

# i386
6. 拷贝.config到SOURCES/:

cp .config ../SOURCES/config-$arch

四 编译新内核

1. 下面开始准备编译新的内核包
打开SPEC/kernel.spec

vim SPEC/kernel.spec
改变下面行内容,可以定制自己的内核扩展名(如fc10之类):

%define buildid .<自己内核的小版本名>
下一步将生成一个新内核的rpm包,此过程需要编译内核源码包
使用下面命令生成新的内核源码包
rpmbuild -bb --with baseonly --without debuginfo --target=`uname -m` kernel.spec

参数说明:bb表示只编译二进制包,即不生成源码包,without debuginfo 表示没有调试信息,
target=`uname -r`表示生成对应当前平台的内核包
如果上面的命令成功执行完成,那么会在BUILD/i686目录下生成新的内核安装包

五 安装新内核

rpm -ivh kernel-$ver-$arch.rpm
此步操作会自动安装内核到boot目录下,安装对应内核模块到/lib/moles/目录下,并且生成新内核对应的grub引导菜单。
修改grub引导菜单为以下格式

title new kernel
kernel /boot/vmlinuz-$ver-$arch root=/dev/sdax(hdax)

注意,此处不要使用uuid指定跟文件系统(可能会无法挂载根分区而导致内核死机),也不要再加和显示相关的参数(内核不支持对应设置时,只会看到一个黑黑的屏幕)。
至此一个禁用initrd的新内核配置安装完毕!

⑵ 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/moles/`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 ing 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/moles/`uname -r`/build/.config
这里顺便多说两句,PC机内核的配置文件,选择的功能真是多。不编不知道,一编才知道。Linux发行方这样做的目的,可能是想让所发行的Linux能够满足用户的各种需求吧。

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

⑶ 怎样使用新编译的内核进行启动

step 1

准备:(1). 所需的内核源码

step2:

  • 切换到源码所在的目录,make distclean 命令:删除生产的.o 和 .config 文件

  • 编译内核之前需要一份配置文件,并在此基础上修改,故借用本地/boot/config-3.13.0-24-generic配置文件,命令: cp /boot/config-3.13.0-24-generic /home/yangqi/code/linux/linux-4.2.3/.config

  • 该配置文件.config 即是对内核裁剪的配置,不用直接打开修改,系统提供menu界面修改,命令:make menuconfig (如果此命令报错,说明需要装ncurses库,安装命令:sudo apt-get install libncurses5-dev) (menu目录如下:)

⑷ Linux没有内核代码可以单独编译驱动程序吗

可以的,我也是Linux C语言工程师,内核和应用都做。
你可以参考 LDD3里面的那个hello程序。
将hello驱动程序编译成模块,而且是独立于内核源码编译的。

⑸ 怎么样把linux内核源代码放到insight course 查看

你可以到参考资料的链接去看,里面有详细的操作步骤。下面是一部分摘录。
由 于Source Insight实质上是一个支持多种开发语言(java,c ,c++等等)的编辑器,只不过由于其查找、定位、彩色显示等功能的强大,而被我们当成源代码阅读工具使用。所以,为了有效的阅读源程序,首先必须选择功 能菜单上的 “Project”选项的子菜单“New Project”新建一个项目,项目名称可以自由选定。设定之后,将会弹出一个对话框如图2,接受默认选择,如果,硬盘空间足够,可以将第一个复选框选上,该选项将会 需要与源代码大致同等的空间来建立一个本地数据库以加快查找的速度。
点 击“OK”按钮,接受选择后,将会有一个新的对话框弹出,在这个对话框里,可以选择将要阅读的文件加入工程,一种方式是通过在File Name中输入要阅读源代码文件的名称,点击“Add”按钮将其加入,也可以通过其中“Add All”和“Add Tree”两个按钮可以将选中目录的所有文件加入到工程中,其中“Add All”选项会提示加入顶层文件和递归加入所有文件两种方式,而“Add Tree”相当于“Add All”选项的递归加入所有文件,可以根据需要使用,就我来说,更喜欢“Add Tree”一些。由于该程序采用了部分打开文件的方式,没有用到的文件不会打开,所以,加入数千个文件也不用担心加入的文件超出程序的所能容忍的最大值, 我就是采用“Add Tree”的方式将Linux2.4内核的四千五百九十一个文件加入的。
加入文件后,点击一个文件,可以出现使用界面,其中,右边的那个窗口(Linux Project,即工程窗口)缺省按照字母顺序列出当前工程中所有的文件。
点 击一个文件就可以打开该文件,进入到右边的那个窗口分别可以以文件列表的方式,列出所有的文件,每个窗体下边有一排按钮,左边的窗口 (21142.c)从左至右分别为:按字母顺序排列所有标记、按照文件中行数顺序排列标记、按照类型排列标记、浏览本地文件标记、标记窗口属性。右边的窗 口(Linux Project)从左至右分别为:按字母顺序文件列表、显示文件夹、按照文件类型归类文件、全部文件的所有标记列表、按照标记类型归类标记、跳转到定义 处、显示标记信息、浏览工程标记、查找函数调用、工程属性,其中全部文件的所有标记列表选项可能要一段时间抽取标记,同步到数据库去,如果开始选择了建立 标记数据库,将会在今后节省同步时间,最有用的莫过于浏览标记信息和查找函数调用,前者可以通过“Jump”按钮在不同的地方查找同样的标志,还可以通过 “Reference”按钮结合后者进行全局的标记查找。

⑹ 如何编译内核及制作RPM包

前言

要编译自内核能各种同答案列举:
1 研究习内核源码
2 支持新硬件或者打某项内核功能
3 升级内核更新版本
4 按自要求定制优化内核功能
种种...
折腾需要理由我说面直接进入主题
编译式
编译内核种式kernel.org载选择载需要版本内核源码
:linux-2.6.32-rc1.tar.bz2载内核源码/home/user/目录进入载目录解压压缩包

#cd /home/user/
#tar -xjvf linux-2.6.32-rc1.tar.bz2

二 准备编译环境

始前首先确认面软件包已经安装(编译标普华4.0直接全部安装CD3保证条件)
* rpmdevtools
* yum-utils
fedora系统使用命令安装:
#yum install yum-utils rpmdevtools

1. rpmbuild命令工作所需目录树面命令完该操作手建立目录树
命令建立:
#rpmdev-setuptree

命令/usr/src/rpmbuild/目录目录结构(位置没则能前用户目录).

# tree /usr/src/rpmbuild/
rpmbuild/
|-- BUILD
|-- RPMS
|-- SOURCES
|-- SPECS
`-- SRPMS
面部rpmbuild环境建立rpm
3. 安装内核源码包需要依赖组件(跳步操作)

su -c 'yum-builddep kernel-.src.rpm'
4.安装内核源码系统默认目录/usr/src/neoshine:

rpm -Uvh kernel-.src.rpm

三 配置内核(config配置文件)

面介绍何解源码包并修改配置重新打包源码
1. 解源码包并打所补丁BUILD目录

cd ~/rpmbuild/SPECS
rpmbuild -bp --target=`uname -m` kernel.spec

kernel源码找:

/usr/src/neoshine/rpmbuild/BUILD/kernel-/linux-. directory

配置内核源码
1. 进入内核源码:

cd ~/rpmbuild/BUILD/kernel-2.6.$ver/linux-2.6.$ver.$arch/
2. 复制/boot/config*配置文件源码目录,config文件已经配或者其备份kernel配置文件:

cp /boot/config2.6- 2.6.$ver.$arch .config
3. 先检查kernel配置新增选项:

make oldconfig
4. 定制内核功能关闭initrd支持选项执行图形化内核配置工具:

make menuconfig
注:generic setup选项找initial RAM system and RAM disk(initramfs and initrd) support 项取消编译同确保跟文件系统应驱系统所存储器应驱都已经编译内核(否则启系统).

5. .config文件第行改面内容(注意:没行面编译报错)

# i386
6. 拷贝.configSOURCES/:

cp .config ../SOURCES/config-$arch

四 编译新内核

1. 面始准备编译新内核包
打SPEC/kernel.spec

vim SPEC/kernel.spec
改变面行内容定制自内核扩展名(fc10类):

%define buildid .
步新内核rpm包程需要编译内核源码包
使用面命令新内核源码包
rpmbuild -bb --with baseonly --without debuginfo --target=`uname -m` kernel.spec

参数说明:bb表示编译二进制包即源码包without debuginfo 表示没调试信息
target=`uname -r`表示应前平台内核包
面命令功执行完BUILD/i686目录新内核安装包

五 安装新内核

rpm -ivh kernel-$ver-$arch.rpm
步操作自安装内核boot目录安装应内核模块/lib/moles/目录并且新内核应grub引导菜单
修改grub引导菜单格式

title new kernel
kernel /boot/vmlinuz-$ver-$arch root=/dev/sdax(hdax)

注意处要使用uuid指定跟文件系统(能挂载根区导致内核死机)要再加显示相关参数(内核支持应设置看黑黑屏幕)
至禁用initrd新内核配置安装完毕

⑺ 什么是内核源码 求普及

很多cpu有两种运行方式,一种叫裸奔,直接运行程序,比如最早的手机运行

还有一种要加载操作系统,比如Linux、Windows这种,然后再在操作系统上运行程序,让操作系统完成运行程序的维护、调度等工作。加载操作系统时,需要将操作系统必须加载部分读入内存运行,这部分就叫做内核,是操作系统的内部核心,有这部分引导入内存后,才能继续加载操作系统其余部分和运行程序。

以上说明的内核的源代码,即内核源码,通过源码可以用编译器生成经过你裁剪、修改过的操作系统内核,从而形成对操作系统的定制。

⑻ 如何编译Linux操作系统的源代码

首先uname
-r看一下你当前的linux内核版本
1、linux的源码是在/usr/src这个目录下,此目录有你电脑上各个版本的linux内核源代码,用uname
-r命令可以查看你当前使用的是哪套内核,你把你下载的内核源码也保存到这个目录之下。
2、配置内核
make
menuconfig,根据你的需要来进行选择,设置完保存之后会在当前目录下生成.config配置文件,以后的编译会根据这个来有选择的编译。
3、编译,依次执行make、make
bzImage、make
moles、make
moles
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了。
最后再用uname
-r看看你的linux内核版本。是不是你刚下的那个呢!有没有成就感?

⑼ 交叉编译后的内核怎么导入beagleboneblack

椤?build 能够编译内核树目录内的内核模块,也能够编译内核树目录外的内核模块(外部内核模块)。. 编译外部内核模块的命令: #cd #make -C M=`pwd` 其中 为要编译的内核模块所在目录, 为内核源码所在的目录。 对于发行版本的Linux ,可以用: #make -C /lib/moles/`uname -r`/build M=`pwd` 注意:使用Kbuild 之前,必须先成功编译过内核源码。 说明: .#make -C M=`pwd` moles 作用与上面的命令一样 .以前的内核版本可以使用 #make -C SUBDIRS=`pwd` moles. 安装外部内核模块 #make -C M=`pwd` moles_install 默认安装目录为:/lib/moles/`uname -r`/extra ,可以通过INSTALL_MOD_PATH 宏在默认安装路径前加前缀。 例如: #make -C INSTALL_MOD_PATH=/opt M=`pwd` moles_install 则编译后的模块会放在/opt/lib/moles/`uname -r`/extra 通过宏INSTALL_MOD_DIR 可以修改是否放在'extra' 下,例如: #make -C INSTALL_MOD_DIR=golf M=`pwd` moles_install 则编译后的模块会放在/lib/moles/`uname -r`/golf . 编译单个文件 #make -C M=`pwd` . 其他命令 #make -C M=`pwd` clean #make -C M=`pwd` help.Kbuild 文件 Linux的Kbuild 会在内核模块目录下查找Kbuild 文件,如果有,则在编译时会使用该文件。示例: 假设有这么几个文件:8123_if.c 8123_if.h 8123_pci.c 8123_bin.o_shipped( 二进制的模块文件) Kbuild 文件的内容: obj-m := 8123.o 8123-y:8123_if.o 8123_pci.o 8123_bin.o Makefile的内容: #为了兼容旧版本的Kbuild ifneq($(KERNELRELEASE),) include Kbuildelse# 正常的Makefile KDIR:=/lib/moles/`uname -r`/buildall::$(MAKE) -C $(KDIR) M=`pwd` $@ # 其他targetgenbin:echo "X" > 8123_bin_shippedendif 注意,没有源码的二进制.o 文件必须以原文件名加_shipped 结尾,例如8123_bin.o_shipped,KBuild 会把8123_bin.o_shipped 复制为8123_bin.o ,然后一起编译。应该用: ifeq ($(obj),) obj= .

热点内容
androidondraw调用 发布:2025-02-07 12:09:22 浏览:187
linuxkill进程 发布:2025-02-07 12:09:17 浏览:196
c语言sqrt函数怎么用 发布:2025-02-07 12:07:48 浏览:894
安卓手机怎么不用手机id登录 发布:2025-02-07 12:06:28 浏览:38
ceph缓存变慢 发布:2025-02-07 11:46:52 浏览:923
python做什么用的 发布:2025-02-07 11:46:46 浏览:563
o2o与数据库设计 发布:2025-02-07 11:35:27 浏览:929
ftp服务器推荐 发布:2025-02-07 11:35:16 浏览:700
吉利星瑞豪华加6000是有哪些配置 发布:2025-02-07 11:25:18 浏览:971
李字加工编程 发布:2025-02-07 11:23:50 浏览:881