首页 > 精品范文库 > 12号文库
浏览器内核总结
编辑:梦回江南 识别码:21-1028148 12号文库 发布时间: 2024-06-09 00:53:24 来源:网络

第一篇:浏览器内核总结

一、排版引擎.........................................................................................................................2

1、Trident(Windows)......................................................................................................2

2、Gecko(跨平台)...........................................................................................................2

3、KHTML(Linux).............................................................................................................3

4、WebKit(跨平台).........................................................................................................3

5、Chromium(跨平台)....................................................................................................3

6、Presto(跨平台)...........................................................................................................3

二、JavaScript引擎..................................................................................................................4

三、几个测试...........................................................................................................................4

1、V8引擎............................................................................................................................4

2、Acid3................................................................................................................................4

3、HTML5.............................................................................................................................4

四、几个奇葩...........................................................................................................................5

1、IETab................................................................................................................................5

2、Trident/Gecko双核浏览器.............................................................................................5

3、Trident/WebKit双核浏览器...........................................................................................5

4、Trident/Gecko/WebKit三核浏览器...............................................................................5

五、几个小点...........................................................................................................................6

1、Chrome/Chromium.........................................................................................................6

2、MyIE、MyIE2、傲游、GreenBrowser...........................................................................6

3、页面兼容性判断.............................................................................................................6

4、一直被模仿,一直被超越的Opera..............................................................................6

5、这年头流行刷版本号.....................................................................................................6

6、查看源代码、开发者工具.............................................................................................7

7、几个主要的浏览器官网以及版本下载.........................................................................7(1)Internet Explorer.....................................................................................................7(2)Mozilla Firefox.........................................................................................................7(3)Apple Safari..............................................................................................................7(4)Chromium................................................................................................................8(5)Google Chrome........................................................................................................8

一、排版引擎

首先厘清一下浏览器内核是什么东西。

英文叫做:Rendering Engine,中文翻译很多,排版引擎、解释引擎、渲染引擎,现在流行称为浏览器内核,至于为什么流行这么称呼,请自行领悟。

Rendering Engine,顾名思义,就是用来渲染网页内容的,将网页的内容和排版代码转换为可视的页面。因为是排版,所以肯定会排版错位等问题。为什么会排版错位呢?有的是由于网站本身编写不规范,有的是由于浏览器本身的渲染不标准。

现在有几个主流的排版引擎,因为这些排版引擎都有其代表的浏览器,所以常常会把排版引擎的名称和浏览器的名称混用,比如常的说IE内核、Chrome内核。其实这样子是不太合理的,因为一个完整的浏览器不会只有一的排版引擎,还有自己的界面框架和其它的功能支撑,而排版引擎本身也不可能实现浏览器的所有功能。下面罗列一下几款主流的排版引擎和浏览器。

1、Trident(Windows)

IE浏览器所使用的内核,也是很多浏览器所使用的内核,通常被称为IE内核。基于Trident内核的浏览器非常多,这是因为Trident内核提供了丰富的调用接口。老的Trident内核(比如常说的IE6内核)一直是不遵循W3C标准的,但是由于它的市场份额最大,所以后果就是大量的网站只支持老的Trident内核,依据W3C标准写的网页在老的Trident内核下面又出现偏差。目前可供调用的最新版的Trident内核是IE9所用的内核,相较之前的版本对W3C标准的支持增强了很多。

Trident内核的浏览器:

IE6、IE7、IE8(Trident 4.0)、IE9(Trident 5.0)、IE10(Trident 6.0);

世界之窗

1、世界之窗

2、世界之窗3;

360安全浏览器1、360安全浏览器2、360安全浏览器3、360安全浏览器4、360安全浏览器5;

傲游

1、傲游2;搜狗浏览器1;腾讯TT;阿云浏览器(早期版本)、百度浏览器(早期版本)、瑞星安全浏览器、Slim Browser;

GreenBrowser、爱帆浏览器(12 之前版本)、115浏览器、155浏览器;

闪游浏览器、N氧化碳浏览器、糖果浏览器、彩虹浏览器、瑞影浏览器、勇者无疆浏览器、114浏览器、蚂蚁浏览器、飞腾浏览器、速达浏览器、佐罗浏览器;

2、Gecko(跨平台)

Netscape6启用的内核,现在主要由Mozilla基金会进行维护,是开源的浏览器内核,目前最主流的Gecko内核浏览器是Mozilla Firefox,所以也常常称之为火狐内核。因为Firefox的出现,IE的霸主地位逐步被削弱,Chrome的出现则是加速了这个进程。非Trident内核的兴起

202_年HTML5主题峰会 “生态 共融 多赢”主题峰会浏览器专场TV专场渠道与合作工具与应用正在改变着整个互联网,最直接的就是推动了编码的标准化,也使得微软在竞争压力下不得不改进IE。不过比较可惜的是,虽然是开源的,也开发了这么多年,基于Gecko的浏览器并不多见,除了一些简单的改动(坑爹的X浏览器)或者是重新编译(绫川ayakawa、tete009),深度定制或者增强型外壳的还比较少见。另外就是有一些其它软件借用了Gecko内核,比如音乐管理软件SongBird。常见的Gecko内核的浏览器

Mozilla Firefox、Mozilla SeaMonkey Epiphany(早期版本)、Flock(早期版本)、K-Meleon

3、KHTML(Linux)

KDE开发的内核,速度快捷,容错度低。这个内核可能不见得很多人知道,但是后面再看下去你就明白了。

常见的KHTML内核的浏览器:Konqueror

4、WebKit(跨平台)

由KHTML发展而来,也是苹果给开源世界的一大贡献。是目前最火热的浏览器内核,火热倒不是说市场份额,而是应用的面积和势头。因为是脱胎于KHTML,所以也是具有高速的特点,同样遵循W3C标准。

常见的WebKit内核的浏览器:Apple Safari、Symbian系统浏览器

5、Chromium(跨平台)

维基百科里面并没有将Chromium从WebKit分出来,这个区分完全是基于我个人的恶趣味。记得以前看过一个大牛的博文说过,Chromium把WebKit的代码梳理得可读性提高很多,所以以前可能需要一天进行编译的代码,现在只要两个小时就能搞定。这个我自己也没有考究过,但是估计可信。这个也能解释为什么Gecko和WebKit出来了这么久,第三方编译、定制的版本并不多,但是由Chromium衍生出来的浏览器早就满坑满谷了。

常见的Chromium内核的浏览器:Chromium、Google Chrome、SRWare Iron、Comodo Dragon

6、Presto(跨平台)

Opera的内核,准确地说,是Opera 7.0及以后版本的内核,Opera 3.5-6.1版本使用的内核叫做Elektra。不用说,Presto对W3C标准的支持也是很良好的。虽然我很喜欢Opera,但是我对Presto的渲染速度一直有保留态度。之前在OperaChina论坛看见有人说过,Presto优先解析文字,保证可阅读性,媒体资源的渲染放后。常见的Presto内核的浏览器:Opera

二、JavaScript引擎

说完了排版引擎,接下来说说JavaScript引擎。顾名思义,JavaScript引擎就是用来渲染JavaScript的。为什么要单独拿出来说呢?因为它涉及到跑分。经常看见很多文章在报道说哪个浏览器更快,其实大部分说的就是JavaScript的渲染速度,而不是页面的载入速度。在网速许可的情况下,其实各个浏览器的页面载入速度差别不大(Opera逊色一些)。那是不是说对比JavaScript的渲染速度其实没有意义?也不是这么说,因为现在JavaScript在页面中的比重会越来越大,越来越多的动态页面开始大量借助JavaScript,比如现在主流的SNS、邮箱、网页游戏,所以JavaScript的渲染速度也是一个很重要的指标。JavaScript的渲染速度越快,动态页面的展示也越快。Opera在JavaScript引擎的跑分上面一直都是很牛逼的,一般来说最新测试版之间PK,Opera基本都会夺冠。

1、Chakra 查克拉,IE9启用的新的JavaScript引擎。

2、SpiderMonkey/TraceMonkey/JaegerMonkey SpiderMonkey应用在Mozilla Firefox 1.0-3.0,TraceMonkey应用在Mozilla Firefox 3.5-3.6版本,JaegerMonkey应用在Mozilla Firefox 4.0及后续的版本。

3、V8 应用于Chrome、傲游3。

4、Nitro 应用于Safari 4及后续的版本。

5、Linear A/Linear B/Futhark/Carakan Linear A应用于Opera 4.0-6.1版本,Linear B应用于Opera 7.0~9.2版本,Futhark应用于Opera 9.5-10.2版本,Carakan应用于Opera 10.5及后续的版本。

6、KJS KHTML对应的JavaScript引擎

三、几个测试

1、V8引擎

http://v8.googlecode.com/svn/data/benchmarks/v6/run.html

现在很多“双核”浏览器都用它来跑分测试JavaScript引擎,分数越高越好。

2、Acid3

http://acid3.acidtests.org/

标准支持测试,分数越高越好,满分是100分。

3、HTML5

http://?hl=zh-cn Beta在线安装包:

http://?hl=zh-CN&extra=betachannel Dev在线安装包: http://?hl=zh-CN&extra=devchannel Canary在线安装包: http://?hl=zh-CN&extra=canarychannel

Stable离线安装包:

http://?hl=zh-CN&standalone=1 Beta离线安装包: http://?hl=zh-CN&standalone=1&extra=betachannel Dev离线安装包:

http://?hl=zh-CN&standalone=1&extra=devchannel Canary离线安装包:

http://?hl=zh-CN&standalone=1&extra=canarychannel(6)Opera 官网:

http://www.teniu.cc/ 正式版:

http://www.teniu.cc/download/ 测试版: http://snapshot.opera.com/windows/latest

第二篇:主流浏览器内核概览

主流浏览器内核概览

浏览器最核心的部分是渲染引擎(Rendering Engine),我们一般习惯称之为“浏览器内核”,其负责解析网页语法(如HTML、JavaScript)并渲染、展示网页。因此,所谓的浏览器内核 通常也就是指浏览器所采用的渲染引擎,渲染引擎决定了浏览器如何显示网页的内容以及页面的格式信息。不同的浏览器内核对网页编写语法的解析也有所不同,因 此同一网页在不同的内核浏览器里的渲染、展示效果也可能不同。

l 主流浏览器内核介绍(如图所示)主流浏览器内核分类

浏览器内核种类繁多,商用的加上非商业的免费内核,大约有10款以上甚至更多,不过通常比较常见的大约只有以下4种,下面就简单介绍一下。

(1)Trident Trident(又称为MSHTML),是微软的Windows搭载的网页浏览器—— Internet Explorer浏览器使用的内核(俗称IE内核),该内核程序在1997年的IE 4中首次被采用,之后不断地加入新的技术并随着新版本的IE发布。Trident实际上是一款开放的内核,Trident引擎被设计成一个软件组件(模 块),使得其他软件开发人员很容易将网页浏览功能加到他们自行开发的应用程序里,其接口内核设计相当成熟,因此才涌现出许多采用IE内核而非IE的浏览器(如Maxthon、The World、腾讯的TT、GreenBrowser等),但是Trident只能用于Windwos平台。

由于IE本身的“垄断性”而使得Trident内核在很长时间内都是一家独大,微软也在相当长一段时间内都没有更新Trident内核,这就导致了两个后 果——一是Trident内核曾经几乎与W3C标准脱节;二是Trident内核的大量Bug等安全性问题没有得到及时解决。目前,微软对Trident 排版引擎做了重大变动,除了加入新的技术之外,还增加了对网页标准的支持。尽管这些变动已经在相当大的程度上落后了其他的排版引擎,如Gecko、WebCore、KHTML及Presto。

(2)Gecko Gecko是开放源代码、以C++编写的网页排版引擎,目前被Mozilla家族网页浏览器以及Netscape 6以后版本浏览器所使用。这款软件原本是由网景通讯公司开发的,现在则由Mozilla基金会维护。由于Gecko的特点是代码完全公开,因此,其可开发 程度很高,全世界的程序员都可以为其编写代码,增加功能。因为这是个开源内核,因此受到许多人的青睐,采用Gecko内核的浏览器也很多,这也是 Gecko内核虽然年轻但市场占有率能够迅速提高的重要原因。

Gecko排版引擎提供了一个丰富的程序界面以供与互联网相关的应用程序使用,例如网页浏览器、HTML编辑器、客户端/服务器等。虽然最初的主要对象是 Mozilla的衍生产品,如Netscape和Mozilla Firefox,但是现在已有很多其他软件利用这个排版引擎。此外Gecko也是一个跨平台内核,可以在Windows、BSD、Linux和Mac OS X中使用。

Gecko是最流行的排版引擎之一,其流行程度仅次于Trident。使用Gecko 引擎的浏览器有Firefox、网景6~

9、SeaMonkey、Camino、Mozilla、Flock、Galeon、K-Meleon、Minimo、Sleipni、Songbird、XeroBank。Google Gadget引擎采用的就是Gecko浏览器引擎。

(3)Presto

Presto是一个由Opera Software开发的浏览器排版引擎,目前Opera 7.0~10.00版本使用该款引擎。Presto的特点就是渲染速度的优化达到了极致,它是目前公认的网页浏览速度最快的浏览器内核,然而代价是牺牲了网页的兼容性。Presto实际上是一个动态内核,与Trident、Gecko等内核的最大区别就在于脚本处理上,Presto有着天生的优势,页面的全部或者部分都 能够在回应脚本事件时等情况下被重新解析。此外该内核在执行JavaScript时有着最快的速度,根据同等条件下的测试,Presto内核执行同等 JavaScript所需的时间仅有Trident和Gecko内核的约1/3。不过,不足之处在于Presto是商业引擎,使用Presto的除了 Opera以外,只剩下NDS Browser、Nokia 770网络浏览器等,这在很大程度上限制了Presto的发展。Opera Widget引擎采用的就是Presto引擎。

(4)WebKit

WebKit 是一个开放源代码的浏览器引擎(Web Browser Engine),WebKit最初的代码来自KDE的KHTML和KJS(它们均为开放源代码,都是自由软件,在GPL协议下授权)。所以WebKit也是自由软件,同时开放源代码。

除了Safari浏览器,Mac下还有OmniWeb、Shiira等人气很高的浏览器。Google的chrome也使用WebKit作为内核。

WebKit内核在手机上的应用也十分广泛,例如Google的Android平台浏览器、Apple的iPhone浏览器、Nokia S60浏览器等所使用的浏览器内核引擎,都是基于WebKit引擎的。

WebKit内核也广泛应用于Widget引擎产品,包括中国移动的BAE、Apple的Dashboard以及Nokia WRT在内采用的均为WebKit引擎。

第三篇:web项目测试兼容性测试以及四大内核浏览器

Pc/wap项目兼容性测试汇总

PC兼容性

1.操作系统兼容性 重点:XP、win7、win8 一般:Mac os、win10

2.分辨率兼容性

重点:小分辨率:1024*768;大分辨率:1920*1080 一般:其他

3.浏览器兼容性

重点:IE6(重点)、IE8、谷歌浏览器、狐火浏览器

一般:QQ、360、猎豹、搜狗、遨游、Safari、win10的Spartan、IE7、IE9、IE10 Wap移动端兼容性

1.操作系统

2.3.5、4.1.2、4.2.2、5.0等等 推荐测试机(小米、红米、三星)

2.浏览器兼容性

Ios : Safari自带浏览器、UC、百度、360、QQ、微信(内嵌浏览器)安卓: 安卓自带浏览器、UC、百度、360、QQ、微信(内嵌浏览器)重点:ios自带浏览器、安卓自带浏览器、UC浏览器

3.分辨率兼容性(尺寸)

重点:480*320、800*400、720 * 1280 一般:其

四大浏览器的内核

一、Trident内核代表产品Internet Explorer,又称其为IE内核。Trident(又称为MSHTML),是微软开发的一种排版引擎。使用Trident渲染引擎的浏览器包括:IE(6/7/8/9/10)、360安全浏览器、傲游、世界之窗浏览器、Avant、腾讯TT、Netscape

8、NetCaptor、Sleipnir、GOSURF、GreenBrowser和KKman等。

二、Gecko内核代表作品Mozilla FirefoxGecko是一套开放源代码的、以C++编写的网页排版引擎。Gecko是最流行的排版引擎之一,仅次于Trident。使用它的最著名浏览器有Firefox、Netscape6至9。

三、WebKit内核代表作品Safari、Chromewebkit 是一个开源项目,包含了来自KDE项目和苹果公司的一些组件,主要用于Mac OS系统,它的特点在于源码结构清晰、渲染速度极快。缺点是对网页代码的兼容性不高,导致一些编写不标准的网页无法正常显示。主要代表作品有Safari和Google的浏览器Chrome。

四、Presto内核代表作品OperaPresto是由Opera Software开发的浏览器排版引擎,供Opera 7.0及以上使用。它取代了旧版Opera 4至6版本使用的Elektra排版引擎,包括加入动态功能,例如网页或其部分可随着DOM及Script语法的事件而重新排版 参考资料:百度百科

第四篇:linux内核启动流程总结

X86体系结构内核启动分析

一、硬件检测

当机器加电后它首先执行BIOS(基本输入输出系统)中的代码,BIOS首先执行加电自检程序(POST),当自检通过程便完成了硬件的启动。当自检完成后BIOS按照系统COMS中设置的启动顺序搜寻有效的启动驱动器(这里我们以硬盘为例),并读入系统引导扇区,并将系统控制权交给引导程序。

二、加载和执行引导程序 系统引导程序主要是把系统内核装载到内存,启动盘必须在第一个逻辑磁道上包含引导记录。这512个字节的扇区又被称作是引导扇区,在系统完成加电自检后,BIOS从启动盘中将引导扇区读入到内存中。一旦引导记录加载完毕,BIOS就交出系统的执行控制权,跳转到引导程序的头部执行。

有关linux pc的引导程序lilo和grub,lilo和grub可以引导多个系统,嵌入式系统上,最常见的bootloader是UBOOT,如果机器上要装多系统的话一般都会用到它们,这一引导程序也储存在引导扇区中或者存放在主引导记录中(MBR),lilo和grub都许允用户自己配置,它们在系统安装时建立了关于系统内核占用磁盘数据块的位置对照表。

比如,grub程序就非常强大。Gurb运行后,将初始化设置内核运行所需的环境。然后加载内核镜像。grub磁盘引导全过程:

stage1: grub读取磁盘第一个512字节(硬盘的0道0面1扇区,被称为MBR(主引导记录),也称为bootsect)。MBR由一部分bootloader的引导代码、分区表和魔数三部分组成。

stage1_5: 识别各种不同的文件系统格式。这使得grub识别到文件系统。

stage2: 加载系统引导菜单(/boot/grub/menu.lst或grub.lst根据grub版本不同文件位置会有所不同),加载内核vmlinuz和RAM磁盘initrd。

有时候基本引导装载程序(stage1)不能识别stage2所在的文件系统分区,那么这时候就需要stage1.5来连接stage1和stage2了

假设有如下grub配置代码 root(hd0,0)//grub分区

//linux分区 kernel /vmlinuz‐2.6.35.10‐74.fc14.i686 ro root=/dev/ram0 initrd /initramfs‐2.6.35.10‐74.fc14.i686.img 要搞清楚上面两个root的关系,root(hd0,0)中的root是grub命令,它用来指定boot所在的分区作为grub的根目录.而root=/dev/ram0是kernel的参数,它告诉操作系统内核加载完毕之后,真实的文件系统所在的设备.要注意grub的根目录和文件系统的根目录的区别。kernel命令用来指定内核所在的位置,“/”代表(hd0,0),也就是grub的根目录initrd命令用来指定初始化ram的img文件所在位置。

三、内核启动 内核映像文件vmlinuz:包含有linux内核的静态链接的可执行文件,传统上,vmlinux被称为可引导的内核镜像。vmlinuz是vmlinux的压缩文件。其构成如下:

(1)第一个512字节(以前是在arch/i386/boot/bootsect.S);

(2)第二个,一段代码,若干个不多于512字节的段(以前是在arch/i386/boot/setup.S);

(3)保护模式下的内核代码(在arch/x86/boot/main.c)。

bzImage文件:使用make bzImage命令编译内核源代码,可以得到采用zlib算法压缩的zImage文件,即bigzImage文件。老的zImage解压缩内核到低端内存,bzImage则解压缩内核到高端内存(1M(0x100000)以上),在保护模式下执行。bzImage文件一般包含有vmlinuz、bootsect.o、setup.o、解压缩程序misc.o、以及其他一些相关文件(如piggy.o)。注意,在Linux 2.6内核中,bootsect.S和setup.S被整合为header.S。

initramfs(或initrd)文件:initrd是initialized ram disk的意思。主要用于加载硬件驱动模块,辅助内核的启动,挂载真正的根文件系统。

装载Linux内核的第一步应该是加载实模式代码(boot sector和setup代码),grub就会把实模式代码setup加载到0x07C00之上的某个地址上,其中setup的前512个字节是boot sector(引导扇区),现在这个引导扇区的作用并不是用来引导系统,而是为了兼容及传递一些参数。之后grub跳转到setup的入口点,入口点为_start例程(根据arch/x86/boot/setup.ld可知)。然后setup最后跳到arch/x86/boot/main.c再经过一系列的跳转,跳到start_kernel()函数,这是Linux内核的启动函数。main.c文件是整个Linux内核的中央联结点。每种体系结构都会执行一些底层设置函数,然后执行名为start_kernel的函数(在init/main.c中可以找到这个函数)。可以认为main.c是内核的“粘合剂(glue)”,之前执行的代码都是各种体系结构相关的代码,一旦到达start_kernel(),就与体系结构无关了。start_kernel()会调用一系列初始化函数来设置中断,执行进一步的内存配置,解析内核命令行参数。然后调用fs/dcache.c:vfs_caches_init()---->fs/namespace.c:mnt_init()创建基于内存的rootfs文件系统(是一个虚拟的内存文件系统,称为VFS),这是系统初始化时的根结点,即“/”结点,后面VFS会指向真实的文件系统。fs/namespace.c:mnt_init()会调用fs/ramfs/inode.c:init_rootfs()会调用fs/filesystems.c:register_filesystem()注册rootfs。然后fs/namespace.c:init_mount_tree()调用fs/super.c:do_kern_mount()在内核中挂载rootfs,调用fs/fs_struct.c:set_fs_root()将当前的rootfs文件系统配置为根文件系统。此时rootfs里只有根目录。

为什么不直接把真实的文件系统配置为根文件系统?答案很简单,内核中没有真实根文件系统设备(如硬盘,USB)的驱动,而且即便你将根文件系统的设备驱动编译到内核中,此时它们还尚未加载,实际上所有内核中的驱动是由后面的kernel_init线程进行加载。另外,我们的root设备都是以设备文件的方式指定的,如果没有根文件系统,设备文件怎么可能存在呢?

start_kernel()在最后会调用rest_init(),这个函数会启动一个内核线程来运行kernel_init(),自己则调用cpu_idle()进入空闲循环,让调度器接管控制权。抢占式的调度器就可以周期性地接管控制权,从而提供多任务处理能力。

kernel_init()用于完成初始化rootfs、加载内核模块、挂载真正的根文件系统。(因为已经初始化了rootfs,而且还加载了内核模块,所以可以找到设备如硬盘、内存,然后就可以把分区设置为根设备,并在根设备上挂载文件系统)挂载完真正的根文件系统后,goto到out,将挂载点从当前目录移到“/”,并把“/”作为系统的根目录,至此虚拟文件系统切换到了实际的根文件系统。

目前2.6的kernel支持三方式来挂载最终的根文件系统:

(1)所有需要的设备和文件系统驱动被编译进内核,没有initrd。通过“root=“参数指定的根设备,init/main.c:kernel_init()将调用prepare_namespace()直接在指定的根设备上挂载最终的根文件系统。通过可选的”init=“选项,还可以运行用户指定的init程序。

(2)一些设备和文件驱动作为模块来构建并存放的initrd中。initrd被称为ramdisk,是一个独立的小型文件系统。它需要包含/linuxrc程序(或脚本),用于加载这些驱动模块,并挂载最终的根文件系统(这个根文件系统在pc平台存放在硬盘上,结合使用pivot_root系统调用),然后initrd被卸载。initrd由prepare_namespace()挂载和运行。内核必须要使用CONFIG_BLK_DEV_RAM(支持ramdisk)和CONFIG_BLK_DEV_INITRD(支持initrd)选项进行编译才能支持initrd。(方法1只挂载了一次文件系统,而这个方法挂载了两次)

initrd文件通过在grub引导时用initrd命令指定。它有两种格式,一种是类似于linux2.4内核使用的传统格式的文件系统镜像,称之为imageinitrd,它的制作方法同Linux2.4内核的initrd一样,其核心文件就是/linuxrc。另外一种格式的initrd是cpio格式的,这种格式的initrd从linux 2.5起开始引入,使用cpio工具生成,其核心文件不再

是/linuxrc,而是/init,这种initrd称为cpioinitrd。为了向后兼容,linux2.6内核对cpioinitrd和imageinitrd这两种格式的initrd均支持,但对其处理流程有着显著的区别。cpioinitrd的处理与initramfs类似,会直接跳过

prepare_namespace(),imageinitrd的处理则由prepare_namespace()进行。

(3)使用initramfs。prepare_namespace()调用会被跳过。这意味着必须有一个程序来完成这些工作。这个程序是通过修改usr/gen_init_cpio.c的方式,或通过新的initrd格式(一个cpio归档文件)存放在initramfs中的,它必须是”/init“。这个程序负责prepare_namespace()所做的所有工作。为了保持向后兼容,在现在的内核中,/init程序只有是来自cpio归档的情况才会被运行。如果不是来自cpio归档,init/main.c:kernel_init()将运行prepare_namespace()来挂载最终的根文件系统,并运行一个预先定义的init程序(或者是用户通过init=指定的,或者是/sbin/init,/etc/init,/bin/init)。initramfs是从2.5 kernel开始引入的一种新的实现机制。顾名思义,initramfs只是一种RAM filesystem而不是disk。initramfs实际是一个包含在内核映像内部的cpio归档,启动所需的用户程序和驱动模块被归档成一个文件。因此,不需要cache,也不需要文件系统。编译2.6版本的linux内核时,编译系统总会创建initramfs,然后通过连接脚本archx86kernelvmlinux.lds.S把它与编译好的内核连接成一个文件,它被链接到地址__initramfs_start~__initramfs_end处。内核源代码树中的usr目录就是专门用于构建内核中的initramfs的。缺省情况下,initramfs是空的,X86架构下的文件大小是134个字节。实际上它的含义就是:在内核镜像中附加一个cpio包,这个cpio包中包含了一个小型的文件系统,当内核启动时,内核将这个cpio包解开,并且将其中包含的文件系统释放到rootfs中,内核中的一部分初始化代码会放到这个文件系统中,作为用户层进程来执行。这样带来的明显的好处是精简了内核的初始化代码,而且使得内核的初始化过程更容易定制。注意initramfs和initrd都可以是cpio包,可以压缩也可以不压缩。但initramfs是包含在内核映像中的,作为内核的一部分存在,因此它不会由bootloader(如grub)单独地加载,而initrd是另外单独编译生成的,是一个独立的文件,会由bootloader单独加载到RAM中内核空间以外的地址处。目前initramfs只支持cpio包格式,它会被 populate_rootfs>unpack_to_rootfs(&__initramfs_start, &__initramfs_end&__initramfs_start, 0)函数解压、解析并拷贝到根目录。initramfs被解析处理后原始的cpio包(压缩或非压缩)所占的空间(&__initramfs_start&__initramfs_end)是作为系统的一部分直接保留在系统中,不会被释放掉。而对于initrd镜像文件,如果没有在命令行中设置”keepinitd"命令,那么initrd镜像文件被处理后其原始文件所占的空间(initrd_endinitrd_start)将被释放掉。

四、启动应用程序

prepare_namspace执行完后,真正的文件系统就挂载成功。转入init_post(),它用来运行用户空间的第一个进程,即众所周知的init进程,在我的ubuntu下,init先读/etc/init/下的配置文件,配置文件描述了运行级别、等,并通过从/etc/rcX.d目录到/etc/init.d目录的初始化脚本的链接来启动与终止系统服务。执行相关脚本,以完成系统初始化,如设置键盘、字体,装载模块,设置网络等,最后运行登录程序,出现登录界面。运行用户空间中的init进程可能是以下几种情况:

(1)noinitrd方式,则直接运行用户空间中的/sbin/init(或/etc/init,/bin/init),作为第一个用户进程。

(2)传统的imageinitrd方式。运行的第一个程序是/linuxrc脚本,由它来启动用户空间中的init进程。

(3)cpioinitrd和initramfs方式。运行的第一个程序是/init脚本,由它来启动用户空间中的init进程。

总的来说,x86架构的Linux内核启动过程分为6大步,分别为:

(1)实模式的入口函数_start():在header.S中,这里会进入众所周知的main函数,它拷贝bootloader的各个参数,执行基本硬件设置,解析命令行参数。

(2)保护模式的入口函数startup_32():在compressed/header_32.S中,这里会解压bzImage内核映像,加载vmlinux内核文件。

(3)内核入口函数startup_32():在kernel/header_32.S中,这就是所谓的进程0,它会进入体系结构无关的start_kernel()函数,即众所周知的Linux内核启动函数。start_kernel()会做大量的内核初始化操作,解析内核启动的命令行参数,并启动一个内核线程来完成内核模块初始化的过程,然后进入空闲循环。

(4)内核模块初始化的入口函数kernel_init():在init/main.c中,这里会启动内核模块、创建基于内存的rootfs、加载initramfs文件或cpioinitrd,并启动一个内核线程来运行其中的/init脚本,完成真正根文件系统的挂载。

(5)根文件系统挂载脚本/init:这里会挂载根文件系统、运行/sbin/init,从而启动众所周知的进程1。

(6)init进程的系统初始化过程:执行相关脚本,以完成系统初始化,如设置键盘、字体,装载模块,设置网络等,最后运行登录程序,出现登录界面。

如果从体系结构无关的视角来看,start_kernel()可以看作时体系结构无关的Linux main函数,它是体系结构无关的代码的统一入口函数,这也是为什么文件会命名为init/main.c的原因。这个main.c粘合剂把各种体系结构的代码“粘合”到一个统一的入口处。

第五篇:微软IE10浏览器常用键盘快捷键总结

微软IE10浏览器常用键盘快捷键总结

键盘快捷键是两个或多个键的组合,这些组合键可用于执行通常需要鼠标或其他指针设备才能执行的任务。可以使用 Internet Explorer 键盘快捷键快速执行许多不同任务,或在不使用鼠标的情况下正常操作。常见快捷键显示地址栏、已固定的网站、频繁访问网站和收藏夹网站(不适用于桌面 Internet Explorer)

Alt D打开新选项卡

Ctrl T关闭选项卡Ctrl W打开一个新的 InPrivate 浏览窗口Ctrl Shift P

刷新页面F5

将当前页添加到收藏夹 Crtl D打印当前页Ctrl P

浏览器内核总结
TOP