⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 00000042.htm

📁 一份很好的linux入门资料
💻 HTM
字号:
<HTML><HEAD>  <TITLE>BBS水木清华站∶精华区</TITLE></HEAD><BODY><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER>发信人:&nbsp;yyh&nbsp;(阿欢&amp;2000年终于快到了),&nbsp;信区:&nbsp;Linux&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<BR>标&nbsp;&nbsp;题:&nbsp;Linux的启动和核心介绍,&nbsp;Xiao&nbsp;Man&nbsp;<BR>发信站:&nbsp;BBS&nbsp;水木清华站&nbsp;(Sun&nbsp;Dec&nbsp;12&nbsp;22:05:52&nbsp;1999)&nbsp;<BR>&nbsp;<BR>前几天大家对Linux的启动有些讨论。&nbsp;<BR>于是整理了一下前段时间与他人交流的提纲,希望起到抛砖引玉的作用。&nbsp;<BR><A HREF="mailto:xiaoman04@hotmail.com">xiaoman04@hotmail.com</A>&nbsp;<BR>这是一次对Linux介绍后的整理。&nbsp;<BR>对象是一些刚对Linux核心感兴趣,并且准备进一步研究和改造的同志。&nbsp;<BR>因为是由提纲整理而成,有些乱,见谅!&nbsp;<BR> &nbsp;<BR>四部分内容:&nbsp;<BR>一、Linux核心源码结构介绍&nbsp;<BR>二、编译和配置的过程&nbsp;<BR>三、系统启动顺序的相关文件&nbsp;<BR>四、核心改造的一些经验&nbsp;<BR>一、&nbsp;<BR>当我们安装好一个Linux系统,通常核心源码存放在/usr/src/linux/目录。&nbsp;<BR>下面先看看这目录下的各个子目录及文件。&nbsp;<BR>[/]#cd&nbsp;/usr/src/linux&nbsp;<BR>[linux]#ls&nbsp;-aF&nbsp;<BR>./&nbsp;MAINTAINERS&nbsp;drivers/&nbsp;kernel/&nbsp;scripts/&nbsp;<BR>../&nbsp;Makefile&nbsp;fs/&nbsp;lib/&nbsp;<BR>COPYING&nbsp;README&nbsp;include/&nbsp;mm/&nbsp;<BR>CREDITS&nbsp;Rules.make&nbsp;init/&nbsp;modules/&nbsp;<BR>Documentation/&nbsp;arch/&nbsp;ipc/&nbsp;net/&nbsp;<BR>下面我们逐一描述:&nbsp;<BR>COPYING&nbsp;<BR>##&nbsp;GPL版权申明,看后你至少应该知道,你对具有GPL版权的源代码改动而&nbsp;<BR>形成的程序,或使用GPL工具产生的程序,具有使用GPL发表的义务。其中之一就是&nbsp;<BR>公开源代码。&nbsp;<BR>CREDITS&nbsp;<BR>##&nbsp;光荣榜,你应当感谢的一些人的信息,其中的每一个人都对Linux做出过&nbsp;<BR>很大贡献。&nbsp;<BR>Documentation/&nbsp;<BR>##&nbsp;文档目录,可有选择地看一下你感兴趣的部分&nbsp;<BR>MAINTAINERS&nbsp;<BR>##&nbsp;维护人员列表,对当前版本的内核各部分都有谁负责,如果你研究的&nbsp;<BR>够深入,可以与他们讨论&nbsp;<BR>Makefile&nbsp;<BR>##&nbsp;如果你在UNIX编译过程序,可以看明白&nbsp;<BR>README&nbsp;<BR>##&nbsp;Linus&nbsp;所写,核心及其编译配置方法简单介绍&nbsp;<BR>Rules.make&nbsp;<BR>##&nbsp;make时使用的一些共同规则&nbsp;<BR>arch/&nbsp;<BR>##&nbsp;architecture(体系结构)我关心的i386启动过程在其中,&nbsp;<BR>##&nbsp;包括Linux在多种平台下的实现。如果要移植系统到一个新的&nbsp;<BR>##CPU环境中,这就是你要关心的目录&nbsp;<BR>drivers/&nbsp;<BR>##&nbsp;驱动程序目录,包含大量设备驱动的实现,按类别分子目录&nbsp;<BR>fs/&nbsp;<BR>##&nbsp;文件系统,实现了当前流行的几乎所有文件系统。Cool&nbsp;<BR>include/&nbsp;<BR>##&nbsp;嵌入文件目录&nbsp;<BR>init/&nbsp;<BR>##&nbsp;初始化文件,包含main.c和version.c两个文件。Initialize&nbsp;<BR>ipc/&nbsp;<BR>##&nbsp;ipc的实现,与SYS&nbsp;V兼容&nbsp;<BR>kernel/&nbsp;<BR>##&nbsp;最核心代码,调度,中断,信号等的处理&nbsp;<BR>lib/&nbsp;<BR>##&nbsp;一些工具。&nbsp;<BR>mm/&nbsp;<BR>##&nbsp;内存管理,Memory&nbsp;Manager,虚拟页、缓冲的实现。&nbsp;<BR>modules/&nbsp;<BR>##&nbsp;模块文件目录,用于存放编译时产生的模块目标文件(参考编译过程)&nbsp;<BR>net/&nbsp;<BR>##&nbsp;网络实现,包括TCP/IP在内的大量网络协议的实现。&nbsp;<BR>scripts/&nbsp;<BR>##&nbsp;描述文件,脚本,用于对核心的配置。&nbsp;<BR> &nbsp;<BR>二、&nbsp;<BR>构造内核&nbsp;<BR>常用命令包括:&nbsp;<BR>make&nbsp;config,&nbsp;dep,&nbsp;clean,&nbsp;mrproper,&nbsp;zImage,&nbsp;bzImage,&nbsp;modules,&nbsp;modules_install&nbsp;<BR>&nbsp;<BR>(1)&nbsp;make&nbsp;config&nbsp;<BR>核心配置,调用./scripts/Configure&nbsp;按照arch/i386/config.in&nbsp;来进行&nbsp;<BR>配置。&nbsp;<BR>命令执行完后产生文件.config,其中保存着配置信息。&nbsp;<BR>下一次再做make&nbsp;config将产生新的.config文件,原.config被改名为.config.old&nbsp;<BR>(2)make&nbsp;dep&nbsp;<BR>寻找依存关系。&nbsp;<BR>产生两个文件.depend和.hdepend&nbsp;<BR>其中.hdepend表示每个.h文件都包含其它哪些嵌入文件。&nbsp;<BR>而.depend&nbsp;文件有多个,在每个会产生目标文件(.o)文件的目录下均有,&nbsp;<BR>它表示每个目标文件都依赖哪些嵌入文件(.h)。&nbsp;<BR> &nbsp;<BR>(3)make&nbsp;clean&nbsp;<BR>清出以前构核所产生的所有目标文件、模块文件、核心以及一些临时文件等,&nbsp;<BR>不产生任何文件&nbsp;<BR> &nbsp;<BR>(4)make&nbsp;rmproper&nbsp;<BR>删除所有因构核过程中产生的所有文件,及除了做make&nbsp;clean外,还要&nbsp;<BR>删除.config,.depend等文件,把核心源码恢复到最原始的状态。&nbsp;<BR>下次构核时就必须重新配置了。&nbsp;<BR> &nbsp;<BR>(5)make,&nbsp;make&nbsp;zImage,&nbsp;make&nbsp;bzImage&nbsp;<BR>make:&nbsp;<BR>构核。通过各目录的Makefile文件进行。&nbsp;<BR>会在各个目录下产生一大堆目标文件,若核心代码没有错误,将&nbsp;<BR>产生文件vmlinux,这就是所构的核心。并产生映射文件System.map&nbsp;<BR>通过各目录的Makefile文件进行。&nbsp;<BR>.version&nbsp;文件中的数加1,表示版本号(又产生一个新的版本了),让你&nbsp;<BR>明白,你已经对核心改动过多少次了。&nbsp;<BR>make&nbsp;zImage:&nbsp;<BR>在make的基础上产生压缩的核心映象文件./arch/$(ARCH)/boot/zImage&nbsp;<BR>以及在./arch/$(ARCH)/boot/compresed/目录下产生一些临时文件。&nbsp;<BR>make&nbsp;bzImage:&nbsp;<BR>在make&nbsp;的基础上产生压缩比例更大的核心映象文件&nbsp;<BR>./arch/$(ARCH)/boot/bzImage&nbsp;<BR>以及在./arch/$(ARCH)/boot/compresed/目录下产生一些临时文件。&nbsp;<BR>在核心太大时进行。&nbsp;<BR>(6)make&nbsp;modules&nbsp;<BR>编译模块文件,你在make&nbsp;config时所配置的所有模块将在这时编译,&nbsp;<BR>形成模块目标文件,并把这些目标文件存放在modules目录中。&nbsp;<BR>使用如下命令看一看。&nbsp;<BR>ls&nbsp;modules&nbsp;<BR>(7)make&nbsp;modules_install&nbsp;<BR>把上面编译好的模块目标文件目录/lib/modules/$KERNEL_VERSION/&nbsp;中。&nbsp;<BR>比如我的版本是2.0.36,做完这个操作后可使用下面的命令看看:&nbsp;<BR>ls&nbsp;/lib/modules/2.0.36/&nbsp;<BR> &nbsp;<BR>相关的命令还有很多,有兴趣可看相关资料和Makefile文件。&nbsp;<BR>另外注意,这儿我们产生了一些隐含文件&nbsp;<BR>.config&nbsp;<BR>.oldconfig&nbsp;<BR>.depend&nbsp;<BR>.hdepend&nbsp;<BR>.version&nbsp;<BR>它们的意义应该很清楚了。&nbsp;<BR>三、&nbsp;<BR>系统的启动顺序及相关文件&nbsp;<BR>仍在核心源码目录下,看以下几个文件&nbsp;<BR>./arch/$ARCH/boot/bootsect.s&nbsp;<BR>./arch/$ARCH/boot/setup.s&nbsp;<BR>./init/main.c&nbsp;<BR> &nbsp;<BR>bootsect.S&nbsp;及&nbsp;setup.S&nbsp;<BR> 这个程序是linux&nbsp;kernel的第一个程序,包括了linux自己的bootstrap程序,&nbsp;<BR>但是在说明这个程序前,必须先说明一般IBM&nbsp;PC开机时的动作(此处的开机是指&nbsp;<BR>&quot;打开PC的电源&quot;):&nbsp;<BR>  一般PC在电源一开时,是由内存中地址FFFF:0000开始执行(这个地址一定&nbsp;<BR>在ROM&nbsp;BIOS中,ROM&nbsp;BIOS一般是在FEOOOh到FFFFFh中),而此处的内容则是一个&nbsp;<BR>jump指令,jump到另一个位於ROM&nbsp;BIOS中的位置,开始执行一系列的动作,包&nbsp;<BR>括了检查RAM,keyboard,显示器,软硬磁盘等等,这些动作是由系统测试代码&nbsp;<BR>(system&nbsp;test&nbsp;code)来执行的,随着制作BIOS厂商的不同而会有些许差异,但都&nbsp;<BR>是大同小异,读者可自行观察自家机器开机时,萤幕上所显示的检查讯息。&nbsp;<BR>  紧接着系统测试码之后,控制权会转移给ROM中的启动程序&nbsp;<BR>(ROM&nbsp;bootstrap&nbsp;routine),这个程序会将磁盘上的第零轨第零扇区读入&nbsp;<BR>内存中(这就是一般所谓的boot&nbsp;sector,如果你曾接触过电脑病&nbsp;<BR>毒,就大概听过它的大名),至於被读到内存的哪里呢?&nbsp;--绝对&nbsp;<BR>位置07C0:0000(即07C00h处),这是IBM系列PC的特性。而位在linux开机&nbsp;<BR>磁盘的boot&nbsp;sector上的正是linux的bootsect程序,也就是说,bootsect是&nbsp;<BR>第一个被读入内存中并执行的程序。现在,我们可以开始来&nbsp;<BR>看看到底bootsect做了什么。&nbsp;<BR>第一步&nbsp;<BR> 首先,bootsect将它&quot;自己&quot;从被ROM&nbsp;BIOS载入的绝对地址0x7C00处搬到&nbsp;<BR>0x90000处,然后利用一个jmpi(jump&nbsp;indirectly)的指令,跳到新位置的&nbsp;<BR>jmpi的下一行去执行,&nbsp;<BR>第二步&nbsp;<BR> 接着,将其他segment&nbsp;registers包括DS,ES,SS都指向0x9000这个位置,&nbsp;<BR>与CS看齐。另外将SP及DX指向一任意位移地址(&nbsp;offset&nbsp;),这个地址等一下&nbsp;<BR>会用来存放磁盘参数表(disk&nbsp;para-&nbsp;meter&nbsp;table&nbsp;)&nbsp;<BR>第三步&nbsp;<BR> 接着利用BIOS中断服务int&nbsp;13h的第0号功能,重置磁盘控制器,使得刚才&nbsp;<BR>的设定发挥功能。&nbsp;<BR> &nbsp;<BR>第四步&nbsp;<BR> 完成重置磁盘控制器之后,bootsect就从磁盘上读入紧邻着bootsect的setup&nbsp;<BR>程序,也就是setup.S,此读入动作是利用BIOS中断服务int&nbsp;13h的第2号功能。&nbsp;<BR>setup的image将会读入至程序所指定的内存绝对地址0x90200处,也就是在内存&nbsp;<BR>中紧邻着bootsect&nbsp;所在的位置。待setup的image读入内存后,利用BIOS中断服&nbsp;<BR>务int&nbsp;13h的第8号功能读取目前磁盘的参数。&nbsp;<BR>第五步&nbsp;<BR> 再来,就要读入真正linux的kernel了,也就是你可以在linux的根目录下看&nbsp;<BR>到的&quot;vmlinuz&quot;&nbsp;。在读入前,将会先呼叫BIOS中断服务int&nbsp;10h&nbsp;的第3号功能,&nbsp;<BR>读取游标位置,之后再呼叫BIOS&nbsp;中断服务int&nbsp;10h的第13h号功能,在萤幕上输&nbsp;<BR>出字串&quot;Loading&quot;,这个字串在boot&nbsp;linux时都会首先被看到,相信大家应该觉&nbsp;<BR>得很眼熟吧。&nbsp;<BR>第六步&nbsp;<BR> 接下来做的事是检查root&nbsp;device,之后就仿照一开始的方法,利用indirect&nbsp;<BR>jump&nbsp;跳至刚刚已读入的setup部份&nbsp;<BR>比较&nbsp;<BR>  把大家所熟知的MS&nbsp;DOS&nbsp;与linux的开机部份做个粗浅的比较,MS&nbsp;DOS&nbsp;由位於&nbsp;<BR>磁盘上boot&nbsp;sector的boot程序负责把IO.SYS载入内存中,而IO.SYS则负有把DOS&nbsp;<BR>的kernel&nbsp;--MSDOS.SYS载入内存的重责大任。而linux则是由位於boot&nbsp;sector&nbsp;的&nbsp;<BR>bootsect程序负责把setup及linux的kernel载入内存中,再将控制权交给setup。&nbsp;<BR>##这几步内容主要参照一个台湾同胞写的文档,setup.s的内容希望有人补充。&nbsp;<BR> &nbsp;<BR> &nbsp;<BR>start_kernel()&nbsp;<BR>当核心被载入后,首先进入的函数就是start_kernel。&nbsp;<BR>./init/main.c&nbsp;中函数start_kernel包含核心的启动过程及顺序。&nbsp;<BR>通过它来看核心整个初始化过程。&nbsp;<BR>首先进行一系列初始化,包括:&nbsp;<BR>trap_init();&nbsp;##./arch/i386/kernel/traps.c&nbsp;陷入&nbsp;<BR>init_IRQ();&nbsp;##./arch/i386/kernel/irq.c&nbsp;setup&nbsp;IRQ&nbsp;<BR>sched_init();&nbsp;##./kernel/sched.c&nbsp;调度初始化,并初始化bottom_half&nbsp;<BR>time_init();&nbsp;##./arch/i386/kernel/time.c&nbsp;<BR>init_modules();&nbsp;##模块初始化&nbsp;<BR>mem_init(memory_start,memory_end);&nbsp;<BR>buffer_init();&nbsp;##&nbsp;./fs/buffer.c&nbsp;缓冲区&nbsp;<BR>sock_init();&nbsp;##&nbsp;./net/socket.c&nbsp;socket初始化,并初始化各协议(TCP等)&nbsp;<BR>ipc_init();&nbsp;<BR>sysctl_init();&nbsp;<BR>然后通过调用kernelthread()产生init进程,全权交由init进程处理。调用cpu_idle(N&nbsp;<BR>ULL)休息。&nbsp;<BR>感兴趣又有时间的同志可以写一个startkernel()函数的详细分析报告。&nbsp;<BR> &nbsp;<BR> &nbsp;<BR> &nbsp;<BR>下面看一看init进程的工作:&nbsp;<BR>首先创建进程&nbsp;<BR>bdflush&nbsp;##./fs/buffer.c&nbsp;缓冲区管理&nbsp;<BR>和kswapd&nbsp;##./mm/vmscan.c&nbsp;虚拟内存管理&nbsp;<BR>这两个进程非常重要&nbsp;<BR>系统初始化(系统调用setup)&nbsp;<BR>系统初始化包含设备初始化及各文件系统初始化。&nbsp;<BR>sys_setup&nbsp;(./fs/filesystems.c)&nbsp;<BR>|&nbsp;<BR>|-device_setup&nbsp;<BR>|&nbsp;|&nbsp;<BR>|&nbsp;--&nbsp;chr_dev_init();&nbsp;##字符设备&nbsp;<BR>|&nbsp;blk_dev_init();&nbsp;##块设备&nbsp;<BR>|&nbsp;scsi_dev_init();&nbsp;##SCSI&nbsp;<BR>|&nbsp;net_dev_init();&nbsp;##网络设备&nbsp;<BR>|&nbsp;console_map_init();&nbsp;##控制台&nbsp;<BR>|-binfmt_setup();&nbsp;<BR>|-init_nls()&nbsp;##各文件系统初始化&nbsp;<BR>|-init_ext_fs()&nbsp;<BR>|-init_ext2_fs()&nbsp;<BR>.&nbsp;.&nbsp;<BR>.&nbsp;.&nbsp;<BR>.&nbsp;.&nbsp;<BR>|-init_autofs_fs()&nbsp;<BR>--mount_root()&nbsp;##mount&nbsp;root&nbsp;fs&nbsp;<BR>##从这儿看看设备及文件的初始化顺序,加入我们的设备时就有了大局观。&nbsp;<BR>执行/etc/rc&nbsp;(&nbsp;rc.sysinit,&nbsp;rc.local,&nbsp;rc.#&nbsp;)&nbsp;和&nbsp;<BR>执行/bin/sh&nbsp;<BR>______________________________________________________&nbsp;<BR>END&nbsp;<BR> &nbsp;<BR> &nbsp;<BR> &nbsp;<BR>&nbsp;<BR>--&nbsp;<BR>※&nbsp;来源:·BBS&nbsp;水木清华站&nbsp;bbs.net.tsinghua.edu.cn·[FROM:&nbsp;162.105.17.237]&nbsp;<BR><CENTER><H1>BBS水木清华站∶精华区</H1></CENTER></BODY></HTML>

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -