分享
 
 
 

Linux的启动和核心介绍

王朝system·作者佚名  2008-05-18
窄屏简体版  字體: |||超大  

前几天大家对Linux的启动有些讨论。

于是整理了一下前段时间与他人交流的提纲,希望起到抛砖引玉的作用。

Xiaoman04@hotmail.com

这是一次对Linux介绍后的整理。

对象是一些刚对Linux核心感兴趣,并且准备进一步研究和改造的同志。

因为是由提纲整理而成,有些乱,见谅!

四部分内容:

一、Linux核心源码结构介绍

二、编译和配置的过程

三、系统启动顺序的相关文件

四、核心改造的一些经验

一、

当我们安装好一个Linux系统,通常核心源码存放在/usr/src/linux/目录。

下面先看看这目录下的各个子目录及文件。

[/]#cd /usr/src/linux

[linux]#ls -aF

./ MAINTAINERS drivers/ kernel/ scripts/

../ Makefile fs/ lib/

COPYING README include/ mm/

CREDITS Rules.make init/ modules/

Documentation/ arch/ ipc/ net/

下面我们逐一描述:

COPYING

GPL版权申明,看后你至少应该知道,你对具有GPL版权的源代码改动而形成的程序,或使用GPL工具产生的程序,具有使用GPL发表的义务。其中之一就是公开源代码。

CREDITS

光荣榜,你应当感谢的一些人的信息,其中的每一个人都对Linux做出过很大贡献。

Documentation/

文档目录,可有选择地看一下你感兴趣的部分

MAINTAINERS

维护人员列表,对当前版本的内核各部分都有谁负责,如果你研究的够深入,可以与他们讨论

Makefile

如果你在UNIX编译过程序,可以看明白README,Linus 所写,核心及其编译配置方法简单介绍Rules.make: make时使用的一些共同规则

arch/

architecture(体系结构)我关心的i386启动过程在其中,包括Linux在多种平台下的实现。如果要移植系统到一个新的CPU环境中,这就是你要关心的目录

drivers/

驱动程序目录,包含大量设备驱动的实现,按类别分子目录

fs/

文件系统,实现了当前流行的几乎所有文件系统。Cool

include/

嵌入文件目录

init/

初始化文件,包含main.c和version.c两个文件。Initialize

ipc/

ipc的实现,与SYS V兼容

kernel/

最核心代码,调度,中断,信号等的处理

lib/

一些工具。

Mm/

内存管理,Memory Manager,虚拟页、缓冲的实现。

Modules/

模块文件目录,用于存放编译时产生的模块目标文件(参考编译过程)

net/

网络实现,包括TCP/IP在内的大量网络协议的实现。

Scripts/

描述文件,脚本,用于对核心的配置。

二、

构造内核

常用命令包括:

make config, dep, clean, mrproper, zImage, bzImage, modules, modules_install

(1) make config

核心配置,调用./scripts/Configure 按照arch/i386/config.in 来进行配置。

命令执行完后产生文件.config,其中保存着配置信息。下一次再做make config将产生新的.config文件,原.config被改名为.config.old

(2)make dep

寻找依存关系,产生两个文件.depend和.hdepend。其中.hdepend表示每个.h文件都包含其它哪些嵌入文件。而.depend 文件有多个,在每个会产生目标文件(.o)文件的目录下均有,它表示每个目标文件都依赖哪些嵌入文件(.h)。

(3)make clean

清出以前构核所产生的所有目标文件、模块文件、核心以及一些临时文件等,不产生任何文件。

(4)make rmproper

删除所有因构核过程中产生的所有文件,及除了做make clean外,还要删除.config,.depend等文件,把核心源码恢复到最原始的状态。下次构核时就必须重新配置了。

(5)make, make zImage, make bzImage

make:

构核。通过各目录的Makefile文件进行。会在各个目录下产生一大堆目标文件,若核心代码没有错误,将产生文件vmlinux,这就是所构的核心。并产生映射文件System.map通过各目录的Makefile文件进行。.version 文件中的数加1,表示版本号(又产生一个新的版本了),让你明白,你已经对核心改动过多少次了。

Make zImage:

在make的基础上产生压缩的核心映象文件./arch/ $(ARCH)/boot/zImage以及在./arch/ $(ARCH)/boot/compresed/目录下产生一些临时文件。

Make bzImage:

在make 的基础上产生压缩比例更大的核心映象文件./arch/ $(ARCH)/boot/bzImage以及在./arch/ $(ARCH)/boot/compresed/目录下产生一些临时文件。在核心太大时进行。

(6)make modules

编译模块文件,你在make config时所配置的所有模块将在这时编译,形成模块目标文件,并把这些目标文件存放在modules目录中。使用如下命令看一看。

Ls modules

(7)make modules_install

把上面编译好的模块目标文件目录/lib/modules/ $KERNEL_VERSION/ 中。比如我的版本是2.0.36,做完这个操作后可使用下面的命令看看:

ls /lib/modules/2.0.36/

相关的命令还有很多,有兴趣可看相关资料和Makefile文件。

另外注意,这儿我们产生了一些隐含文件

.config

.oldconfig

.depend

.hdepend

.version

它们的意义应该很清楚了。

三、

系统的启动顺序及相关文件

仍在核心源码目录下,看以下几个文件

./arch/ $ARCH/boot/bootsect.s

./arch/ $ARCH/boot/setup.s

./init/main.c

bootsect.S 及 setup.S

这个程序是linux kernel的第一个程序,包括了linux自己的bootstrap程序,但是在说明这个程序前,必须先说明一般IBM PC开机时的动作(此处的开机是指"打开PC的电源"):

一般PC在电源一开时,是由内存中地址FFFF:0000开始执行(这个地址一定在ROM BIOS中,ROM BIOS一般是在FEOOOh到FFFFFh中),而此处的内容则是一个jump指令,jump到另一个位於ROM BIOS中的位置,开始执行一系列的动作,包括了检查RAM,keyboard,显示器,软硬磁盘等等,这些动作是由系统测试代码(system test code)来执行的,随着制作BIOS厂商的不同而会有些许差异,但都是大同小异,读者可自行观察自家机器开机时,萤幕上所显示的检查讯息。

紧接着系统测试码之后,控制权会转移给ROM中的启动程序(ROM bootstrap routine),这个程序会将磁盘上的第零轨第零扇区读入内存中(这就是一般所谓的boot sector,如果你曾接触过电脑病,

毒,就大概听过它的大名),至於被读到内存的哪里呢? --绝对位置07C0:0000(即07C00h处),这是IBM系列PC的特性。而位在linux开机磁盘的boot sector上的正是linux的bootsect程序,也就是说,bootsect是第一个被读入内存中并执行的程序。现在,我们可以开始来看看到底bootsect做了什么。

第一步

首先,bootsect将它"自己"从被ROM BIOS载入的绝对地址0x7C00处搬到0x90000处,然后利用一个jmpi(jump indirectly)的指令,跳到新位置的jmpi的下一行去执行,

第二步

接着,将其他segment registers包括DS,ES,SS都指向0x9000这个位置,与CS看齐。另外将SP及DX指向一任意位移地址( offset ),这个地址等一下会用来存放磁盘参数表(disk para- meter table )

第三步

接着利用BIOS中断服务int 13h的第0号功能,重置磁盘控制器,使得刚才的设定发挥功能。

第四步

完成重置磁盘控制器之后,bootsect就从磁盘上读入紧邻着bootsect的setup程序,也就是setup.S,此读入动作是利用BIOS中断服务int 13h的第2号功能。Setup的image将会读入至程序所指定的内存绝对地址0x90200处,也就是在内存中紧邻着bootsect 所在的位置。待setup的image读入内存后,利用BIOS中断服务int 13h的第8号功能读取目前磁盘的参数。

第五步

再来,就要读入真正linux的kernel了,也就是你可以在linux的根目录下看到的"vmlinuz" 。在读入前,将会先呼叫BIOS中断服务int 10h 的第3号功能,读取游标位置,之后再呼叫BIOS 中断服务int 10h的第13h号功能,在萤幕上输出字串"Loading",这个字串在boot linux时都会首先被看到,相信大家应该觉得很眼熟吧。

第六步

接下来做的事是检查root device,之后就仿照一开始的方法,利用indirect jump 跳至刚刚已读入的setup部份比较

把大家所熟知的MS DOS 与linux的开机部份做个粗浅的比较,MS DOS 由位於磁盘上boot sector的boot程序负责把IO.SYS载入内存中,而IO.SYS则负有把DOS的kernel --MSDOS.SYS载入内存的重责大任。而linux则是由位於boot sector 的

bootsect程序负责把setup及linux的kernel载入内存中,再将控制权交给setup。

##这几步内容主要参照一个台湾同胞写的文档,setup.s的内容希望有人补充。

Start_kernel()

当核心被载入后,首先进入的函数就是start_kernel。

./init/main.c 中函数start_kernel包含核心的启动过程及顺序。

通过它来看核心整个初始化过程。

首先进行一系列初始化,包括:

trap_init(); ##./arch/i386/kernel/traps.c 陷入

init_IRQ(); ##./arch/i386/kernel/irq.c setup IRQ

sched_init(); ##./kernel/sched.c 调度初始化,并初始化bottom_half

time_init(); ##./arch/i386/kernel/time.c

init_modules(); ##模块初始化

mem_init(memory_start,memory_end);

buffer_init(); ## ./fs/buffer.c 缓冲区

sock_init(); ## ./net/socket.c socket初始化,并初始化各协议(TCP等)

ipc_init();

sysctl_init();

然后通过调用kernelthread()产生init进程,全权交由init进程处理。调用cpu_idle(NULL)休息。

感兴趣又有时间的同志可以写一个startkernel()函数的详细分析报告。

下面看一看init进程的工作:

首先创建进程

bdflush ##./fs/buffer.c 缓冲区管理

和kswapd ##./mm/vmscan.c 虚拟内存管理

这两个进程非常重要

系统初始化(系统调用setup)

系统初始化包含设备初始化及各文件系统初始化。

Sys_setup (./fs/filesystems.c)

|

|-device_setup

| |

| -- chr_dev_init(); ##字符设备

| blk_dev_init(); ##块设备

| scsi_dev_init(); ##SCSI

| net_dev_init(); ##网络设备

| console_map_init(); ##控制台

|-binfmt_setup();

|-init_nls() ##各文件系统初始化

|-init_ext_fs()

|-init_ext2_fs()

. .

. .

. .

|-init_autofs_fs()

--mount_root() ##mount root fs

 
 
 
免责声明:本文为网络用户发布,其观点仅代表作者个人观点,与本站无关,本站仅提供信息存储服务。文中陈述内容未经本站证实,其真实性、完整性、及时性本站不作任何保证或承诺,请读者仅作参考,并请自行核实相关内容。
2023年上半年GDP全球前十五强
 百态   2023-10-24
美众议院议长启动对拜登的弹劾调查
 百态   2023-09-13
上海、济南、武汉等多地出现不明坠落物
 探索   2023-09-06
印度或要将国名改为“巴拉特”
 百态   2023-09-06
男子为女友送行,买票不登机被捕
 百态   2023-08-20
手机地震预警功能怎么开?
 干货   2023-08-06
女子4年卖2套房花700多万做美容:不但没变美脸,面部还出现变形
 百态   2023-08-04
住户一楼被水淹 还冲来8头猪
 百态   2023-07-31
女子体内爬出大量瓜子状活虫
 百态   2023-07-25
地球连续35年收到神秘规律性信号,网友:不要回答!
 探索   2023-07-21
全球镓价格本周大涨27%
 探索   2023-07-09
钱都流向了那些不缺钱的人,苦都留给了能吃苦的人
 探索   2023-07-02
倩女手游刀客魅者强控制(强混乱强眩晕强睡眠)和对应控制抗性的关系
 百态   2020-08-20
美国5月9日最新疫情:美国确诊人数突破131万
 百态   2020-05-09
荷兰政府宣布将集体辞职
 干货   2020-04-30
倩女幽魂手游师徒任务情义春秋猜成语答案逍遥观:鹏程万里
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案神机营:射石饮羽
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案昆仑山:拔刀相助
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案天工阁:鬼斧神工
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案丝路古道:单枪匹马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:与虎谋皮
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:李代桃僵
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案镇郊荒野:指鹿为马
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:小鸟依人
 干货   2019-11-12
倩女幽魂手游师徒任务情义春秋猜成语答案金陵:千金买邻
 干货   2019-11-12
 
推荐阅读
 
 
 
>>返回首頁<<
 
靜靜地坐在廢墟上,四周的荒凉一望無際,忽然覺得,淒涼也很美
© 2005- 王朝網路 版權所有