Suse环境下编译linux-2.6.24内核
Suse环境下编译linux-2.6.24内核
1.下载linux-2.6.24内核源码:
https://mirrors.edge.kernel.org/pub/linux/kernel/v2.6/linux-2.6.24.tar.gz
2.解压linux-2.6.24.tar.gz文件,会生成linux-2.6.24目录
tar –xzf linux-2.6.24.tar.gz
3.编译环境构建
一般linux系统都自带gcc和make等编译工具,这里我的编译环境为SUSE Linux、gcc version 4.8.5、GNU Make 4.0
4.配置内核
linux提供了多种内核配置工具, 最基础的是 make config工具, 它列出每个编译选项, 而且是基于文本的
目前一般都推荐使用主流的make menuconfig工具, 但它需要curse库的支持, 在suse中默认是没有的, 所以在这里我使用的是make config工具
执行make config命令,自动生成.config配置文件
可能遇到以下错误:
Makefile:434: *** mixed implicit and normal rules. Stop.
解决方法:
修改根目录下Makefile文件的第434行
-config %config : scripts_basic outputmakefile FORCE
+config : scripts_basic outputmakefile FORCE
可能也会遇到错误:
Makefile:1503: *** mixed implicit and normal rules. Stop.
解决方法同上
解决完以上错误后再次执行make config,会逐条列出每个编译选项,每个编译选项会有类似[M/n/y?]、[N/y/?]、[Y/n/?]的用户选项,位于首位的为内核推荐的配置,一直回车即可
配置完成后会显示 # configuration written to .config 字样,在根目录下可以看到 .config文件,可以手动打开查看并编辑
5.编译内核源代码
依次执行
make vmlinux -j8(编译核心,-j指定使用多少线程进行gcc编译)
make bzImage (制作bzImage,这个是给initramfs用的)
make modules -j8 (编译模块)
make modules_install (模块安装)
make install(内核安装,修改grub等)
编译过程中的warning不用关注,关注error即可
遇到错误可以去stackoverflow上搜索,一般都能解决:
ü gcc: error: elf_x86_64: No such file or directory
gcc: error: unrecognized command line option ‘-m’
解决方法:
修改arch/x86/vdso/Makefile文件中第20行
- cmd_syscall = $(CC) -m elf_x86_64 -nostdlib $(SYSCFLAGS_$(@F)) \
+ cmd_syscall = $(CC) –m64 -nostdlib $(SYSCFLAGS_$(@F)) \
ü Error: .size expression for copy_user_generic_c does not evaluate to a constant scripts/Makefile.build:243: recipe for target 'arch/x86/lib/copy_user_64.o' failed
解决方法:
修改arch/x86/lib/copy_user_64.S文件第347行
-END(copy_user_generic_c)
+END(copy_user_generic_string)
ü undefined reference to `__mutex_lock_slowpath'
解决方法:
修改kernel/mutex.c文件中的第61行:
-static void fastcall noinline __sched
+static __used void fastcall noinline __sched
修改kernel/mutex.c文件中的第98行:
-static void fastcall noinline __sched
+static __used void fastcall noinline __sched
修改kernel/mutex.c文件中的第297行:
-static void fastcall noinline __sched
+static __used void fastcall noinline __sched
ü error: conflicting types for ‘getline’
解决方法:
修改scripts/unifdef.c文件,将其中所有的getline替换成get_line,共计三处,分别位于209、515、529行
编译完成后可以在linux-2.6.24根目录下看到以下文件和其他的临时文件
vmlinux : 未经压缩的原始linux内核镜像.
/arch/<arch>/boot/zImage(bzImage): 使用zlib压缩后的内核镜像.
注:不同的体系结构对压缩后内核镜像的默认命名不同,比如arm的是zImage,而i386的是bzImage.(z表示zlib, bz表示"big zlib")
执行 make install 后会发现/boot目录下多了linux-2.6.24的相关文件,自动更新了/boot/grub2、grub.cfg文件
之前的linux内核依然保留,两个内核版本同时存在
6.reboot重启选择新的内核进行启动即可
可能是由于我编译的linux内核的版本较老的缘故,
启动卡在了Loading Initial ramdisk….,新的内核无法启动,原因后续探究
此文的主要目的是体验linux的编译与安装流程
Suse环境下编译linux-2.6.24内核的更多相关文章
- ubuntu环境下编译linux内核问题解决备忘
在使用比较新的gcc编译内核时,经常遇到这个问题: 问题一: 提示: mkimage" command not found - U-Boot images will not be built ...
- Redhat环境下编译安装Google Bazel
Redhat环境下编译安装bazel 作者:Jack47 目前Google Bazel没有提供各个操作系统下的二进制安装包,只提供源代码,需要我们自己编译安装,详情可以见我翻译的中文版Google B ...
- 在SoCEDS环境下编译和更新preloader和uboot程序的方法
在SoCEDS环境下编译和更新preloader和uboot程序的方法 前面有介绍preloader在HPS boot过程中的的作用,接下来讲述下用户在SoCEDS环境下改如何编译preloade ...
- Android 环境下编译FFmpeg
Android 环境下编译FFmpeg 开发环境:Ubuntu 12.04.2 LTS , android-sdk-linux, android-ndk-r8e 一 .X264 编译 1. X2 ...
- 如何在Windows环境下安装Linux系统虚拟机
如何在Windows环境下安装Linux系统虚拟机 本篇经验写给想要入门学习C语言的小白们.Windows系统因为使用窗口图形化,操作简单,功能多样,所以我们在Windows环境下可以做到很多,但想要 ...
- Windows环境下使用Linux命令
1.说明 如何在Windows环境下使用Linux命令, 这是一个屡见不鲜的问题, 而且已经有很多解决方法, 下面仅推荐几个我觉得好用的工具, 这些工具可能就是我们常用的软件, 而且已经在Window ...
- libCURL开源库在VS2010环境下编译安装,配置详解
libCURL开源库在VS2010环境下编译安装,配置详解 转自:http://my.oschina.net/u/1420791/blog/198247 http://blog.csdn.net/su ...
- centos7.6环境下编译安装tengine-2.2.2的编译安装
centos7.6环境下编译安装tengine-2.2.2的编译安装 .获取tengine2..2的源码包 http://tengine.taobao.org/download/tengine-2.2 ...
- Boost学习总结(一)VS2010环境下编译STLport和Boost
Boost学习总结(一)VS2010环境下编译STLport和Boost Boost简介 Boost库是一个功能强大.构造精巧.跨平台.开源并且完全免费的C++程序库.1998年,Beman G.Da ...
随机推荐
- Docker 运行hello world
Docker 允许你在容器内运行应用程序, 使用 docker run 命令来在容器内运行一个应用程序. 输出Hello world docker run ubuntu:15.10 /bin/echo ...
- Docker的网络模式和跨主机通信
文章转载自:http://www.a-site.cn/article/169899.html Docker的四种网络模式Bridge模式 当Docker进程启动时,会在主机上创建一个名为docke ...
- BOF和EOF的详细解释 ADO的三个核心对象
使用ADO连接数据库进行查一个列表询的时候,数据库将查询结果返回查询端,在查询端的内存里面就会有一个列表,这个列表存放的就是查询的结果.这个内存中的列表就是数据集.在你的程序里面rs就是标识的这个数据 ...
- springboot2.0整合freemarker快速入门
目录 1. 快速入门 1.1 创建工程pom.xml文件如下 1.2 编辑application.yml 1.3 创建模型类 1.4 创建模板 1.5 创建controller 1.6 测试 2. F ...
- 用链式字典树解决POJ2945
首先,我们的思路是用链式的字典树结构,解决poj2945这道题 题意是,统计所有的字符串出现的次数,并依次输出各个次数的数量 例如: input 9 6AAAAAAACACACGTTTTGACACAC ...
- BZOJ 4835: 遗忘之树
传送门 首先设 $f[x]$ 表示点分树上 $x$ 的子树内的方案数 发现对于 $x$ 的每个儿子 $v$ ,$x$ 似乎可以向 $v$ 子树内的每个节点连边,因为不管怎么连重心都不会变 显然是错的, ...
- 缓存策略:redis缓存之springCache
最近通过同学,突然知道服务器的缓存有很多猫腻,这里通过网上查询其他人的资料,进行记录: 缓存策略 比较简单的缓存策略: 1.失效:应用程序先从cache取数据,没有得到,则从数据库中取数据,成功后,放 ...
- C#:Guid.NewGuid()和DateTime.Now该选择哪个???
直接上代码: namespace ConsoleApp1 { class Program { static void Main(string[] args) { Console.WriteLine(& ...
- 【原创】大叔经验分享(62)kudu副本数量
kudu的副本数量是在表上设置,可以通过命令查看 # sudo -u kudu kudu cluster ksck $master ... Summary by table Name | RF | S ...
- js数据类型的转换
类型转换:就是把一种数据类型转换成另一种数据类型,在js中类型转换有以下三种情况:转数字,转字符串,转布尔值.对象转成这3种数据类型是没有意义的,对象里面可以放任意的数据类型. 在讲解类型转换之前,先 ...