您好,欢迎访问三七文档
Linux复习提纲1、各次作业,另行总结2、Linux的创始人和创始时间1991年11月,LinusTorvalds写了一个小程序,放到互联网上,取名Linux,并希望能发展成一个系统。这完全是一个偶然事件。1993年,在一群高水平黑客的参与下,诞生了Linux1.0版本1994年,Linux的第一个商业版本发行,取名为slackware。3、标准Linux和uClinux在内存管理方面的差异是:1、标准Linux采用的是虚拟存储技术2、uClinux针对NOMMU(NO-MEMORYMAPPINGSUPPORT,不支持内核映射)4、Linux的内核版本号Linux内核采用的双树系统:一棵是稳定树,主要用于发行一棵是非稳定树或称开发树,用于产品开发和改进Linux内核版本号由3组数字组成R.X.YR代表主版本号,X代表版本类型的次版本号,若X是奇数表示是用于开发的实验版本,若是偶数表示是用于发布的稳定版本。Y为修改号,表示错误修改的次数。5、Linux的几个发行版本第一个是:Linuxpowered第二个是:Slackware第三个是:redhat第四个是:debian第五个是:ubuntu第六个是:openSUSE第七个是:mandriva6、堆栈的作用,并能画出函数调用在堆栈上形成的顺序的示意图堆栈是c语言程序在运行时必须的一个记录调用路径和参数的空间,其功能有:函数调用框架传递参数保存返回地址提供局部变量空间一个堆栈的示意图:7、为什么要用用户态和内核态之分假定不区分用户态和内核态,则用户可以:直接修改操作系统的数据直接调用操作系统的内部函数直接操作外设任意读/写物理内存这样就会对操作系统造成毁灭性的后果,使系统不能正常运转。因此要区分用户态和内核态,从而禁止用户直接和底层硬件打交道(一个典型的例子,如果用户程序往硬件寄存器写入不恰当的值,可能导致硬件不能正常运作)。禁止用户访问任意的物理内存(否则可能会破坏其他程序的正常执行,如果对核心内核所在的内存空间写入数据的话,可能导致系统崩溃)。8、什么是用户态和内核态,x86如何区分用户态和内核态,基于x86的Linux是如何区分用户态和内核态的(2种方法。)1、用户态和内核态:一般现代CPU都有几种不同的指令执行级别。在高执行级别下,代码可以执行特权指令,访问任意的物理内存,这种CPU执行级别对应的是内核态。而在相应的低级别执行状态下,代码的掌控范围会受到限制,只能在规定的范围内活动,这种CPU执行级别对应的是用户态。X86有四种不同的执行级别,Linux只用到了其中的两种0级和3级来分别代表内核态和用户态。2、如何区分用户态和内核态:CS寄存器的最低两位表明了当前代码的特权级,CPU读取每条指令都是通过CS:EIP这两个寄存器,其中cs是代码段选择器,eip是偏移量寄存器。这样通过比对cs的最低两位,CPU就知道了代码是用户态还是内核态的。上述判断都由硬件完成。3、Linux下如何区分:一般来说,地址空间是一个显著的标志:3G(0xc0000000)以上的地址空间只能在内核态下访问,0-3G的地址空间在两种状态下都可访问。(注意这里的地址空间是指逻辑地址空间,而不是物理地址空间。)9、程序编译过程gcc的编译过程:一般情况下,c语言程序的编译过程为:1.预处理2.编译成汇编代码3.汇编成目标代码4.链接arGcc产生的汇编文件代码,as(GNU汇编器)将其转换成二进制代码,并Ld:目标文件和归档文件的结合在一起Size:每一段的大小10、Ld设置入口点的命令:格式:ENTRY(symbol),设置symbol的值为执行程序的入口地址。ld有多种方法设置执行程序的入口点,确定程序入口点的顺序如下:1)ld命令的-e选项指定的值2)Entry(symbol)指定的值3)Text节点的起始地址4)入口点为0注:这个知识点,老师只是一带而过,没有很详细的说,看的我云里雾里,还是要返回到ppt中详细的看看这一节的内容。11、能说出Linux源代码中根目录下、arch目录下、include目录下的主要目录的内涵(不超出课堂讨论范围)1./include子目录内核头文件对每种支持的体系结构有相应的子目录,如asm-x862./init子目录包含了内核的初始化代码,是内核工作的开始的起点3./arch子目录包含了所有体系结构特定的内核代码4./kernel子目录包含了主内核代码5./mm子目录包含了所有内存管理代码6./fs子目录包含了所有文件系统的代码12、能说出Linux源代码编译后,生成的原始vmlinux的大概组成可看到vmlinux包含如下内容1)i386/kernel/head_32.S等+2)Init/main.c+init/version.o+3)CORE_FILES+DRIVERS+NETWOEKS+LIBS13、能说出从vmlinux--bzImage的变化过程1)在Linux内核源代码顶层目录下生成一个vmlinuxarch/x86/kernel/head_32.S....+init/main.c+.....2)compressed下的vmlinux为compressed/head_32.S+压缩后的顶层目录下的vmlinux3)boot下的bzImage为boot下header.S等(即setup.bin)+compressed/vmlinuxvmlinuz是可引导的、可压缩的内核镜像,vm代表VirtualMemory.Linux支持虚拟内存,因此得名vm.它是由用户对内核源码编译得到,实质是elf格式的文件.也就是说,vmlinux是编译出来的最原始的内核文件,未压缩.这种格式的镜像文件多存放在PC机上.bzImage的构建过程1.构建内核映像vmlinux根据vmLinux.lds链接脚本生成没有压缩的内核核心source-kernel-tree/vmLinux。2.vmlinux瘦身及压缩使用objcopy程序(GNU实用工具程序,作用是拷贝一个目标文件中内容到另一个目标文件中)删除vmLinux中包含的多余信息,去掉.note和.comment段,并加vmLinux转化成rawbinary(原始二进制)格式。使用gzip程序进行压缩生成vmLinux.bin.gz文件。最后使用ld(链接器)根据链接脚本source-kernel-tree/arch/i386/boot/compressed/vmLinux.src将压缩生成的vmLinux.bin.gz转换成可连接、可重定位格式的piggy.o文件。piggy.o文件格式是elf(excutivelinkedfile),其中包含了经过压缩的系统核心,在内核引导转载过程中会进行解压缩以获得可执行的二进制文件。3.构建包含解压缩代码的vmlinux映像使用ld将包含压缩的内核核心的文件piggy.o与同一目录下(source-kernel-tree/arch/i386/boot/compressed/)的head.o、misc.o文件链接生成新的文件vmLinux。其中,head.o文件包含的汇编代码用于为调用解压缩程序设置调用参数和解压缩过程中使用的堆、栈;misc.o文件包含zlib算法的解压缩代码的C语言实现。然后调用misc.o中的解压缩代码将压缩的内核进行解压,最终生成压缩的vmlinux映像-vmLinux。4.新生成的vmlinux再次瘦身通过objcopy程序删除上一步生成的vmLinux映像中多余信息,去掉.note和.comment段,专程rawbinary格式-vmLinux.bin。5.构建内核映像bzImage这一步中使用内核源代码中提供的内核映像构建工具build将bootsect、setup、vmlinux.bin三个文件一次存放到新建的bzImage文件中。build工具首先判断bootsect是否为有效的引导扇区(大小是够为512B,最后两字节的值是否为55AA),是的话就存放到bzImage文件中。然后填充setup,将不足一个扇区的部分用0填充,复制vmLinux.bin到setup后面。按照setuo、vmLinux.bin实际所占扇区数和大小更改bootsect中相应的内容,使得bzImage[497]=bootsect所占扇区数,bz[500,501]=vmLinux所占扇区数。系统启动过程中会使用这些信息。【内存管理】最终会生成bzImage映像。14、bzImage中b和z的含义z代表压缩;b代表大内核15、什么是硬盘的MBR硬盘的第一个扇区:主引导记录MBR:MasterBootRecordMBR存储该硬盘的分区表+一小段引导程序(LILO、Grub)这个引导程序用来装载OS所在分区的第一个扇区(bootloader)的内容到RAM中这个引导程序可以被替换16、说出从PC加电到硬盘启动到Linux的经典过程1)上电复位,在cpu的引脚上产生一个逻辑值2)进入到BIOS中进行检测,初始化设备,把第一个扇区的内容拷贝到0x7c003)bootloader启动,并将内核映像的第一个512字节拷贝到0x900004)setup函数从0x90200开始存入ram,启动。initrd解压后在内存中启动引导根目录所在的磁盘进行只读挂载内核在grub的引导下解压载入内存,内核随即进行硬件探测、驱动程序初始化,然后引导initrd解压载入,initrd其实就是一个小型的linux系统它的作用是将在lvm或raid上根文件系统进行只读性挂载。5)运行/sbin/init对系统进行初始化IOS开机自检,按BIOS中设置的启动设备(通常是硬盘)启动,接着启动设备上安装的引导程序lilo或grub开始引导Linux,Linux首先进行内核的引导,接下来执行init程序,init程序调用了rc.sysinit和rc等程序,rc.sysinit和rc当完成系统初始化和运行服务的任务后,返回init;init启动了mingetty后,打开了终端供用户登录系统,用户登录成功后进入了Shell,这样就完成了从开机到登录的整个启动过程。硬盘上第0磁道第一个扇区被称为MBR,也就是MasterBootRecord,即主引导记录,它的大小是512字节,别看地方不大,可里面却存放了预启动信息、分区表信息。系统找到BIOS所指定的硬盘的MBR后,就会将其复制到0×7c00地址所在的物理内存中。当MBR被加载到RAM中之后,BIOS就会将控制权交给MBR。其实被复制到物理内存的内容就是BootLoader,而具体到你的电脑,那就是lilo或者grub了。在单一的MBR中只能存储一个操作系统的引导记录,所以当需要多个操作系统时就会出现问题。所以需要更灵活的引导加载程序。当内核映像被加载到内存后,内核阶段就开始了。内核映像并不是一个可执行的内核,而是一个压缩过的内核映像。通常它是一个zImage(压缩映像,小于512KB)或bzImage(较大的压缩映像,大于512KB),它是提前使用zlib进行压缩的。在这个内核映像前面是一个例程,它实现少量硬件设置,并对内核映像中包含的内核进行解压,然后将其放入高端内存中,如果有初始RAM磁盘映像,就会将它移动到内存中,并标明以后使用。然后此例程会调用内核,并开始启动内核引导的过程。根据grub设定的内核映像所在路径,系统读取内存映像,并进行解压缩操作。此时,屏幕一般会输出“UncompressingLinux”的提示。当解压缩内核完成后,屏幕输出“OK,bootingthekernel”。如果不知道要引导的内核的名称,只需使用/然后按下Tab键,就会显示内核和initrd映像列表。系统将解压后的内核放置在内存之中,并调用start_kernel()函数来启动一系列的初始化函数并初始化各种设备,完成Linux核心环境的建立。至此,Linux内核已经建立起来了,基于Linux的程序应该可以正常运行了。3)执行ini
本文标题:Linux复习提纲
链接地址:https://www.777doc.com/doc-4815678 .html