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

📄 1.html

📁 介绍linux下文件和设备编程
💻 HTML
📖 第 1 页 / 共 5 页
字号:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 3.2 Final//EN"><HTML><HEAD>   <META HTTP-EQUIV="Content-Type" CONTENT="text/html; charset=gb2312">   <META NAME="GENERATOR" CONTENT="《良友》v2.1, 作者:安富国,http://winking.126.com">   <TITLE>启动</TITLE></HEAD><BODY style="font-family: 宋体; font-size: 9pt">&nbsp;<CENTER><TABLE CELLSPACING=10 CELLPADDING=10 WIDTH="60%" BGCOLOR="#FFB693" ><TR><TD ALIGN=CENTER><FONT SIZE=+2><!--标题由此开始-->启动</TD></TR></TABLE></CENTER><p><h3>目       录</h3><!--目录由此开始--><A NAME="Content" ID="Content"></A><OL><LI><A HREF="#I24">启动</A></LI><OL><LI><A HREF="#I25">开机简述</A></LI><LI><A HREF="#I26">启动过程跟踪</A></LI><LI><A HREF="#I27">lilo</A></LI><OL><LI><A HREF="#I28">lilo原理</A></LI><LI><A HREF="#I29">man手册</A></LI><LI><A HREF="#I30">LILO配置</A></LI></OL><LI><A HREF="#I31">GRUB</A></LI><OL><LI><A HREF="#I32">下载并安装GRUB</A></LI><LI><A HREF="#I33">设备命名规则</A></LI><LI><A HREF="#I34">引导多系统</A></LI><LI><A HREF="#I35">实例</A></LI><LI><A HREF="#I36">菜单设置</A></LI><LI><A HREF="#I37">用户界面</A></LI><LI><A HREF="#I38">命令列表</A></LI></OL><LI><A HREF="#I39">init(for BSD)</A></LI><LI><A HREF="#I40">/etc/rc?.d目录和/etc/rc?文件</A></LI><LI><A HREF="#I41">/etc/inittab文件</A></LI><LI><A HREF="#I42">守候进程</A></LI><LI><A HREF="#I43">系统启动loader</A></LI><LI><A HREF="#I746">多系统安装</A></LI><OL><LI><A HREF="#I747">分配磁盘空间</A></LI><LI><A HREF="#I748">安装Linux</A></LI><LI><A HREF="#I749">进一步:NTloader引导双系统</A></LI></OL></OL></OL><hr><br><A NAME="I24" ID="I24"></A><center><b><font size=+2>启动</font></b></center><br>1. lilo<br>2. kernal<br>3. init 1/2/3/5<br>&nbsp;&nbsp; important files:<br>&nbsp;&nbsp;&nbsp; /etc/inittab<br>&nbsp;&nbsp;&nbsp; /etc/rc.d/...<br>4. xdm&nbsp; (graphics interface)<br>&nbsp;&nbsp; important file:<br>&nbsp;&nbsp;&nbsp; /etc/X11/xinit/xsession<br>&nbsp;&nbsp; It seemed that different distribution has differrent xsession.<br>5. see how&nbsp; /etc/X11/xinit/xsession is written.<br>&nbsp;&nbsp; some related files:<br>&nbsp;&nbsp; Xclients, xinitrc,<br>&nbsp;&nbsp; .xsession, .Xclients, .xinitrc<center><A HREF="#Content">[目录]</A></center><hr><br><A NAME="I25" ID="I25"></A><center><b><font size=+2>开机简述</font></b></center><br>&nbsp;&nbsp;&nbsp; 开机过程制的是从打开计算机电源直到LINUX显示用户登录画面的全过程。分析LINUX开机过程也是深入了解LINUX核心工作原理的一个很好的途径。在不同的计算机平台上,LINUX的开机过程稍有不同,本节以X386微机系统为例,介绍LINUX的开机过程。<p>1。开机自检<p>&nbsp;&nbsp;&nbsp; 在刚开机时,根据X386CUP的特性,代码段(CS,CODE SEGMENT)寄存器的值为全1,指令计数器(IP,INSTRUCTION POINTER)的值为全0,既CS=FFFF、IP=0000。这时CPU根据CS和IP 的值执行FFFF0H处的指令。由于FFFF0H已经到了基本内存的高地址顶端,所以,FFFF0H处的指令一般总是一个JMP指令,以便CPU能够跳到比较低的地址去执行那里的代码,这个地址通常是ROM BIOS 的入口地址。接着,ROM BIOS 进行开机自检,如检查内存,键盘等。在自检过程中,ROM BIOS会在上位内存(UMB,UPPERMEMORY BLOCK)中进行扫描,侃侃是否存在合法的设备控制卡ROM BIOS(如:SCSI卡上的ROM),如果有,就执行其中的一些初始化代码。最后,ROM BIOS 读取磁盘上的第一个扇区并将这个扇区的内存装入内存。<p>2。预引导<p>&nbsp;&nbsp;&nbsp; 假定硬盘是系统的启动磁盘。硬盘的第一扇区称为主引导记录(MBR, MASTER BOOTRECORD)。MBR 的长度为512字节。可分为两部分:第一部分为引导(PRE-BOOT)区,占了446个字节;第二部分为分区表(PARTITION PABLE),共有66个字节,记录硬盘的分区信息。预引导区的作用之一是找到标记为活动(ACTIVE)的分区,并将活动分区的引导区读入内存。<p>&nbsp;&nbsp;&nbsp; 如果用软盘启动计算机,ROM BIOS 读入的是软盘的引导区,既软盘的第一个扇区。<p>3。核心映像装入<p>&nbsp;&nbsp;&nbsp; 在LINUX系统中,人们通常把LILO(LINUX LOADER)放在MBR或某个分区的超级块(SUPERBLOCK)中。假定LILO在MBR中,读取MBR后,LILO就会被首先执行。此时,屏幕上出现“BOOT:”字样,接下来的工作是装入LINUX核心映像。如果LILO安装在某个分区的超级块中,通常还会有一个管理开机的程序,这个管理开机的程序负责读取LILO,进而进行核心映像的装入工作。<p>4。核心启动<p>&nbsp;&nbsp;&nbsp; 核心装入完毕后,CPU的控制权就交给了核心启动代码。此时,核心首先进行硬件的检测和设备驱动程序的初始化,然后运行INIT。INIT 是LINUX核心启动的第一个用户进程,其进程号为1,是系统其它用户进程的祖先。<p>5。系统初始化<p>&nbsp;&nbsp;&nbsp; INIT进程负责进行一系列系统初始化程序和脚本文件,/ETC/INITTAB中包含了INIT所做的所有工作。<p>6。等待用户登录<p>&nbsp;&nbsp;&nbsp; 系统初始化完毕后,INIT 切换到多用户模式,并为每一个虚拟控制台和川行终端启动一个GETTY进程。GETTY进程负责接受和检验用户的登录要求。<p>&nbsp;&nbsp;&nbsp; 至此,LINUX系统的启动工作全部完成。不同核心版本的LINUX 的启动过程有一定的差异,不同发行版本的LINUX 的启动也可能稍有不同,但基本过程是类似的。另外,在“BOOT:”后,利用“LINUX SINGLE”命令可以迫使LINUX进入单用户模式,除不要求用户登录和不启动虚拟终端以外,启动过程的其它部分也基本类似。<p><p><center><A HREF="#Content">[目录]</A></center><hr><br><A NAME="I26" ID="I26"></A><center><b><font size=+2>启动过程跟踪</font></b></center><br>&nbsp;&nbsp;&nbsp; 本文以Redhat 6.0 Linux 2.2.19 for Alpha/AXP为平台,描述了从开机到登录的 Linux 启动全过程。该文对i386平台同样适用。<p>一. Bootloader<br>&nbsp;&nbsp;&nbsp; 在Alpha/AXP平台上引导Linux通常有两种方法,一种是由MILO及其他类似的引导程序引导,另一种是由Firmware直接引导。MILO功能与i386平台的LILO相近,但内置有基本的磁盘驱动程序(如IDE、SCSI等),以及常见的文件系统驱动程序(如ext2,iso9660等), firmware有ARC、SRM两种形式,ARC具有类BIOS界面,甚至还有多重引导的设置;而SRM则具有功能强大的命令行界面,用户可以在控制台上使用boot等命令引导系统。ARC有分区(Partition)的概念,因此可以访问到分区的首扇区;而SRM只能将控制转给磁盘的首扇区。两种firmware都可以通过引导MILO来引导Linux,也可以直接引导Linux的引导代码。<p>&nbsp;&nbsp;&nbsp; “arch/alpha/boot”下就是制作Linux Bootloader的文件。“head.S”文件提供了对 OSF PAL/1的调用入口,它将被编译后置于引导扇区(ARC的分区首扇区或SRM的磁盘0扇区),得到控制后初始化一些数据结构,再将控制转给“main.c”中的start_kernel(), start_kernel()向控制台输出一些提示,调用pal_init()初始化PAL代码,调用openboot() 打开引导设备(通过读取Firmware环境),调用load()将核心代码加载到START_ADDR(见 “include/asm-alpha/system.h”),再将Firmware中的核心引导参数加载到ZERO_PAGE(0) 中,最后调用runkernel()将控制转给0x100000的kernel,bootloader部分结束。<p>&nbsp;&nbsp;&nbsp; “arch/alpha/boot/bootp.c”以“main.c”为基础,可代替“main.c”与“head.S” 生成用于BOOTP协议网络引导的Bootloader。<br>&nbsp;&nbsp;&nbsp; Bootloader中使用的所有“srm_”函数在“arch/alpha/lib/”中定义。<p>&nbsp;&nbsp;&nbsp; 以上这种Boot方式是一种最简单的方式,即不需其他工具就能引导Kernel,前提是按照 Makefile的指导,生成bootimage文件,内含以上提到的bootloader以及vmlinux,然后将 bootimage写入自磁盘引导扇区始的位置中。<p>&nbsp;&nbsp;&nbsp; 当采用MILO这样的引导程序来引导Linux时,不需要上面所说的Bootloader,而只需要 vmlinux或vmlinux.gz,引导程序会主动解压加载内核到0x1000(小内核)或0x100000(大内核),并直接进入内核引导部分,即本文的第二节。<p>对于I386平台<br>&nbsp;&nbsp;&nbsp; i386系统中一般都有BIOS做最初的引导工作,那就是将四个主分区表中的第一个可引导分区的第一个扇区加载到实模式地址0x7c00上,然后将控制转交给它。<p>&nbsp;&nbsp;&nbsp; 在“arch/i386/boot”目录下,bootsect.S是生成引导扇区的汇编源码,它首先将自己拷贝到0x90000上,然后将紧接其后的setup部分(第二扇区)拷贝到0x90200,将真正的内核代码拷贝到0x100000。以上这些拷贝动作都是以bootsect.S、setup.S以及vmlinux在磁盘上连续存放为前提的,也就是说,我们的bzImage文件或者zImage文件是按照bootsect,setup, vmlinux这样的顺序组织,并存放于始于引导分区的首扇区的连续磁盘扇区之中。<p>&nbsp;&nbsp;&nbsp; bootsect.S完成加载动作后,就直接跳转到0x90200,这里正是setup.S的程序入口。 setup.S的主要功能就是将系统参数(包括内存、磁盘等,由BIOS返回)拷贝到 0x90000-0x901FF内存中,这个地方正是bootsect.S存放的地方,这时它将被系统参数覆盖。以后这些参数将由保护模式下的代码来读取。<p>&nbsp;&nbsp;&nbsp; 除此之外,setup.S还将video.S中的代码包含进来,检测和设置显示器和显示模式。最后,setup.S将系统转换到保护模式,并跳转到0x100000(对于bzImage格式的大内核是 0x100000,对于zImage格式的是0x1000)的内核引导代码,Bootloader过程结束。<p>对于2.4.x版内核<br>&nbsp;&nbsp;&nbsp; 没有什么变化。<p>二.Kernel引导入口<p>&nbsp;&nbsp;&nbsp; 在arch/alpha/vmlinux.lds的链接脚本控制下,链接程序将vmlinux的入口置于 &quot;arch/alpha/kernel/head.S&quot;中的__start上,因此当Bootloader跳转到0x100000时, __start处的代码开始执行。__start的代码很简单,只需要设置一下全局变量,然后就跳转到start_kernel去了。start_kernel()是&quot;init/main.c&quot;中的asmlinkage函数,至此,启动过程转入体系结构无关的通用C代码中。<p><br>对于I386平台<br>&nbsp;&nbsp;&nbsp; 在i386体系结构中,因为i386本身的问题,在&quot;arch/alpha/kernel/head.S&quot;中需要更多的设置,但最终也是通过call SYMBOL_NAME(start_kernel)转到start_kernel()这个体系结构无关的函数中去执行了。<p>&nbsp;&nbsp;&nbsp; 所不同的是,在i386系统中,当内核以bzImage的形式压缩,即大内核方式(__BIG_KERNEL__)压缩时就需要预先处理bootsect.S和setup.S,按照大核模式使用$(CPP) 处理生成bbootsect.S和bsetup.S,然后再编译生成相应的.o文件,并使用 &quot;arch/i386/boot/compressed/build.c&quot;生成的build工具,将实际的内核(未压缩的,含 kernel中的head.S代码)与&quot;arch/i386/boot/compressed&quot;下的head.S和misc.c合成到一起,其中的head.S代替了&quot;arch/i386/kernel/head.S&quot;的位置,由Bootloader引导执行(startup_32入口),然后它调用misc.c中定义的decompress_kernel()函数,使用 &quot;lib/inflate.c&quot;中定义的gunzip()将内核解压到0x100000,再转到其上执行 &quot;arch/i386/kernel/head.S&quot;中的startup_32代码。<p>对于2.4.x版内核<br>&nbsp;&nbsp;&nbsp; 没有变化。<p>三.核心数据结构初始化--内核引导第一部分<br>&nbsp;&nbsp;&nbsp; start_kernel()中调用了一系列初始化函数,以完成kernel本身的设置。这些动作有的是公共的,有的则是需要配置的才会执行的。<p>在start_kernel()函数中,<p>&nbsp;&nbsp;&nbsp; &middot;输出Linux版本信息(printk(linux_banner))<br>&nbsp;&nbsp;&nbsp; &middot;设置与体系结构相关的环境(setup_arch())<br>&nbsp;&nbsp;&nbsp; &middot;页表结构初始化(paging_init())<br>&nbsp;&nbsp;&nbsp; &middot;使用&quot;arch/alpha/kernel/entry.S&quot;中的入口点设置系统自陷入口(trap_init())<br>&nbsp;&nbsp;&nbsp; &middot;使用alpha_mv结构和entry.S入口初始化系统IRQ(init_IRQ())<br>&nbsp;&nbsp;&nbsp; &middot;核心进程调度器初始化(包括初始化几个缺省的Bottom-half,sched_init())<br>&nbsp;&nbsp;&nbsp; &middot;时间、定时器初始化(包括读取CMOS时钟、估测主频、初始化定时器中断等,time_init())<br>&nbsp;&nbsp;&nbsp; &middot;提取并分析核心启动参数(从环境变量中读取参数,设置相应标志位等待处理,(parse_options())<br>&nbsp;&nbsp;&nbsp; &middot;控制台初始化(为输出信息而先于PCI初始化,console_init())<br>&nbsp;&nbsp;&nbsp; &middot;剖析器数据结构初始化(prof_buffer和prof_len变量)<br>&nbsp;&nbsp;&nbsp; &middot;核心Cache初始化(描述Cache信息的Cache,kmem_cache_init())<br>&nbsp;&nbsp;&nbsp; &middot;延迟校准(获得时钟jiffies与CPU主频ticks的延迟,calibrate_delay())<br>&nbsp;&nbsp;&nbsp; &middot;内存初始化(设置内存上下界和页表项初始值,mem_init())<br>&nbsp;&nbsp;&nbsp; &middot;创建和设置内部及通用cache(&quot;slab_cache&quot;,kmem_cache_sizes_init())<br>&nbsp;&nbsp;&nbsp; &middot;创建uid taskcount SLAB cache(&quot;uid_cache&quot;,uidcache_init())<br>&nbsp;&nbsp;&nbsp; &middot;创建文件cache(&quot;files_cache&quot;,filescache_init())<br>

⌨️ 快捷键说明

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