选择显示字体大小

linux的启动和核心介绍

前几天大家对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   


 


关键字 本文所属关键字

相关 与本文相关文章

分类 所有文章关键字导航

源码编程相关

Java   Asp   PHP   .Net   XML   C/C++   CGI   VB   Jsp   J2ee   J2se   J2me   EJB   Servlet   Tomcat   Resin   Struts   Weblogic   Eclipse   ANT   GUI   JMS   Web servise   IDEA   Webphere   Hibernate   Spring   Jboss   Applet   Swing   Socket   Javamail   Perl   Ajax   P2P   安全   模式   框架   测试   开源   游戏

SQL数据库相关

My-SQL   Ms-SQL   Access   DB2   Oracle   Sybase   SQLserver   索引   存储过程   加密   数据库   分页   视图  

手机无线相关

3G   Wap   CDMA   GRPS   GSM   IVR   彩信   短信   无线   增值业务

网页设计制作相关

HTML   CSS   网页配色   网页特效   Javascript   VBscript   Dreamweaver   Frontpage   JS   Web   网站设计

网站建设推广相关

建站经验   网站优化   网站排名   推广   Alexa

操作系统/服务器相关

Windows XP   Windows 2000   Windows 2003   Windows Me   Windows 9.x   Linux   UNIX   注册表   操作系统   服务器   应用服务器

图形图像多媒体相关

Photoshop   Fireworks   Flash   Coreldraw   Illustrator   Freehand   Photoimpact   多媒体   图形图像

标准 网站致力的规范

Valid CSS!

无不良内容,无不良广告,无恶意代码

Valid XHTML 1.0 Transitional

creativecommons