Linux操作系统内核编译详解
- 格式:docx
- 大小:34.14 KB
- 文档页数:3
最小的Linux操作系统制作过程详解一,什么是BabyLinuxBabyLinux不是一个完整的发行版,他是利用原有的一套完整的linux系统的内核原代码和编译工具,利用busybox内建的强大功能,在一张软盘上做的一个很小的linux系统。
他具备一个linux系统的基本特征,支持linux系统最常用的一百多个命令,支持多种文件系统,支持网络等等,你可以把他当做一张linux 起动盘和修复盘来用,你也可以把他当做一个静态路由的路由器软件,当然,你也可以把他当做一个linux玩具,向你的朋友炫耀linux可以做的多么小。
我把他叫做BabyLinux因为他很小巧,小的很可爱,像一个刚刚出生的小baby。
二.为什么要作这样一个linux先说说我一开始的想法,当我一开始接触linux的时候,看到书上说,linux 通常安装只需要60M左右的空间,但是我发现装在我硬盘上的Redhat 6.0确要占据好几百M的空间。
为什么我的linux这么大呢? 后来我发现,装在我机器上的那么多东西只有不到30%是我平时常用的,还有30%是我极少用到的,另外的40%基本上是不用的。
于是,我和大多数初学者一样,开始抱怨,为什么linux 不能做的精简一点呢?于是,我萌发了自己裁减系统的想法。
可惜那个时候我还没有听说过有LFS和Debain。
等到我积累了足够的linux知识后,我开始制作这样一个小系统。
制作这样一个小系统最大的意义在于,你可以通过制作系统了解linux的启动过程,学会ramdisk的使用,让你在短时间内学到更多的linux知识。
当然,你会得到很大的乐趣。
这个项目只是做一个具有基本特征的linux系统,如果你想自己做一个具有完整功能的linux,请阅读Linux From Scratch (LFS)文档。
三,什么人适合读这篇文档如果你是一个linux爱好者,并且很想了解linux的启动过程和系统的基本结构,而且是一个喜欢动手研究小玩意的人,那么这个文档可以满足你的需求。
petalinux-build -c u-boot的编译流程概述说明1. 引言1.1 概述本文旨在介绍petalinux-build -c u-boot命令的编译流程。
Petalinux是一款面向嵌入式Linux开发的工具,而U-Boot是一款应用于嵌入式系统的开源引导加载程序。
通过深入了解这两个工具,并对petalinux-build -c u-boot命令进行详细分析,我们可以更好地理解和掌握其编译流程。
1.2 文章结构本文主要分为五个部分:引言、编译流程概述、编译流程详解、注意事项和常见问题解答以及结论。
在引言中,我们将简要介绍文章的内容和目的。
接下来,在第二部分中,我们将概述Petalinux和U-Boot,并重点介绍petalinux-build -c u-boot命令的作用。
第三部分将详细解释编译流程,并包括准备工作、设置环境变量和构建U-Boot镜像等步骤。
在第四部分,我们将讨论常见错误和解决方法,提供编译优化技巧和建议,并指出其他注意事项。
最后,在结论部分,我们将对编译流程进行总结,并展望未来发展。
1.3 目的本文旨在帮助读者全面了解petalinux-build -c u-boot命令的编译流程。
通过讲解Petalinux和U-Boot的基本知识以及具体的编译步骤,读者可以深入了解如何正确地使用该命令,并解决在编译过程中可能遇到的问题。
同时,本文还将提供一些实用的编译优化技巧和建议,以帮助读者提高工作效率。
希望通过本文的阅读,读者能够更好地掌握petalinux-build -c u-boot命令的使用技巧,并在嵌入式Linux开发中取得更好的成果。
2. 编译流程概述:2.1 Petalinux简介:Petalinux是由Xilinx开发的一种嵌入式Linux开发工具套件,用于构建、定制和部署基于Xilinx处理器系统的嵌入式Linux系统。
它提供了一系列工具和文档,方便开发人员进行Linux镜像的配置、编译和调试。
Linux BOOTLOADER全程详解(Arm S3C2410)网上关于Linux的BOOTLOADER文章不少了,但是大都是vivi,blob等比较庞大的程序,读起来不太方便,编译出的文件也比较大,而且更多的是面向开发用的引导代码,做成产品时还要裁减,这一定程度影响了开发速度,对初学者学习开销也比较大,在此分析一种简单的BOOTLOADER,是在三星公司提供的2410 BOOTLOADER上稍微修改后的结果,编译出来的文件大小不超过4k,希望对大家有所帮助.1.几个重要的概念COMPRESSED KERNEL and DECOMPRESSED KERNEL压缩后的KERNEL,按照文档资料,现在不提倡使用DECOMPRESSED KERNEL,而要使用COMPRESSED KERNEL,它包括了解压器.因此要在ram分配时给压缩和解压的KERNEL提供足够空间,这样它们不会相互覆盖.当执行指令跳转到COMPRESSED KERNEL后,解压器就开始工作,如果解压器探测到解压的代码会覆盖掉COMPRESSED KERNEL,那它会直接跳到COMPRESSED KERNEL后存放数据,并且重新定位KERNEL,所以如果没有足够空间,就会出错.Jffs2 File System可以使armlinux应用中产生的数据保存在FLASH上,我的板子还没用到这个.RAMDISK使用RAMDISK可以使ROOT FILE SYSTEM在没有其他设备的情况下启动.一般有两种加载方式,我就介绍最常用的吧,把COMPRESSED RAMDISK IMAGE放到指定地址,然后由BOOTLOADER把这个地址通过启动参数的方式ATAG_INITRD2传递给KERNEL.具体看代码分析.启动参数(摘自IBM developer)在调用内核之前,应该作一步准备工作,即:设置Linux 内核的启动参数。
Linux 2.4.x 以后的内核都期望以标记列表(tagged list)的形式来传递启动参数。
LINUX操作系统LINUX操作系统Linux是一套免费使用和自由传播的类Unix操作系统,是一个基于POSIX和UNIX的多用户、多任务、支持多线程和多CPU的操作系统。
下面就由店铺为大家详解介绍一下LINUX操作系统吧!一、Linux的产生Linux是一种计算机操作系统,通常被称为类Unix系统,这是因为Linux和Unix有着很深的渊源。
在计算机非常昂贵的年代,只有在大学或大型企业中才能够接触到计算机,人们非常希望多个用户能同时连接到一台计算机并同时使用它。
于是,计算机科学家开始研究分时系统。
分时系统是将CPU的运行时间分为很小的时间片,多个用户任务可以通过交替占有时间片的方式实现快速交互使用CPU。
由于时间片是很短的一段时间,以至于每个用户任务、每个用户好像在独占CPU,独占整个计算机系统。
在研究人员的不懈努力下,1969年,AT&T公司贝尔实验室开发出了Unix系统。
1986年,芬兰赫尔辛基大学的Andrew Tanenbaum教授为了给学生讲授《计算机操作系统》课程,开发出了Minix系统,这是Unix 的一个变体。
1991年,Andrew Tanenbaum教授的学生Linus Torvalds,由于对课堂上使用的Minix系统不太满意,于是开始在386 PC机上试着改进Minix系统。
1991年8月,Linus Torvalds在comp.os.minix新闻组贴上了以下这段话:“你好,所有使用minix的人,我正在为386(486)AT做一个免费的操作系统,只是为了爱好,……”Linus最初为自己的这套系统取名为freax,他将源代码放在了芬兰的一个FTP站点上供大家下载。
该站点的管理员认为这个系统是Linus的Minix系统,因此建立了一个名为Linux的文件夹来存放它。
于是,Linus的“爱好”就成了今天微软的头号对手,功能强大且价格低廉的Linux操作系统。
1993年底94年初,Linux 1.0终于诞生了!Linux1.0已经是一个功能完备的操作系统,而且内核写得紧凑高效,可以充分发挥硬件的性能,在4M内存的80386机器上也表现得非常好,至今人们还在津津乐道于此。
Linux内核数据结构之kfifo详解本⽂分析的原代码版本: 2.6.24.4kfifo的定义⽂件: kernel/kfifo.ckfifo的头⽂件: include/linux/kfifo.h kfifo是内核⾥⾯的⼀个First In First Out数据结构,它采⽤环形循环队列的数据结构来实现,提供⼀个⽆边界的字节流服务,并且使⽤并⾏⽆锁编程技术,即当它⽤于只有⼀个⼊队线程和⼀个出队线程的场情时,两个线程可以并发操作,⽽不需要任何加锁⾏为,就可以保证kfifo的线程安全。
下⽂着重于代码剖析,各部分代码后⾯有关键点说明,同时可参考注释进⾏理解:struct kfifo {unsigned char *buffer; /* the buffer holding the data : ⽤于存放数据的缓存 */unsigned int size; /* the size of the allocated buffer : 空间的⼤⼩,在初化时将它向上扩展成2的幂,为了⾼效的进⾏与操作取余,后⾯会详解 */unsigned int in; /* data is added at offset (in % size) :如果使⽤不能保证任何时间最多只有⼀个读线程和写线程,需要使⽤该lock实施同步*/unsigned int out; /* data is extracted from off. (out % size) :⼀起构成⼀个循环队列。
in指向buffer中队头,⽽且out指向buffer中的队尾 */spinlock_t *lock; /* protects concurrent modifications :⽤于put和get过程中加锁防⽌并发*/}; 以上是kfifo的数据结构,kfifo主要提供了如下操作: //根据给定buffer创建⼀个kfifostruct kfifo *kfifo_init(unsigned char *buffer, unsigned int size,gfp_t gfp_mask, spinlock_t *lock);//给定size分配buffer和kfifostruct kfifo *kfifo_alloc(unsigned int size, gfp_t gfp_mask,spinlock_t *lock);//释放kfifo空间void kfifo_free(struct kfifo *fifo);//向kfifo中添加数据unsigned int kfifo_put(struct kfifo *fifo,const unsigned char *buffer, unsigned int len);//从kfifo中取数据unsigned int kfifo_get(struct kfifo *fifo,unsigned char *buffer, unsigned int len); //获取kfifo中有数据的buffer⼤⼩ unsigned int kfifo_len(struct kfifo *fifo);(1)初始化部分:/* 创建队列 */struct kfifo *kfifo_init(unsigned char *buffer, unsigned int size,gfp_t gfp_mask, spinlock_t *lock){struct kfifo *fifo;/* size must be a power of 2 :判断是否为2的幂*/BUG_ON(!is_power_of_2(size));fifo = kmalloc(sizeof(struct kfifo), gfp_mask);if (!fifo)return ERR_PTR(-ENOMEM);fifo->buffer = buffer;fifo->size = size;fifo->in = fifo->out = 0;fifo->lock = lock;return fifo;}/* 分配空间 */struct kfifo *kfifo_alloc(unsigned int size, gfp_t gfp_mask, spinlock_t *lock){unsigned char *buffer;struct kfifo *ret;if (!is_power_of_2(size)) { /*判断是否为2的幂 */BUG_ON(size > 0x80000000);size = roundup_pow_of_two(size); /* 如果不是则向上扩展成2的幂 */}buffer = kmalloc(size, gfp_mask);if (!buffer)return ERR_PTR(-ENOMEM);ret = kfifo_init(buffer, size, gfp_mask, lock);if (IS_ERR(ret))kfree(buffer);return ret;}巧妙点①:保证buffer size为2的幂 通常循环队列⼊队和出队操作要不断的对size 进⾏求余,⼀般采⽤ mInOffset % size(其他类似) 的⽅法,但是乘、除和求余等会执⾏多次加法器运算,它们没有单纯的加法运算效率⾼,更没有位运算效率⾼。
MBR和GRUB概述Linux 的启动流程目前比较流行的方式主要是以下步骤:1、引导器(例如 GRUB)启动;2、内核启动;3、系统进程启动与配置。
本文以 GRUB 为研究对象,对 GRUB 启动与内核启动两个部分进行描述,关于系统进程的进一步启动与配置将用另一篇文章来说明。
常见的目录结构(以 CentOS 5.3 为例):/boot|-- System.map-2.6.18-128.el5|-- System.map-2.6.18-128.el5xen|-- config-2.6.18-128.el5|-- config-2.6.18-128.el5xen|-- initrd-2.6.18-128.el5.img|-- initrd-2.6.18-128.el5xen.img|-- lost+found|-- memtest86+-1.65|-- message|-- symvers-2.6.18-128.el5.gz|-- symvers-2.6.18-128.el5xen.gz|-- vmlinuz-2.6.18-128.el5|-- vmlinuz-2.6.18-128.el5xen|-- xen-syms-2.6.18-128.el5|-- xen.gz-2.6.18-128.el5`-- grub|-- device.map|-- e2fs_stage1_5|-- fat_stage1_5|-- ffs_stage1_5|-- grub.conf|-- iso9660_stage1_5|-- jfs_stage1_5|-- menu.lst -> ./grub.conf|-- minix_stage1_5|-- reiserfs_stage1_5|-- splash.xpm.gz|-- stage1|-- stage2|-- ufs2_stage1_5|-- vstafs_stage1_5`-- xfs_stage1_5图一: CentOS 5.3 的 /boot 目录目录分作两大部分,一个是 /boot 目录下除 grub 目录以外的所有文件,这些是 Linux 的内核以及内核启动相关的一些文件;另一个就是 grub 下的所有文件, GRUB 引导器启动所需要的所有文件都在 grub 目录下。
initrd详解(转)1.什么是 Initrdinitrd 的英⽂含义是 boot loader initialized RAM disk,就是由 boot loader 初始化的内存盘。
在 linux内核启动前, boot loader 会将存储介质中的 initrd ⽂件加载到内存,内核启动时会在访问真正的根⽂件系统前先访问该内存中的 initrd ⽂件系统。
在 boot loader 配置了 initrd 的情况下,内核启动被分成了两个阶段,第⼀阶段先执⾏ initrd ⽂件系统中的“某个⽂件“,完成加载驱动模块等任务,第⼆阶段才会执⾏真正的根⽂件系统中的 /sbin/init 进程。
这⾥提到的“某个⽂件“,Linux2.6 内核会同以前版本内核的不同,所以这⾥暂时使⽤了“某个⽂件“这个称呼,后⾯会详细讲到。
第⼀阶段启动的⽬的是为第⼆阶段的启动扫清⼀切障爱,最主要的是加载根⽂件系统存储介质的驱动模块。
我们知道根⽂件系统可以存储在包括IDE、SCSI、USB在内的多种介质上,如果将这些设备的驱动都编译进内核,可以想象内核会多么庞⼤、臃肿。
Initrd 的⽤途主要有以下四种:1. linux 发⾏版的必备部件linux 发⾏版必须适应各种不同的硬件架构,将所有的驱动编译进内核是不现实的,initrd 技术是解决该问题的关键技术。
Linux 发⾏版在内核中只编译了基本的硬件驱动,在安装过程中通过检测系统硬件,⽣成包含安装系统硬件驱动的initrd,⽆⾮是⼀种即可⾏⼜灵活的解决⽅案。
2. livecd 的必备部件同 linux 发⾏版相⽐,livecd 可能会⾯对更加复杂的硬件环境,所以也必须使⽤ initrd。
3. 制作 Linux usb 启动盘必须使⽤ initrdusb 设备是启动⽐较慢的设备,从驱动加载到设备真正可⽤⼤概需要⼏秒钟时间。
如果将 usb 驱动编译进内核,内核通常不能成功访问 usb 设备中的⽂件系统。
http://www.lampbrother.net
Linux操作系统内核编译详解
内核简介
内核,是一个操作系统的核心。它负责管理系统的进程、内存、设备驱动程序、文件和网
络系统,决定着系统的性能和稳定性。
Linux的一个重要的特点就是其源代码的公开性,所有的内核源程序都可以在
/usr/src/linux下找到,大部分应用软件也都是遵循GPL而设计的,你都可以获取相应的
源程序代码。全世界任何一个软件工程师都可以将自己认为优秀的代码加入到其中,由此引
发的一个明显的好处就是Linux修补漏洞的快速以及对最新软件技术的利用。而Linux的内
核则是这些特点的最直接的代表。
想象一下,拥有了内核的源程序对你来说意味着什么?首先,我们可以了解系统是如何工
作的。通过通读源代码,我们就可以了解系统的工作原理,这在Windows下简直是天方夜谭。
其次,我们可以针对自己的情况,量体裁衣,定制适合自己的系统,这样就需要重新编译内
核。在Windows下是什么情况呢?相信很多人都被越来越庞大的Windows整得莫名其妙过。
再次,我们可以对内核进行修改,以符合自己的需要。这意味着什么?没错,相当于自己开
发了一个操作系统,但是大部分的工作已经做好了,你所要做的就是要增加并实现自己需要
的功能。在Windows下,除非你是微软的核心技术人员,否则就不用痴心妄想了。
内核版本号
由于Linux的源程序是完全公开的,任何人只要遵循GPL,就可以对内核加以修改并发布
给他人使用。Linux的开发采用的是集市模型(bazaar,与cathedral--教堂模型--对应),
为了确保这些无序的开发过程能够有序地进行,Linux采用了双树系统。一个树是稳定树
(stable tree),另一个树是非稳定树(unstable tree)或者开发树(development tree)。
一些新特性、实验性改进等都将首先在开发树中进行。如果在开发树中所做的改进也可以应
用于稳定树,那么在开发树中经过测试以后,在稳定树中将进行相同的改进。一旦开发树经
过了足够的发展,开发树就会成为新的稳定树。开发数就体现在源程序的版本号中;源程序
版本号的形式为x.y.z:对于稳定树来说,y是偶数;对于开发树来说,y比相应的稳定树
大一(因此,是奇数)。到目前为止,稳定树的最高版本是2.2.16,最新发布的Redhat7.0
所采用的就是2.2.16的内核;开发树的最新版本是2.3.99。也许你已经发现和多网站上都
有2.4.0-test9-pre7之类的内核,但是这并不是正式版本。
为什么重新编译内核
http://www.lampbrother.net
Linux作为一个自由软件,在广大爱好者的支持下,内核版本不断更新。新的内核修订了旧
内核的bug,并增加了许多新的特性。如果用户想要使用这些新特性,或想根据自己的系统
度身定制一个更高效,更稳定的内核,就需要重新编译内核。
通常,更新的内核会支持更多的硬件,具备更好的进程管理能力,运行速度更快、 更稳
定,并且一般会修复老版本中发现的许多漏洞等,经常性地选择升级更新的系统内核是
Linux使用者的必要操作内容。
为了正确的合理地设置内核编译配置选项,从而只编译系统需要的功能的代码,一般主要
有下面四个考虑:
自己定制编译的内核运行更快(具有更少的代码)
系统将拥有更多的内存(内核部分将不会被交换到虚拟内存中)
不需要的功能编译进入内核可能会增加被系统攻击者利用的漏洞
将某种功能编译为模块方式会比编译到内核内的方式速度要慢一些
内核编译模式
要增加对某部分功能的支持,比如网络之类,可以把相应部分编译到内核中(build-in),
也可以把该部分编译成模块(module),动态调用。如果编译到内核中,在内核启动时就可
以自动支持相应部分的功能,这样的优点是方便、速度快,机器一启动,你就可以使用这部
分功能了;缺点是会使内核变得庞大起来,不管你是否需要这部分功能,它都会存在,这就
是Windows惯用的招数,建议经常使用的部分直接编译到内核中,比如网卡。如果编译成模
块,就会生成对应的.o文件,在使用的时候可以动态加载,优点是不会使内核过分庞大,
缺点是你得自己来调用这些模块。
内核编译详解
新版本内核的获取和更新
国内各大ftp上一般都可以找到某些版本的内核。新版本的内核的发布有两种形式,一种是
完整的内核版本,另外一种是patch文件,即补丁。完整的内核版本比较大,比如
linux-2.4.0-test8.tar.bz2就有18M之多,网速快的用户可以下载使用。完整内核版本一
http://www.lampbrother.net
般是.tar.gz(.tgz)文件或者是.bz2文件,二者分别是使用gzip或者bzip2进行压缩的
文件,使用时需要解压缩。patch文件则比较小,一般只有几十K到几百K,极少的会超过
1M,网速慢的用户可以使用patch文件来升级内核。但是patch文件是针对于特定的版本的,
你需要找到自己对应的版本才能使用。
编译内核需要root权限,以下操作都假定你是root用户。请把你需要升级的内核拷贝到
/usr/src/下(下文中以2.4.0test8的内核的linux-2.4.0test8.tar.gz为例),命令为
#cp linux-2.4.0test8.tar.gz /usr/sr