Linux内核.docx
《Linux内核.docx》由会员分享,可在线阅读,更多相关《Linux内核.docx(13页珍藏版)》请在冰点文库上搜索。
Linux内核
Linux内核
百科名片
GNU/Linux操作系统的基本体系结
Linux是最受欢迎的自由电脑操作系统内核。
它是一个用C语言写成,符合POSIX标准的类Unix操作系统。
Linux最早是由芬兰黑客LinusTorvalds为尝试在英特尔x86架构上提供自由免费的类Unix操作系统而开发的。
该计划开始于1991年,在计划的早期有一些Minix黑客提供了协助,而今天全球无数程序员正在为该计划无偿提供帮助。
技术上说Linux是一个内核。
“内核”指的是一个提供硬件抽象层、磁盘及文件系统控制、多任务等功能的系统软件。
一个内核不是一套完整的操作系统。
一套基于Linux内核的完整操作系统叫作Linux操作系统,或是GNU/Linux。
目录
特性
1.架构
2.可移植性
3.发表形式
组成
内核
1.概念
2.版本号
3.发展历史
4.体系结构属性
5.内核的开发和规范
6.主要子系统
7.Linux内核的一些有用特性
发行版
常量定义
1.1初始定义
2.解压缩符号lZTEXTADDR
3.内核符号lPHYS_OFFSET
4.构架相关的宏lBOOT_MEM(pram,pio,vio)
特性
1.架构
2.可移植性
3.发表形式
组成
内核
1.概念
2.版本号
3.发展历史
4.体系结构属性
5.内核的开发和规范
6.主要子系统
7.Linux内核的一些有用特性
发行版
常量定义
1.1初始定义
2.解压缩符号lZTEXTADDR
3.内核符号lPHYS_OFFSET
4.构架相关的宏lBOOT_MEM(pram,pio,vio)
展开
编辑本段特性
架构
Linux是一个一体化内核(monolithickernel)系统。
设备驱动程序可以完全访问硬件。
Linux内的设备驱动程序可以方便地以模块化(modularize)的形式设置,并在系统运行期间可直接装载或卸载。
可移植性
尽管LinusTorvalds的初衷不是使Linux成为一个可移植的操作系统,今天的Linux却是全球被最广泛移植的操作系统内核。
从掌上电脑iPaq到巨型电脑IBMS/390,甚至于微软出品的游戏机XBOX都可以看到Linux内核的踪迹。
Linux也是IBM超级计算机BlueGene的操作系统。
Linux目前可以在以下结构上运行:
Acorn:
Archimedes,A5000和RiscPC系列
康柏:
Alpha
惠普:
PA-RISC
IA64:
英特尔Itanium个人电脑
IBM的S/390和AS/400
英特尔80386及之后的兼容产品:
80386,80486和整个奔腾系列;AMDAthlon,Duron,Thunderbird;Cyrix系列。
对英特尔8086,8088,80186,80188和80280芯片的支持正在开发中。
Mips
摩托罗拉68020及以上:
新的Amigas,一些苹果电脑
PowerPC:
所有较新的苹果电脑
SPARC和UltraSPARC:
太阳微系统的工作站
HitachiSuperH:
SEGADreamcast
索尼公司:
PlayStation2
微软公司:
Xbox
ARM系列
发表形式
原先LinusTorvalds将Linux置于一个禁止任何商业行为的条例之下,但之后改用GNU通用公共许可证第二版。
该协议允许任何人对软件进行修改或发行,包括商业行为,只要其遵守该协议,所有基于Linux的软件也必须以该协议的形式发表,并提供源代码。
LinusTorvalds曾经公开声称将Linux置于GNU通用公共许可证之下是他一生中所做的“最好的决定”。
编辑本段组成
进程管理(processmanagement)、1
定时器(timer)、2
中断管理(interruptmanagement)、3
内存管理(memorymanagement)、4
模块管理(modulemanagement)、5
虚拟文件系统接口(VFSlayer)、6
文件系统(filesystem)、7
设备驱动程序(devicedriver)、8
进程间通信(inter-processcommunication)、9
网络管理(networkmanagement)、10
系统启动(systeminit)等操作系统功能的实现。
11
编辑本段内核
概念
操作系统是一个用来和硬件打交道并为用户程序提供一个有限服务集的低级支撑软件。
一个计算机系统是一个硬件和软件的共生体,它们互相依赖,不可分割。
计算机的硬件,含有外围设备、处理器、内存、硬盘和其他的电子设备组成计算机的发动机。
但是没有软件来操作和控制它,自身是不能工作的。
完成这个控制工作的软件就称为操作系统,在Linux的术语中被称为“内核”,也可以称为“核心”。
Linux内核的主要模块(或组件)分以下几个部分:
存储管理、CPU和进程管理、文件系统、设备管理和驱动、网络通信,以及系统的初始化(引导)、系统调用等。
版本号
一般地,可以从Linux内核版本号来区分系统是否是Linux稳定版还是测试版。
以版本2.4.0为例,2代表主版本号,4代表次版本号,0代表改动较小的末版本号。
在版本号中,序号的第二位为偶数的版本表明这是一个可以使用的稳定版本,如2.2.5,而序号的第二位为奇数的版本一般有一些新的东西加入,是个不一定很稳定的测试版本,如2.3.1。
这样稳定版本来源于上一个测试版升级版本号,而一个稳定版本发展到完全成熟后就不再发展。
发展历史
Linux最早是由芬兰人LinusTorvalds设计的。
当时由于UNIX的
主要Linux内核发行版简史
商业化,AndrewTannebaum教授开发了Minix操作系统以便于不受AT&T许可协议的约束,为教学科研提供一个操作系统。
当时发布在Internet上,免费给全世界的学生使用。
Minix具有较多UNIX的特点,但与UNIX不完全兼容。
1991年10月5日,Linus为了给Minix用户设计一个比较有效的UNIXPC版本,自己动手写了一个“类Minix”的操作系统。
整个故事从两个在端终上打印AAAA...和BBBB...的进程开始的,当时最初的内核版本是0.02。
LinusTorvalds将它发到了Minix新闻组,很快就得到了反应。
LinusTorvalds在这种简单的任务切换机制上进行扩展,并在很多热心支持者的帮助下开发和推出了Linux的第一个稳定的工作版本。
1991年11月,Linux0.10版本推出,0.11版本随后在1991年12月推出,当时将它发布在Internet上,免费供人们使用。
当Linux非常接近于一种可靠的/稳定的系统时,Linus决定将0.13版本称为0.95版本。
1994年3月,正式的Linux1.0出现了,这差不多是一种正式的独立宣言。
截至那时为止,它的用户基数已经发展得很大,而且Linux的核心开发队伍也建立起来了。
体系结构属性
在讨论大型而复杂的系统的体系结构时,可以从很多角度来审视系统。
体系结构分析的一个目标是提供一种方法更好地理解源代码。
Linux内核实现了很多重要的体系结构属性。
在或高或低的层次上,内核被划分为多个子系统。
Linux也可以看作是一个整体,因为它会将所有这些基本服务都集成到内核中。
这与微内核的体系结构不同,后者会提供一些基本的服务,例如通信、I/O、内存和进程管理,更具体的服务都是插入到微内核层中的。
随着时间的流逝,Linux内核在内存和CPU使用方面具有较高的效率,并且非常稳定。
但是对于Linux来说,最为有趣的是在这种大小和复杂性的前提下,依然具有良好的可移植性。
Linux编译后可在大量处理器和具有不同体系结构约束和需求的平台上运行。
一个例子是Linux可以在一个具有内存管理单元(MMU)的处理器上运行,也可以在那些不提供MMU的处理器上运行。
Linux内核的uClinux移植提供了对非MMU的支持。
内核的开发和规范
核心的开发和规范一直是由Linux社区控制着,版本也是唯一的。
实际上,操作系统的内核版本指的是在Linux本人领导下的开发小组开发出的系统内核的版本号。
自1994年3月14日发布了第一个正式版本Linux1.0以来,每隔一段时间就有新的版本或其修订版公布。
Linux将标准的GNU许可协议改称Copyleft,以便与Copyright相对照。
通用的公共许可(GPL)允许用户销售、拷贝和改变具有Copyleft的应用程序。
当然这些程序也可以是Copyright的,但是你必须允许进一步的销售、拷贝和对其代码进行改变,同时也必须使他人可以免费得到修改后的源代码。
事实证明,GPL对于Linux的成功起到了极大的作用。
它启动了一个十分繁荣的商用Linux阶段,还为编程人员提供了一种凝聚力,诱使大家加入这个充满了慈善精神的Linux运动。
主要子系统
系统调用接口:
SCI层提供了某些机制执行从用户空间到内核的函数调用。
正如前面讨论的一样,这个接口依赖于体系结构,甚至在相同的处理器家族内也是如此。
SCI实际上是一个非常有用的函数调用多路复用和多路分解服务。
在./linux/kernel中您可以找到SCI的实现,并在./linux/arch中找到依赖于体系结构的部分。
进程管理:
进程管理的重点是进程的执行。
在内核中,这些进程称为线程,代表了单独的处理器虚拟化(线程代码、数据、堆栈和CPU寄存器)。
在用户空间,通常使用进程这个术语,不过Linux实现并没有区分这两个概念(进程和线程)。
内核通过SCI提供了一个应用程序编程接口(API)来创建一个新进程(fork、exec或PortableOperatingSystemInterface[POSIX]函数),停止进程(kill、exit),并在它们之间进行通信和同步(signal或者POSIX机制)。
进程管理还包括处理活动进程之间共享CPU的需求。
内核实现了一种新型的调度算法,不管有多少个线程在竞争CPU,这种算法都可以在固定时间内进行操作。
这种算法就称为O
(1)调度程序,这个名字就表示它调度多个线程所使用的时间和调度一个线程所使用的时间是相同的。
O
(1)调度程序也可以支持多处理器(称为对称多处理器或SMP)。
您可以在./linux/kernel中找到进程管理的源代码,在./linux/arch中可以找到依赖于体系结构的源代码。
内存管理:
内核所管理的另外一个重要资源是内存。
为了提高效率,如果由硬
VFS在用户和文件系统之间提供了一个交换层
管理虚拟内存,内存是按照所谓的内存页方式进行管理的(对于大部分体系结构来说都是4KB)。
Linux包括了管理可用内存的方式,以及物理和虚拟映射所使用的硬件机制。
不过内存管理要管理的可不止4KB缓冲区。
Linux提供了对4KB缓冲区的抽象,例如slab分配器。
这种内存管理模式使用4KB缓冲区为基数,然后从中分配结构,并跟踪内存页使用情况,比如哪些内存页是满的,哪些页面没有完全使用,哪些页面为空。
这样就允许该模式根据系统需要来动态调整内存使用。
为了支持多个用户使用内存,有时会出现可用内存被消耗光的情况。
由于这个原因,页面可以移出内存并放入磁盘中。
这个过程称为交换,因为页面会被从内存交换到硬盘上。
内存管理的源代码可以在./linux/mm中找到。
虚拟文件系统:
虚拟文件系统(VFS)是Linux内核中非常有用的一个方面,因为它为文件系统提供了一个通用的接口抽象。
VFS在SCI和内核所支持的文件系统之间提供了一个交换层。
VFS在用户和文件系统之间提供了一个交换层
在VFS上面,是对诸如open、close、read和write之类的函数的一个通用API抽象。
在VFS下面是文件系统抽象,它定义了上层函数的实现方式。
它们是给定文件系统(超过50个)的插件。
文件系统的源代码可以在./linux/fs中找到。
文件系统层之下是缓冲区缓存,它为文件系统层提供了一个通用函数集(与具体文件系统无关)。
这个缓存层通过将数据保留一段时间(或者随即预先读取数据以便在需要是就可用)优化了对物理设备的访问。
缓冲区缓存之下是设备驱动程序,它实现了特定物理设备的接口。
Linux内核的一些有用特性
如果Linux内核的可移植性和效率还不够好,Linux还提供了其他一些特性,它们无法划分到上面的分类中。
作为一个生产操作系统和开源软件,Linux是测试新协议及其增强的良好平台。
Linux支持大量网络协议,包括典型的TCP/IP,以及高速网络的扩展(大于1GigabitEthernet[GbE]和10GbE)。
Linux也可以支持诸如流控制传输协议(SCTP)之类的协议,它提供了很多比TCP更高级的特性(是传输层协议的接替者)。
Linux还是一个动态内核,支持动态添加或删除软件组件。
被称为动态可加载内核模块,它们可以在引导时根据需要(当前特定设备需要这个模块)或在任何时候由用户插入。
Linux最新的一个增强是可以用作其他操作系统的操作系统(称为系统管理程序)。
最近,对内核进行了修改,称为基于内核的虚拟机(KVM)。
这个修改为用户空间启用了一个新的接口,它可以允许其他操作系统在启用了KVM的内核之上运行。
除了运行Linux的其他实例之外,Microsoft®Windows®也可以进行虚拟化。
惟一的限制是底层处理器必须支持新的虚拟化指令[1]。
编辑本段发行版
Linux内核的发展过程中,我们还不得不提一下各种Linux发行版的作用,因为正是它们推动了Linux的应用,从而也让更多的人开始关注Linux。
一些组织或厂家,将Linux系统的内核与外围实用程序(Utilities)软件和文档包装起来,并提供一些系统安装界面和系统配置、设定与管理工具,就构成了一种发行版本(distribution),Linux的发行版本其实就是Linux核心再加上外围的实用程序组成的一个大软件包而已。
相对于Linux操作系统内核版本,发行版本的版本号随发布者的不同而不同,与Linux系统内核的版本号是相对独立的。
因此把SUSE、RedHat、Ubuntu、Slackware等直接说成是Linux是不确切的,它们是Linux的发行版本,更确切地说,应该叫做“以Linux为核心的操作系统软件包”。
根据GPL准则,这些发行版本虽然都源自一个内核,并且都有自己各自的贡献,但都没有自己的版权。
Linux的各个发行版本(distribution),都是使用Linus主导开发并发布的同一个Linux内核,因此在内核层不存在什么兼容性问题。
每个版本都不一样的感觉,只是在发行版本的最外层才有所体现,而绝不是Linux本身特别是内核不统一或是不兼容。
90年代初期Linux开始出现的时候,仅仅是以源代码形式出现,用户需要在其他操作系统下进行编译才能使用。
后来出现了一些正式版本。
目前最流行的几个正式版本有:
SUSE、RedHat、Fedora、Debian、Ubuntu
编辑本段常量定义
1初始定义
宏phys定义了你的机器上的地址转换__virt_to_phys()。
这个宏用于把虚拟地址转换为一个物理地址。
通常情况下:
phys=virt-PAGE_OFFSETPHYS_OFFSET
解压缩符号lZTEXTADDR
解压缩器的地址地址。
由于当你调用解压缩器代码时,通常关闭MMU,因此这里并不讨论虚拟地址和物理地址的问题。
通常你在这个地址处调用内核,开始引导内核。
它不需要在RAM中,只需要位于FLASH或其他只读或读/写的可寻址的存储设备中。
lZBSSADDR
解压缩器的初始化为0的工作区的起始地址。
必须位于RAM中,解压缩器会替你把它初始化为0,此外,需要关闭MMU。
lZRELADDR
解压缩内核将被写入的地址和最终的执行地址。
必须满足:
__virt_to_phys(TEXTADDR)==ZRELADDR
内核的开始部分被编码为与位置无关的代码。
lINITRD_PHYS
放置初始RAM盘的物理地址。
仅当你使用bootpImage时相关(这是一种非常老的param_struct结构)
lINITRD_VIRT
初始RAM盘的虚拟地址。
必须满足:
__virt_to_phys(INITRD_VIRT)==INITRD_PHYS
lPARAMS_PHYS
param_struct结构体或taglis的物理地址,用于给定内核执行环境下的不同参数。
内核符号lPHYS_OFFSET
RAM第一个BANK的物理地址地址。
lPAGE_OFFSET
RAM第一个BANK的虚拟地址地址。
在内核引导阶段,虚拟地址PAGE_OFFSE将被映射为物理地址PHYS_OFFSET,它应该与TASK_SIZE具有相同的值。
lTASK_SIZE
一个用户进程的最大值,单位为byte。
用户空间的堆栈从这个地址处向下增长。
任何一个低于TASK_SIZE的虚拟地址对用户进程来说都是不可见的,因此,内核通过进程偏移对每个进行进行动态的管理。
我把这叫做用户段。
任何高于TASK_SIZE的对所有进程都是相同的,称之为内核段。
(换句话说,你不能把IO映射放在低于TASK_SIZE和PAGE_OFFSET的位置处。
)
lTEXTADDR
内核的虚拟起始地址,通常为PAGE_OFFSET0x8000。
内核映射必须在此结束。
lDATAADDR
内核数据段的虚拟地址,不能在使用解压缩器的情况下定义。
lVMALLOC_START
lVMALLOC_END
用于限制vmalloc()区域的虚拟地址。
此地址必须位于内核段。
通常,vmalloc()区域在最后的虚拟RAM地址以上开始VMALLOC_OFFSET字节。
lVMALLOC_OFFSET
OffsetnormallyincorporatedintoVMALLOC_STARTtoprovideaholebetweenvirtualRAMandthevmallocarea.Wedothistoallowoutofboundsmemoryaccesses(eg,somethingwritingofftheendofthemappedmemorymap)tobecaught.Normallysetto8MB.
构架相关的宏lBOOT_MEM(pram,pio,vio)
pram——指定了RAM起始的物理地址,必须始终存在,并应等于PHYS_OFFSET。
pio——是供arch/arm/kernel/debug-armv.S中的调试宏使用的,包含IO的8MB区域的物理地址。
vio——是8MB调试区域的虚拟地址。
这个调试区域将被位于代码中(通过MAPIO函数)的随后的构架相关代码再次进行初始化。
lBOOT_PARAMS
参见PARAMS_PHYS.
lFIXUP(func)
机器相关的修正,在存储子系统被初始化前运行。
lMAPIO(func)
机器相关的函数,用于IO区域的映射(包括上面的调试区)。
lINITIRQ(func)
用于初始化中断的机器相关的函数[2]。
参考资料
∙1
Linux内核剖析
∙2
Linux内核定义的常量
开放分类:
操作系统,计算机,共享,linux,os