当前位置:文档之家› Linux系统中虚拟文件系统内核机制研究

Linux系统中虚拟文件系统内核机制研究

Linux系统中虚拟文件系统内核机制研究
Linux系统中虚拟文件系统内核机制研究

第33卷第1期陕西师范大学学报(自然科学版)2005年3月JournalofShaanxiNonTlalUniversity(NaturalScienceEdition)V01.33No.1Mar.2005

文章编号:1672—4291(2005)01.0029—04

Linux系统中虚拟文件系统内核机制研究

史芳丽,周亚莉

(西安交通大学经济与金融学院;管理学院,陕西西安710061)

摘要:针对Linux操作系统强大的多物理文件系统管理性能,从Linux的内核文件管理机制——虚拟文件系统(VFS)出发,对Linux系统如何识别和管理不同的物理文件系统进行了研究,剖析了Linux文件系统中一个物理文件系统的安装与注册、VFS的产生,以及通过VFS来管理和访问物理文件系统的内核工作机制.

关键词:虚拟文件系统;超级块;文件系统;安装;注册;访问

中图分类号:TP316.81文献标识码:A

VFSkernelmechanisminLinuxsvstem

SHIFang—Ii,ZHOUYa—li

(SchOOlofEconomicsandFinance;Sch∞lofManagement,

Xi7anJiaotongUniversity,Xi7an710061,Shaanxi,China)Abstract:AsfOrmanyfilesystemmanagingperfonTlanceofLinuxoperatingsystem,thequestionwhatidentifyandmanagedifferentphysicalfilesystemsofLinuxsystemthroughkemelfilemanagingworkinmechanismofLinux——virtualfilesystemarediscussed.TheinstallationandregistrationofanphysicalsystemandproductionofVFSand

kernelworkingmechanismofmanagingandacceSSingthroughVFSphysical矗lesysteminLinuxdeeplyareanalyzed.

Keywords:virtualfilesystem(VFS);superblock;filesystem;installation;registration;accessMRSubjectclassification:68N25

Linux操作系统的一个重要特点是它能够支持如Ext2、FAT、VFAT、FAT32、MINIx等许多不同类型的物理文件系统.文献[1~4]和文献[5]对Linux文件系统的优良性能和使用进行了研究,文献[6]对Linux核心可抢占性方法进行了研究,但没有从Linux的系统内核分析和研究如何实现多物理文件系统的管理与访问.本文在参考文献的基础上,研究和提出从内核如何建立虚拟文件系统(VirtualFileSystem,VFS)开始,到一个物理文件系统如何安装、注册和拆卸,如何通过VFS来管理和访问物理文件系统等方面的内核工作机制.1虚拟文件系统的工作机制

1.1V邢的内涵

“nux支持各种不同的文件系统是通过VFS实现的,不同的物理文件系统具有不同的组织结构和不同的处理方式,为了能够处理各种不同的物理文件系统,操作系统必须把它们所具有的特性进行抽象,并建立一个面向各种物理文件系统的转换机制,通过这个转换机制,把各种不同物理文件系统转换为一个具有统一共性的虚拟文件系统.VFS实际上向Linux内核和系统中运行的进程提供了一个处

收稿日期:20041012

基金项目:国家自然科学基金资助项目(70273034)

作者简介:史芳丽(1963一),女,陕西富平人,西安交通大学副教授,博士研究生万方数据

陕西师范大学学报(自然科学版)第33卷

理各种物理文件系统的公共接口,通过这个接口使得不同的物理文件系统看来都是相同的.VFS和各种物理文件系统组成了如图1所示的Linux文件系统.VFS并不是一种物理的文件系统,它仅是一套转换机制,它在系统启动时建立,在系统关闭时消失,并且仅存在于内存空间.所以,VFS并不具有一般物理文件系统的实体.在VFs提供的接口中包含向各种物理文件系统转换用的一系列数据结构,如V】玛超级块、V】玛的in。de等,同时还包含对不同物理文件系统进行处理的各种操作函数的转换人口.

fvFsI

中申申

lBuffercacheI

殳备驱动程序l???

图1Lin呱文件系统

Fig.1Linuxfilesyst哪

!.2VFS超级块与Ext2超级块

VFS超级块是在文件系统安装时由系统在内存中建立的,对于每个已安装的文件系统,在内存中都有与其对应的VFs超级块.VFS超级块的作用是把在各种文件系统中表示整体组织结构的信息转换成统一的格式.各种文件系统的VFS超级块都是一个super.block结构体,VFS超级块super_block结构体的定义在/include/fs/fs.h中.各文件系统VFS超级块中各成员的数据则来自该文件系统本身的管理信息结构.这些数据是在文件系统安装时,由读超级块例程read—super()把某种文件系统的管理信息写入它的VFS超级块中.VFS超级块主要包含的信息有:文件系统的组织信息、文件系统的注册和安装信息、超级块的属性信息,不同物理文件系统特有的信息则由联合体u的各个成员项表示,指向super-operations结构体中包含着对超级块进行操作的函数指针等.而对于物理文件系统Ext2,其超级块是用来描述Ext2文件系统整体信息的数据结构,主要描述文件在逻辑分区中的静态分布情况,以及描述文件系统的各种组成结构的尺寸、数量等信息.1.3VFSinode与Ext2inode

在进程使用一个文件时,无论是哪种文件系统

的文件,首先需要打开这个文件.在文件打开时,系统就在内存中建立该文件的VFSinode,VFSinode占用的是内存空问,而且只是当前正在使用的活动文件才有VFSinode.VFSinOde的作用是把不同文件系统的活动文件的管理信息,如文件类型、文件尺寸、文件位置等转换成统一的格式,VFSinode结构定义在/include/fs.h中.它除了包括Ext2inode中的若干静态管理信息外,又增加了许多文件的动态管理信息,如设备标识符、索引节点编号(表明一个VFsinode惟一地对应一个文件)、在联合体u中的各个成员项给出了不同文件系统的个性信息、锁定标志、VFSinode的双向链表指针,指向一组函数的指针等.

而Ext2文件系统中的inode是Ext2文件系统的基本目录,它是组成文件系统的基本构件.inode表示Ext2文件系统树型结构的节点,每一个节点对应一个inode.在Ext2文件系统树型结构中~个节点是一个文件或目录,所以inOde是描述文件或目录的信息体.Ext2文件系统中的每个文件由一个inode描述,且只能由一个inode描述.无论是普通文件还是目录文件、设备文件、符号链接文件、FIFO文件都有对应的inOde.Ext2文件系统的inode的作用是记录与文件管理有关的各种静态信息,如文件的类型和访问权限、文件的尺寸、文件的位置、文件的时间信息等.

2文件系统的安装与注册

2.1文件系统的安装

为了使某种物理文件系统能够在Linux系统中使用,必须把它们安装到“nux的文件系统中,并且要注册到系统内核.为此,Linux文件系统设置了安装和注册文件系统的数据结构,以及安装、注册文件系统的命令和函数.用于安装和注册文件系统的数据结构和函数都属于VFS的组成部分.但是要安装的文件系统必须已经存在于外存磁盘空间上,每个文件系统都有一个独立的磁盘分区,并且具有各自的树型层次结构.文件系统的安装就是利用“nux的模块特性,把文件系统作为可装卸模块纳入Linux文件系统中,使其成为Linux文件系统的一部分.如果文件系统建于内核中,则在系统引导时安装与注册该文件系统;如果文件系统作为内核可装载的模块,则实际安装某个文件系统时进行注册,在不需要时卸载.

由于Ext2是Linux的标准文件系统,所以在系

万方数据

第l期史芳丽等:Linux系统中虚拟文件系统内核机制研究31

统启动时自动把Ext2文件系统的磁盘分区作为Linux文件系统的根文件系统,即Ext2的树型层次结构就成为Linux系统文件的基本结构.Ext2以外的文件系统则安装在根文件系统下的某个目录下,成为系统树型结构中的一个分枝.Linux文件系统的树型层次结构中用于安装其它文件系统的目录称为安装点或安装目录.

当mount命令安装一个物理文件系统时,Linux系统中已安装的文件系统用一个vfsmount结构进行描述,它在/include几inux/Hlount.h中定义.该结构体中包含着对已安装的物理文件系统的管理信息,如指出文件系统所在设备的属性、安装点的目录名、文件系统VFS超级块的指针等.系统中所有已安装文件系统的各个vfSmount结构体使用其成员项mnt—next组成一个链表,称为物理文件系统链表,如图2所示.

!“““一…13““1。!一Vfsmount.Vfsmount

Vfsmntlist—mntdevmntdev

mm—deVnamemm—deVname

mm—dirnamemm—dirname

mm—flagsmnt—flags

mntsbmntsb

mntneXtmntneXt

vfsmount

图2vfsI珊岫t多链表结构

Fig.2

Str眦tureofVfsⅡlo岫tm粕ylinkedIist

2.2安装命令的内部工作过程

用户(一般是啪t)在安装文件系统时,要指定三种信息:文件系统的名称、包含文件系统的物理块设备和文件系统在已有文件系统中的安装点.例如:#mount—tmsdos/dev/hdc/mnt/usr其中msdoS是要安装的文件系统类型,/dev/hdc是文件系统所在的设备,/mnt/usr是安装点.VFS对上述命令的执行过程如下:

(1)寻找对应的文件系统信息,VFS通过file—systems在file—system—type组成的链表中根据指定的文件系统名称搜索文件系统类型信息.

(2)如果在上述链表中找到匹配的文件系统,则说明内核具有对该文件系统的内建支持.否则,说明该文件系统可能由可装载模块支持,VFs会请求内核装入相应原文件系统模块,此时,该文件系统在VFS中注册并初始化.

(3)不管是哪种情况,如果VFS无法找到指定的文件系统,则返回错误.

(4)VFS检验指定的物理块设备是否已经安装.如果指定的块设备已被安装,则返回错误.(5)Ⅵ玛查找作为新文件系统安装点目录的V】强索引节点,该V】玛索引节点可在索引节点高速缓存中,也有可能需要从安装点所在的块设备中读取.

(6)如果该安装点已经安装有其它文件系统,则返回错误.因为同一目录只能同时安装一个文件系统.

(7)VFS安装代码为新的文件系统分配超块,并将安装信息传递给该文件系统的超块读取例程.(8)文件系统的超块读取例程将对应文件系统的信息映射到VFS超块中.如果在此过程中发生错误,则返回错误.

(9)如果成功安装,则所有已安装的文件系统形成图2所示的数据结构.

2.3文件系统的注册

Linux为了能够对安装在系统中的各种物理文件进行管理,物理文件系统在安装后还必须向系统内核注册.文件系统卸载后还需要进行注销.向系统内核注册也有两种方式:一种是在编译核心系统时确定,并在系统初始化时通过内嵌的函数调用向注册表登记;另一种则利用“nux的模块(module)特征,把某个文件系统当作一个模块.装入该模块时(通过kerneld或用insmod命令)向注册表登记它的类型,卸装该模块时则从注册表注销.系统把每个已注册的文件系统登记在一个file—system—type结构体中,所有已注册文件系统的file—system—type结构体组成一个链表,称为注册链表,如图3所示.各种文件系统的注册是通过内核提供的文件系统初始化函数实现的,对不同文件系统使用不同的

万方数据

32陕西师范大学学报(自然科学版)第33卷

初始化函数,如init_E)也一fS()是E)以文件系统初始化函数;i“t一耐nix-fS()是n】inix文件系统的初始化函数;init—n_l{jd盼fS()是nlsd吣文件系统初始化函数.

在各种文件系统初始化函数中,把该文件系统的注册结构体作为参数,调用由内核提供的文件注册函数repister—fileSsyStem().该函数的功能是把文件系统注册结构体加入到注册链表中,从而完成注册任务.如Ext2文件系统的初始化函数在/fs/Ext2/Super.c中定义如下:intinit—Ext2一fs(void)

returmregiste卜filesystem(&Ext2一fs—type);

该函数以Ext2文件系统的注册结构体Ext2一fs—type的首地址作为参数,调用register—filesyStem()函数.该函数的执行过程是在注册链表中从链首开始向后遍历,查看该文件系统是否已注册,若没有注册,则把该文件系统的注册结构体加到注册链表的链尾.

Ext2文什系统proc文件系统msdos文什系统

File—system卜.—-

Ext2readsuperprocreadsupermsdosreadsuDer

“Ext2”“prOc”“msdos”

lI1

next—neXt一neXt

图3文件系统的注册链表

Fig.3Re画strati帅linkedlistoffilesystem

3通过虚拟文件系统访问

Ext2中的文件

当进程访问某一个物理文件系统的文件时,并不直接访问该物理文件系统,而是通过VFS访问它在内存中的VFS超级块和inode,获得文件系统和文件的管理信息,然后使用这些信息访问磁盘上的文件.

由于不同文件系统对文件操作的函数不同,所以VFS中设置了公共的操作函数接口.当进程向系统发出文件操作的请求时,该文件可以是某个物理文件系统中的一个文件,内核将通过VFS公共的操作接口转换到该文件系统的相应操作函数.在操作

J访问Exl2J

I超级块flf蒜的inodeIl转换入口f

Ext2文什系统

超级块块描述符Openclose

块位幽inode位幽Readwrite

inode表数据区Delete…

文件组织操作函数

图4由vFs实现转换的示意图

Fig.4Sketchmap0ftr锄sfonnbyV礴

函数执行过程中,对文件的搜索、定位等则是通过VFS超级块和inode得到该文件相应的管理数据.这样,进程通过VFS接口就可以访问各种不同的物理文件系统.VFS的功能及其工作原理,可以通过进程访问不同物理文件系统的过程来说明.图4给出了进程访问Ext2文件系统时,经VFS实现转换的示意图.

参考文献:

[1]linux文件系统[EB/oL].http://yanjin415.go.neaSe.net.2004.

[2]M。sheBar.Linux文件系统[M].天宏工作室译.北京:清华大学出版社,2003.

[3]Linux的文件系统[EB/oL].http://、ww.ironwareinfo.conl.cn,2004.

[4]文件系统[EB/oL].http://、ww.todayhero.net,2004.[5]EviNemeth,GarthSnyder,TrentRHein.Linux系统管理技术手册[M].张辉译.北京:人民邮电出版社,2004.53~66.113~152.

[6]杜聪,徐志伟.oOsM()S文件系统的性能分析[J].计算机学报,200l,(7):702~709.

[7]赵慧斌,李小群,孙玉芳.改善Linux核心可抢占性方法的研究与实现[J].计算机学报,2004,(2):244~251.[8]徐德民.操作系统原理“l?ux篇[M].北京:国防工业出版社,2004.252~283.

[9]张丽芬,刘美华.操作系统原理教程[M].北京:电子工业出版社,2004.277~310.

[责任编辑张惠民]

万方数据

LINUX文件系统制作详细

Linux文件系统制作流程 关键词:ARM Linux yaffs文件系统移植 Linux文件系统简介 Linux支持多种文件系统,包括ext2、ext3、vfat、ntfs、iso9660、jffs、romfs和nfs等,为了对各类文件系统进行统一管理,Linux引入了虚拟文件系统VFS(Virtual File System),为各类文件系统提供一个统一的操作界面和应用编程接口。 Linux下的文件系统结构如下: Linux启动时,第一个必须挂载的是根文件系统;若系统不能从指定设备上挂载根文件系统,则系统会出错而退出启动。之后可以自动或手动挂载其他的文件系统。因此,一个系统中可以同时存在不同的文件系统。 不同的文件系统类型有不同的特点,因而根据存储设备的硬件特性、系统需求等有不同的应用场合。在嵌入式Linux应用中,主要的存储设备为RAM(DRAM,

SDRAM)和ROM(常采用FLASH存储器),常用的基于存储设备的文件系统类型包括:jffs2,yaffs,cramfs,romfs,ramdisk,ramfs/tmpfs等。 >基于FLASH的文件系统 Flash(闪存)作为嵌入式系统的主要存储媒介,有其自身的特性。Flash的写入操作只能把对应位置的1修改为0,而不能把0修改为1(擦除Flash就是把对应存储块的内容恢复为1),因此,一般情况下,向Flash写入内容时,需要先擦除对应的存储区间,这种擦除是以块(block)为单位进行的。 闪存主要有NOR和NAND两种技术(简单比较见附录)。Flash存储器的擦写次数是有限的,NAND闪存还有特殊的硬件接口和读写时序。因此,必须针对Flash 的硬件特性设计符合应用要求的文件系统;传统的文件系统如ext2等,用作Flash的文件系统会有诸多弊端。 在嵌入式Linux下,MTD(Memory Technology Device,存储技术设备)为底层硬件(闪存)和上层(文件系统)之间提供一个统一的抽象接口,即Flash的文件系统都是基于MTD驱动层的(参见上面的Linux下的文件系统结构图)。使用MTD 驱动程序的主要优点在于,它是专门针对各种非易失性存储器(以闪存为主)而设计的,因而它对Flash有更好的支持、管理和基于扇区的擦除、读/写操作接口。 顺便一提,一块Flash芯片可以被划分为多个分区,各分区可以采用不同的文件系统;两块Flash芯片也可以合并为一个分区使用,采用一个文件系统。即文件系统是针对于存储器分区而言的,而非存储芯片。 1.jffs2 JFFS文件系统最早是由瑞典Axis Communications公司基于Linux2.0的内核为嵌入式系统开发的文件系统。JFFS2是RedHat公司基于JFFS开发的闪存文件系统,最初是针对RedHat公司的嵌入式产品eCos开发的嵌入式文件系统,所以JFFS2也可以用在Linux,uCLinux中。 Jffs2:日志闪存文件系统版本2(Journalling Flash FileSystem v2) 主要用于NOR型闪存,基于MTD驱动层,特点是:可读写的、支持数据压缩的、基于哈希表的日志型文件系统,并提供了崩溃/掉电安全保护,提供“写平衡”支持等。缺点主要是当文件系统已满或接近满时,因为垃圾收集的关系而使jffs2的运行速度大大放慢。 目前jffs3正在开发中。关于jffs系列文件系统的使用详细文档,可参考MTD补丁包中mtd-jffs-HOWTO.txt。 jffsx不适合用于NAND闪存主要是因为NAND闪存的容量一般较大,这样导致jffs为维护日志节点所占用的内存空间迅速增大,另外,jffsx文件系统在

Linux内核崩溃原因分析及错误跟踪技术

Linux内核崩溃原因分析及错误跟踪技术 随着嵌入式Linux系统的广泛应用,对系统的可靠性提出了更高的要求,尤其是涉及到生命财产等重要领域,要求系统达到安全完整性等级3级以上[1],故障率(每小时出现危险故障的可能性)为10-7以下,相当于系统的平均故障间隔时间(MTBF)至少要达到1141年以上,因此提高系统可靠性已成为一项艰巨的任务。对某公司在工业领域14 878个控制器系统的应用调查表明,从2004年初到2007年9月底,随着硬软件的不断改进,根据错误报告统计的故障率已降低到2004年的五分之一以下,但查找错误的时间却增加到原来的3倍以上。 这种解决问题所需时间呈上升的趋势固然有软件问题,但缺乏必要的手段以辅助解决问题才是主要的原因。通过对故障的统计跟踪发现,难以解决的软件错误和从发现到解决耗时较长的软件错误都集中在操作系统的核心部分,这其中又有很大比例集中在驱动程序部分[2]。因此,错误跟踪技术被看成是提高系统安全完整性等级的一个重要措施[1],大多数现代操作系统均为发展提供了操作系统内核“崩溃转储”机制,即在软件系统宕机时,将内存内容保存到磁盘[3],或者通过网络发送到故障服务器[3],或者直接启动内核调试器[4]等,以供事后分析改进。 基于Linux操作系统内核的崩溃转储机制近年来有以下几种: (1) LKCD(Linux Kernel Crash Dump)机制[3]; (2) KDUMP(Linux Kernel Dump)机制[4]; (3) KDB机制[5]; (4) KGDB机制[6]。 综合上述几种机制可以发现,这四种机制之间有以下三个共同点: (1) 适用于为运算资源丰富、存储空间充足的应用场合; (2) 发生系统崩溃后恢复时间无严格要求; (3) 主要针对较通用的硬件平台,如X86平台。 在嵌入式应用场合想要直接使用上列机制中的某一种,却遇到以下三个难点无法解决: (1) 存储空间不足 嵌入式系统一般采用Flash作为存储器,而Flash容量有限,且可能远远小于嵌入式系统中的内存容量。因此将全部内存内容保存到Flash不可行。

Linux文件系统剖析

2007 年12 月03 日 在文件系统方面,Linux? 可以算得上操作系统中的“瑞士军刀”。Linux 支持许多种文件系统,从日志型文件系统到集群文件系统和加密文件系统。对于使用标准的和比较奇特的文件系统以及开发文件系统来说,Linux 是极好的平台。本文讨论Linux 内核中的虚拟文件系统(VFS,有时候称为虚拟文件系统交换器),然后介绍将文件系统连接在一起的主要结构。 基本的文件系统体系结构 Linux 文件系统体系结构是一个对复杂系统进行抽象化的有趣例子。通过使用一组通用的API 函数,Linux 可以在许多种存储设备上支持许多种文件系统。例如,read 函数调用可以从指定的文件描述符读取一定数量的字节。read 函数不了解文件系统的类型,比如ext3 或NFS。它也不了解文件系统所在的存储媒体,比如AT Attachment Packet Interface(ATAPI)磁盘、Serial-Attached SCSI(SAS)磁盘或Serial Advanced Technology Attachment(SATA)磁盘。但是,当通过调用read 函数读取一个文件时,数据会正常返回。本文讲解这个机制的实现方法并介绍Linux 文件系统层的主要结构。 什么是文件系统? 首先回答最常见的问题,“什么是文件系统”。文件系统是对一个存储设备上的数据和元数据进行组织的机制。由于定义如此宽泛,支持它的代码会很有意思。正如前面提到的,有许多种文件系统和媒体。由于存在这么多类型,可以预料到Linux 文件系统接口实现为分层的体系结构,从而将用户接口层、文件系统实现和操作存储设备的驱动程序分隔开。

探究linux内核,超详细解析子系统

探究linux内核,超详细解析子系统 Perface 前面已经写过一篇《嵌入式linux内核的五个子系统》,概括性比较强,也比较简略,现在对其进行补充说明。 仅留此笔记,待日后查看及补充!Linux内核的子系统 内核是操作系统的核心。Linux内核提供很多基本功能,如虚拟内存、多任务、共享库、需求加载、共享写时拷贝(Copy-On-Write)以及网络功能等。增加各种不同功能导致内核代码不断增加。 Linux内核把不同功能分成不同的子系统的方法,通过一种整体的结构把各种功能集合在一起,提高了工作效率。同时还提供动态加载模块的方式,为动态修改内核功能提供了灵活性。系统调用接口用户程序通过软件中断后,调用系统内核提供的功能,这个在用户空间和内核提供的服务之间的接口称为系统调用。系统调用是Linux内核提供的,用户空间无法直接使用系统调用。在用户进程使用系统调用必须跨越应用程序和内核的界限。Linux内核向用户提供了统一的系统调用接口,但是在不同处理器上系统调用的方法

各不相同。Linux内核提供了大量的系统调用,现在从系统 调用的基本原理出发探究Linux系统调用的方法。这是在一个用户进程中通过GNU C库进行的系统调用示意图,系 统调用通过同一个入口点传入内核。以i386体系结构为例,约定使用EAX寄存器标记系统调用。 当加载了系统C库调用的索引和参数时,就会调用0x80软件中断,它将执行system_call函数,这个函数按照EAX 寄存器内容的标示处理所有的系统调用。经过几个单元测试,会使用EAX寄存器的内容的索引查system_call_table表得到系统调用的入口,然后执行系统调用。从系统调用返回后,最终执行system_exit,并调用resume_userspace函数返回用户空间。 linux内核系统调用的核心是系统多路分解表。最终通过EAX寄存器的系统调用标识和索引值从对应的系统调用表 中查出对应系统调用的入口地址,然后执行系统调用。 linux系统调用并不单层的调用关系,有的系统调用会由

Linux文件系统实验

实验编号与实验名称: 文件系统实验 实验目的: 熟悉文件和目录的基本操作;了解Linux的/proc文件系统 实验内容及要求(详见实验讲义与实验指导书): 内容: 1)在/usr目录下创建一个目录usr_test和文本文件test,并建立一个test文件的链接 test02。通过修改test文件中的内容查看test和test02中内容的情况,并分析原因。 2)编写程序,从/proc文件中抽取内核参数(任意的2个参数即可,如CPU时钟速度信 息等) 3)实现文件的拷贝,即把一个文件内容复制到另一个文件 要求: 对于内容1),给出操作步骤和结果分析,需回顾第二次实验中练习过的Shell命令和教材中的文件和目录操作系统调用 对于内容2)和3)给出完整C语言代码或者代码截图和代码执行结果,可参考本文件“实验预读”中相关内容和教材P.149/266图4-5相关代码 实验用到的软件(:) VMware 实验内容及关键步骤(代码)Q2(60分) 1)在/usr目录下创建一个目录usr_test和文本文件test,并建立一个test文件的链接 test02。通过修改test文件中的内容查看test和test02中内容的情况,并分析原因。

分析:在linux系统中通过link连接就可以通过第三方的查询,通过link函数后test01被绑定给test02中,所以可以通过test02去查询。 2.编写程序,从/proc文件中抽取内核参数(任意的2个参数即可,如CPU时钟速度信息等)

3.实现文件的拷贝,即把一个文件内容复制到另一个文件

实验过程中遇到的问题解决办法与实验体会Q3(10分)得分: 评阅教师特殊评语: 评阅教师: 日期:

linux内核IMQ源码实现分析

本文档的Copyleft归wwwlkk所有,使用GPL发布,可以自由拷贝、转载,转载时请保持文档的完整性,严禁用于任何商业用途。 E-mail: wwwlkk@https://www.doczj.com/doc/c0959076.html, 来源: https://www.doczj.com/doc/c0959076.html,/?business&aid=6&un=wwwlkk#7 linux2.6.35内核IMQ源码实现分析 (1)数据包截留并重新注入协议栈技术 (1) (2)及时处理数据包技术 (2) (3)IMQ设备数据包重新注入协议栈流程 (4) (4)IMQ截留数据包流程 (4) (5)IMQ在软中断中及时将数据包重新注入协议栈 (7) (6)结束语 (9) 前言:IMQ用于入口流量整形和全局的流量控制,IMQ的配置是很简单的,但很少人分析过IMQ的内核实现,网络上也没有IMQ的源码分析文档,为了搞清楚IMQ的性能,稳定性,以及借鉴IMQ的技术,本文分析了IMQ的内核实现机制。 首先揭示IMQ的核心技术: 1.如何从协议栈中截留数据包,并能把数据包重新注入协议栈。 2.如何做到及时的将数据包重新注入协议栈。 实际上linux的标准内核已经解决了以上2个技术难点,第1个技术可以在NF_QUEUE机制中看到,第二个技术可以在发包软中断中看到。下面先介绍这2个技术。 (1)数据包截留并重新注入协议栈技术

(2)及时处理数据包技术 QoS有个技术难点:将数据包入队,然后发送队列中合适的数据包,那么如何做到队列中的数

激活状态的队列是否能保证队列中的数据包被及时的发送吗?接下来看一下,激活状态的队列的 证了数据包会被及时的发送。 这是linux内核发送软中断的机制,IMQ就是利用了这个机制,不同点在于:正常的发送队列是将数据包发送给网卡驱动,而IMQ队列是将数据包发送给okfn函数。

linux文件系统的权限王国(一)

作者:池建强 在这个系列中和?大家聊聊 Linux 的?文件、?用户、?用户组、?文件系统的权限等内容,其中很多细节也是我使?用了很?长时间 Linux 后才真正掌握,希望?大家不?用那么久。 为什么是 Linux ?我觉得写技术的东?西还是相对严谨?一些好,虽然Unix 、Linux 、OS X ?一脉相承,但在具体命令上还是会有些差异,这个系列?文章?里所有的命令和显?示结果都是在 Linux 上进?行的,?大家可以对照在 Mac 上试试,当然最后也会讲?一点 OS X 的内容,否则怎么叫 MacTalk 呢? 在开始讲 Linux ?王国的?臣民之前,先介绍?一下?王国中最?牛的主:root ,这货不翻译为「根」,也不叫「管理员」,?而是被尊称为超级Linux ?文件系统的权限?王国(?一)

?用户,是不是觉得?高端霸?气?超级?二字绝不是恭维之词,从 Linux ?王国诞?生之初,root 就存在了,他会?一直霸占着超级?用户的?角?色并世世代代存在下去,没有禅让,没有民选,没有换位,所有的?用户都?自他?而起。如果你以为 root 会像上帝创造亚当和夏娃那样,让这?二位开开?心?心?生娃去了,那你就太Naive了。Linux 系统中的所有?用户要么由root 创建,要么借?用 root 的权限创建,等级极为森严,总之没有 root 的允许,想搞出?一位新?用户绝?无可能。看到这你们是不是都开始觉得计划?生育政策好啦? root 不仅能够管理?用户,还能管理?文件系统、进程、设备、??网络、通信、协议等等,总之他就像站在神?山上的神祗,俯视着芸芸众?生,看着数据信息在软件和硬件之间川流不息,时不时的做?一些计划性干预,如果有?人想超越系统的规则,他就能让你消失的像从来没有存在过。 所以那些成天叫嚣被蹂躏被代表的民众,看看 root,?大家?心理就会舒服?一些。 以 root 开篇,下?面我们聊聊 Linux 的?文件系统和索引节点。 Linux 的?文件系统本?身是?比较复杂的,仅 ext2、ext3 和 ext4 就得解释好?几天,本?文的重点不在于此,所以简单介绍?一下。?文件系统主要是?用来保存?文件和相关结构的,让?文件存储更安全、更快、更容易检索、能?支持更?大的物理介质等等。在 Linux 系统中,每个磁盘分区都可以看做?一个?文件系统,每个系统都有?自?己的??目录结构,Linux 会把这些分区按照?一定的?方式组织成统?一的??目录结构,?方便?用户访问。但是每个分区上的?文件系统都是独?立的,可以采?用不容的?文件格式,就像?一国两制?一样,虽然统?一,但是?自治。 那么如何查看?文件系统的格式呢?可以使?用 df -T -h 命令,T 表?示打印?文件格式,h 表?示?用G 或 M 来显?示?文件?大?小,如下:

Linux内核分析-网络[五]:网桥

看完了路由表,重新回到netif_receive_skb ()函数,在提交给上层协议处理前,会执行下面一句,这就是网桥的相关操作,也是这篇要讲解的容。 view plaincopy to clipboardprint? 1. s kb = handle_bridge(skb, &pt_prev, &ret, orig_dev); 网桥可以简单理解为交换机,以下图为例,一台linux机器可以看作网桥和路由的结合,网桥将物理上的两个局域网LAN1、LAN2当作一个局域网处理,路由连接了两个子网1.0和2.0。从eth0和eth1网卡收到的报文在Bridge模块中会被处理成是由Bridge收到的,因此Bridge也相当于一个虚拟网卡。 STP五种状态 DISABLED BLOCKING LISTENING LEARNING FORWARDING 创建新的网桥br_add_bridge [net\bridge\br_if.c] 当使用SIOCBRADDBR调用ioctl时,会创建新的网桥br_add_bridge。 首先是创建新的网桥: view plaincopy to clipboardprint?

1. d ev = new_bridge_dev(net, name); 然后设置dev->dev.type为br_type,而br_type是个全局变量,只初始化了一个名字变量 view plaincopy to clipboardprint? 1. S ET_NETDEV_DEVTYPE(dev, &br_type); 2. s tatic struct device_type br_type = { 3. .name = "bridge", 4. }; 然后注册新创建的设备dev,网桥就相当一个虚拟网卡设备,注册过的设备用ifconfig 就可查看到: view plaincopy to clipboardprint? 1. r et = register_netdevice(dev); 最后在sysfs文件系统中也创建相应项,便于查看和管理: view plaincopy to clipboardprint? 1. r et = br_sysfs_addbr(dev); 将端口加入网桥br_add_if() [net\bridge\br_if.c] 当使用SIOCBRADDIF调用ioctl时,会向网卡加入新的端口br_add_if。 创建新的net_bridge_port p,会从br->port_list中分配一个未用的port_no,p->br会指向br,p->state设为BR_STATE_DISABLED。这里的p实际代表的就是网卡设备。 view plaincopy to clipboardprint? 1. p = new_nbp(br, dev); 将新创建的p加入CAM表中,CAM表是用来记录mac地址与物理端口的对应关系;而刚刚创建了p,因此也要加入CAM表中,并且该表项应是local的[关系如下图],可以看到,CAM表在实现中作为net_bridge的hash表,以addr作为hash值,链入 net_bridge_fdb_entry,再由它的dst指向net_bridge_port。

详细分析Linux文件系统格式优劣

?摘要:Linux支持多种文件系统,包括ext2、iso9660、jffs、ext3、vfat、ntfs、romfs和nfs等,为了对各类文件系统进行统一管理,Linux引入了虚拟文件系统VFS(Virtual File System) ?标签:文件系统 ?Linux由于其开源安全特性正在被多数企业所接受。Linux支持很多种文件系统,ext3、vfat、ntfs、romfs和nfs等,为了对各类文件系统进行统一管理,Linux引入了另一个文件系统VFS(Virtual File System)。下面我们就分析一下他的各种文件系统格式的特点 基于RAM的文件系统 (1)Ramdisk Ramdisk是将一部分固定大小的内存当作分区来使用。它并非一个实际的文件系统,而是一种将实际的文件系统装入内存的机制,并且可以作为根文件系统。将一些经常被访问而又不会更改的文件(如只读的根文件系统)通过Ramdisk放在内存中,可以明显地提高系统的性能。 在Linux的启动阶段,initrd提供了一套机制,可以将内核映像和根文件系统一起载入内存。 (2)ramfs/tmpfs Ramfs是LinusTorvalds开发的一种基于内存的文件系统,工作于虚拟文件系统(VFS)层,不能格式化,可以创建多个,在创建时可以指定其最大能使用的内存大小。(实际上,VFS 本质上可看成一种内存文件系统,它统一了文件在内核中的表示方式,并对磁盘文件系统进行缓冲。 Ramfs/tmpfs文件系统把所有的文件都放在RAM中,所以读/写操作发生在RAM中,可以用ramfs/tmpfs来存储一些临时性或经常要修改的数据,例如/tmp和/var目录,这样既避免了对Flash存储器的读写损耗,也提高了数据读写速度。 Ramfs/tmpfs相对于传统的Ramdisk的不同之处主要在于:不能格式化,文件系统大小可随所含文件内容大小变化。 Tmpfs的一个缺点是当系统重新引导时会丢失所有数据。 3.网络文件系统NFS(NetworkFileSystem) NFS是由Sun开发并发展起来的一项在不同机器、不同操作系统之间通过网络共享文件的技术。在嵌入式Linux系统的开发调试阶段,可以利用该技术在主机上建立基于NFS 的根文件系统,挂载到嵌入式设备,可以很方便地修改根文件系统的内容。 附录:NOR闪存与NAND闪存比较

基于Linux内核编程的实验报告(Linux内核分析实验报告)

基于Linux内核编程的实验报告(Linux内核分析实验 报告) 以下是为大家整理的基于Linux内核编程的实验报告(Linux内核分析实验报告)的相关范文,本文关键词为基于,Linux,内核,编程,实验,报告,分析,,您可以从右上方搜索框检索更多相关文章,如果您觉得有用,请继续关注我们并推荐给您的好友,您可以在教育文库中查看更多范文。 Linux内核分析实验报告

实验题目:文件系统实验 实验目的:linux文件系统使用虚拟文件系统VFs作为内核文件子系统。可以安装多种 不同形式的文件系统在其中共存并协同工作。VFs对用户提供了统一的文件访问接口。本实验的要求是 (1)编写一个get_FAT_boot函数,通过系统调用或动态模块调用它可以提 取和显示出FAT文件系统盘的引导扇区信息。这些信息的格式定义在内核文件的fat_boot_sector结构体中。函数可通过系统调用或动态模块调用。 (2)编写一个get_FAT_dir函数,通过系统调用或动态模块调用它可以 返回FAT文件系统的当 前目录表,从中找出和统计空闲的目录项(文件名以0x00打头的为从未使用过目录项,以0xe5打头的为已删除的目录项),将这些空闲的目录项集中调整到目录表的前部。这些信息的格式定义在内核文件的msdos_dir_entry结构体中。 硬件环境:内存1g以上 软件环境:Linux(ubuntu)2-6实验步骤: 一:实验原理: 以实验4为蓝本,在优盘中编译并加载模块,启动测试程序,查

/proc/mydir/myfile的文件内容。从优盘得到fat文件系统的内容存在msdos_sb_info结构中,然后得到msdos_sb_info结构相应的属性值,得到实验一的数据。实验二中,得到fat文件系统第一个扇区的十六个文件信息。然后按照文件名头文字的比较方法,应用归并排序的方法,将头文件是0x00和0xe5的文件调到前面,其他的文件调到后面 二:主要数据结构说明: (1)超级块对象: 数据结构说明:一个已经安装的文件系统的安装点由超级块对象代表。 structsuper_block{... conststructsuper_operations*s_op;} (2)索引i节点对象 数据结构说明:索引i节点对象包含了内核要操作的文件的全部控制信息,对应着打开文件的i节点表。structinode{ conststructinode_operations*i_op;...} (3)目录项对象 数据结构说明:录项对象代表了文件路径名的各个部分,目录文件名和普 通文件名都属于目录项对象。structdentry{

实验五 Linux文件系统和权限管理

实验5 Linux文件系统和权限管理 1 实验目的 1、掌握Linux文件系统的控制机制及权限的表示方法。 2、掌握权限管理常用的命令。 2 实验环境 VMware中已经安装好CentOS5.4版本。 3 实验原理 1、Linux文件系统权限及管理机制可参见教材P83~P84。 2、Linux常用文件权限管理命令主要有:chmod、chown两个,这些命令的使用可参见教材P86~P104或者帮助手册。 4 实验任务 1、使用chm od、chown命令完成文件权限的设置、修改等操作。 5 实验步骤 1、使用命令查看/etc/hosts文件的权限,其权限是。 2、使用命令可以复制文件/etc/hosts到目录/tmp 下,然后使用命令或设置其读写权限为:文件所有者可以读、写和执行,同组用户可以读和执行,其他用户只可以执行。(要求使用两种方法实现) 3、修改题目2中复制的文件的所有者:所有者为用户test(需要事先创建),组所有者为m ail,使用的命令是。 4、查看系统当前的um ask值,并设置umask值为033,创建文件word,其权限是。(自己验证。想一想,为什么?) 5、将系统的时间设置为22:10的命令是,将日期和时间按照格式:mm/dd/yy hh:mm:ss显示输出的命令是。 6、保存2009年全年的日历在文件cal2009中的命令是。 7、将2009年1月的日历导出保存到文件cal.1中的命令是,将2009年2月的日历追加到2009年1月的日历后面的命令是。 8、假定需要显示信息:host: 主机名。使用hostnam e命令替换显示主机的名称的操作是

Linux内核启动流程分析(一)

很久以前分析的,一直在电脑的一个角落,今天发现贴出来和大家分享下。由于是word直接粘过来的有点乱,敬请谅解! S3C2410 Linux 2.6.35.7启动分析(第一阶段) arm linux 内核生成过程 1. 依据arch/arm/kernel/vmlinux.lds 生成linux内核源码根目录下的vmlinux,这个vmlinux属于未压缩, 带调试信息、符号表的最初的内核,大小约23MB; 命令:arm-linux-gnu-ld -o vmlinux -T arch/arm/kernel/vmlinux.lds arch/arm/kernel/head.o init/built-in.o --start-group arch/arm/mach-s3c2410/built-in.o kernel/built-in.o mm/built-in.o fs/built-in.o ipc/built-in.o drivers/built-in.o net/built-in.o --end-group .tmp_kallsyms2.o 2. 将上面的vmlinux去除调试信息、注释、符号表等内容,生成arch/arm/boot/Image,这是不带多余信息的linux内核,Image的大小约 3.2MB; 命令:arm-linux-gnu-objcopy -O binary -S vmlinux arch/arm/boot/Image 3.将 arch/arm/boot/Image 用gzip -9 压缩生成arch/arm/boot/compressed/piggy.gz大小约 1.5MB;命令:gzip -f -9 < arch/arm/boot/compressed/../Image > arch/arm/boot/compressed/piggy.gz 4. 编译arch/arm/boot/compressed/piggy.S 生成arch/arm/boot/compressed/piggy.o大小约1.5MB,这里实 际上是将piggy.gz通过piggy.S编译进piggy.o文件中。而piggy.S文件仅有6行,只是包含了文件piggy.gz; 命令:arm-linux-gnu-gcc -o arch/arm/boot/compressed/piggy.o arch/arm/boot/compressed/piggy.S 5. 依据arch/arm/boot/compressed/vmlinux.lds 将arch/arm/boot/compressed/目录下的文件head.o 、piggy.o 、misc.o链接生成arch/arm/boot/compressed/vmlinux,这个vmlinux是经过压缩且含有自解压代码的内核, 大小约1.5MB; 命 令:arm-linux-gnu-ld zreladdr=0x30008000 params_phys=0x30000100 -T arch/arm/boot/compressed/vmlinux.lds a rch/arm/boot/compressed/head.o arch/arm/boot/compressed/piggy.o arch/arm/boot/compressed/misc.o -o arch/arm /boot/compressed/vmlinux

linux文件系统的比较

Linux日志文件系统及性能分析 简介:日志文件系统可以在系统发生断电或者其它系统故障时保证整体数据的完整性,Linux是目前支持日志文件系统最多的操作系统之一,本文重点研究了Linux常用的日志文件系统:EXT3、ReiserFS、XFS和JFS日志技术,并采用标准的测试工具PostMark和Bonnie++对它们进行了测试,给出了详细的性能分析,对Linux服务器应用具有重要的参考价值。 一、概述 所谓日志文件系统是在传统文件系统的基础上,加入文件系统更改的日志记录,它的设计思想是:跟踪记录文件系统的变化,并将变化内容记录入日志。日志文件系统在磁盘分区中保存有日志记录,写操作首先是对记录文件进行操作,若整个写操作由于某种原因(如系统掉电)而中断,系统重启时,会根据日志记录来恢复中断前的写操作。在日志文件系统中,所有的文件系统的变化都被记录到日志,每隔一定时间,文件系统会将更新后的元数据及文件内容写入磁盘。在对元数据做任何改变以前,文件系统驱动程序会向日志中写入一个条目,这个条目描述了它将要做些什么,然后它修改元数据。目前Linux的日志文件系统主要有:在Ext2基础上开发的Ext3,根据面向对象思想设计的ReiserFS,由SGI IRIX系统移植过来的XFS,由IBM AIX系统移植过来的JFS,其中EXT3完全兼容EXT2,其磁盘结构和EXT2完全一样,只是加入日志技术;而后三种文件系统广泛使用了B树以提高文件系统的效率。

回页首 二、Ext3 Ext3文件系统是直接从Ext2文件系统发展而来,目前Ext3文件系统已经非常稳定可靠,它完全兼容Ext2文件系统,用户可以平滑地过渡到一个日志功能健全的文件系统。Ext3日志文件系统的思想就是对文件系统进行的任何高级修改都分两步进行。首先,把待写块的一个副本存放在日志中;其次,当发往日志的I/O 数据传送完成时(即数据提交到日志),块就写入文件系统。当发往文件系统的I/O 数据传送终止时(即数据提交给文件系统),日志中的块副本就被丢弃。 2.1 Ext3日志模式 Ext3既可以只对元数据做日志,也可以同时对文件数据块做日志。具体来说,Ext3提供以下三种日志模式: ?日志(Journal ) 文件系统所有数据和元数据的改变都记入日志。这种模式减少了丢失每个文件所作修改的机会,但是它需要很多额外的磁盘访问。例如,当一个新文件被创建时,它的所有数据块都必须复制一份作为日志记录。这是最安全和最慢的Ext3日志模式。 ?预定(Ordered ) 只有对文件系统元数据的改变才记入日志。然而,Ext3文件系统把元数 据和相关的数据块进行分组,以便把元数据写入磁盘之前写入数据块。这

linux内核gpio操作函数解析

详解内核驱动操作GPIO引脚API函数 函数原型: void s3c2410_gpio_cfgpin(unsigned int pin, unsigned int function); unsigned int s3c2410_gpio_getcfg(unsigned int pin); void s3c2410_gpio_pullup(unsigned int pin, unsigned int to); void s3c2410_gpio_setpin(unsigned int pin, unsigned int to); unsigned int s3c2410_gpio_getpin(unsigned int pin); unsigned int s3c2410_modify_misccr(unsigned int clear, unsigned int change); int s3c2410_gpio_getirq(unsigned int pin); 关于函数中用到的虚拟地址到物理地址转换的变量及算法可以参考 https://www.doczj.com/doc/c0959076.html,/hefeng330467115@126/blog/static/78205842201 0620511659/ 或https://www.doczj.com/doc/c0959076.html,/u3/102836/showart_2065945.html 看简单led驱动程序是用到的文件及头文件可能有: linux/include/asm-arm/arch-s3c2410/map.h linux/include/asm-arm/arch-s3c2410/regs-gpio.h linux/arch/arm/plat-s3c24xx/gpio.c linux/include/asm-arm/io.h 用Source Insight 打开这些文件,然后再看驱动程序,可以随意跳转到定义处,很是方便 pin参数: gpio引脚及特殊功能寄存器助记符都在 linux/include/asm-arm/arch-s3c2410/regs-gpio.h中定义: eg: S3C2410_GPACON S3C2410_GPADAT S3C2410_GPA0 - S3C2410_GPA22 //引脚 S3C2410_GPA0_OUT - S3C2410_GPA22_OUT //设置引脚为输出 用到哪个不清楚的可以直接到这个文件去查找 还有中断和GSTATUS: S3C2410_EXTINT0 -> irq sense control for EINT0..EINT7 S3C2410_EXTINT1 -> irq sense control for EINT8..EINT15 S3C2410_EXTINT2 -> irq sense control for EINT16..EINT23 …… function参数: 指定引脚功能:输出、输入还是特殊功能,也在 linux/include/asm-arm/arch-s3c2410/regs-gpio.h中定义。 函数功能: 1原型:void s3c2410_gpio_cfgpin(unsigned int pin, unsigned int

Linux内核源码分析方法

Linux内核源码分析方法 一、内核源码之我见 Linux内核代码的庞大令不少人“望而生畏”,也正因为如此,使得人们对Linux的了解仅处于泛泛的层次。如果想透析Linux,深入操作系统的本质,阅读内核源码是最有效的途径。我们都知道,想成为优秀的程序员,需要大量的实践和代码的编写。编程固然重要,但是往往只编程的人很容易把自己局限在自己的知识领域内。如果要扩展自己知识的广度,我们需要多接触其他人编写的代码,尤其是水平比我们更高的人编写的代码。通过这种途径,我们可以跳出自己知识圈的束缚,进入他人的知识圈,了解更多甚至我们一般短期内无法了解到的信息。Linux内核由无数开源社区的“大神们”精心维护,这些人都可以称得上一顶一的代码高手。透过阅读Linux 内核代码的方式,我们学习到的不光是内核相关的知识,在我看来更具价值的是学习和体会它们的编程技巧以及对计算机的理解。 我也是通过一个项目接触了Linux内核源码的分析,从源码的分析工作中,我受益颇多。除了获取相关的内核知识外,也改变了我对内核代码的过往认知: 1.内核源码的分析并非“高不可攀”。内核源码分析的难度不在于源码本身,而在于如何使用更合适的分析代码的方式和手段。内核的庞大致使我们不能按照分析一般的demo程序那样从主函数开始按部就班的分析,我们需要一种从中间介入的手段对内核源码“各个击破”。这种“按需索取”的方式使得我们可以把握源码的主线,而非过度纠结于具体的细节。 2.内核的设计是优美的。内核的地位的特殊性决定着内核的执行效率必须足够高才可以响应目前计算机应用的实时性要求,为此Linux内核使用C语言和汇编的混合编程。但是我们都 知道软件执行效率和软件的可维护性很多情况下是背道而驰的。如何在保证内核高效的前提下提高内核的可维护性,这需要依赖于内核中那些“优美”的设计。 3.神奇的编程技巧。在一般的应用软件设计领域,编码的地位可能不被过度的重视,因为开发者更注重软件的良好设计,而编码仅仅是实现手段问题——就像拿斧子劈柴一样,不用太多的思考。但是这在内核中并不成立,好的编码设计带来的不光是可维护性的提高,甚至是代码性能的提升。 每个人对内核的了理解都会有所不同,随着我们对内核理解的不断加深,对其设计和实现的思想会有更多的思考和体会。因此本文更期望于引导更多徘徊在Linux内核大门之外的人进入Linux的世界,去亲自体会内核的神奇与伟大。而我也并非内核源码方面的专家,这么做也只是希望分享我自己的分析源码的经验和心得,为那些需要的人提供参考和帮助,说的“冠冕堂皇”一点,也算是为计算机这个行业,尤其是在操作系统内核方面贡献自己的一份绵薄之力。闲话少叙(已经罗嗦了很多了,囧~),下面我就来分享一下自己的Linix内核源码分析方法。 二、内核源码难不难? 从本质上讲,分析Linux内核代码和看别人的代码没有什么两样,因为摆在你面前的一般都不是你自己写出来的代码。我们先举一个简单的例子,一个陌生人随便给你一个程序,并要你看完源码后讲解一下程序的功能的设计,我想很多自我感觉编程能力还可以的人肯定觉得这没什么,只要我耐心的把他的代码从头到尾看完,肯定能找到答案,并且事实确实是如此。那么现在换一个假设,如果这个人是Linus,给你的就是Linux内核的一个模块的代码,你还会觉得依然那么 轻松吗?不少人可能会有所犹豫。同样是陌生人(Linus要是认识你的话当然不算,呵呵~)给 你的代码,为什么给我们的感觉大相径庭呢?我觉得有以下原因:

Linux内核源代码解读

Linux内核源代码解读!! 悬赏分:5 - 提问时间2007-1-24 16:28 问题为何被关闭 赵炯书中,Bootsect代码中有 mov ax , #BOOTSEG 等 我曾自学过80x86汇编,没有见过#的用法,在这为什么要用#? 另外, JMPI 的用法是什么?与JMP的区别是什么? 提问者: Linux探索者 - 一级 答复共 1 条 检举 系统初始化程序 boot.s 的分析 [转] 系统初始化程序 boot.s 的分析: 阚志刚,2000/03/20下午,在前人的基础之上进行整理完善 ******************************************************************************** ************** boot.s is loaded at 0x7c00 by the bios-startup routines, and moves itself out of the way to address 0x90000, and jumps there. 当PC 机启动时,Intel系列的CPU首先进入的是实模式,并开始执行位于地址0xFFF0处的代码,也就是ROM-BIOS起始位置的代码。BIOS先进行一系列的系统自检,然后初始化位于地址0的中断向量表。最后BIOS将启动盘的第一个扇区装入0x7C00(31K;0111,1100,0000,0000),并开始执行此处的代码。这就是对内核初始化过程的一个最简单的描述。 最初,Linux核心的最开始部分是用8086汇编语言编写的。当开始运行时,核心将自己装入到绝对地址0x90000(576K; 1001,0000,0000,0000,0000),再将其后的2k字节装入到地址0x90200(576.5k;1001,0000,0010,0000,0000)处,最后将核心的其余部分装入到0x10000(64k; 1,0000,0000,0000,0000). It then loads the system at 0x10000, using BIOS interrupts. Thereafter it disables all interrupts, moves the system down to 0x0000, changes to protected mode, and calls the start of system. System then must RE-initialize the protected mode in it's own tables, and enable interrupts as needed. 然后,关掉所有中断,把系统下移到0x0000(0k;0000,0000,0000,0000,0000)处,改变到保护模式,然后开始系统的运行.系统必须重新在保护模式下初始化自己的系统表格,并且打开所需的中断. NOTE 1! currently system is at most 8*65536(8*64k=512k; 1000,0000,0000,0000,0000) bytes long. This should be no problem, even in the future. I want to keep it simple. This 512 kB kernel size should be enough - in fact more would mean we'd have to move not just these start-up routines, but also do something about the cache-memory

相关主题
文本预览
相关文档 最新文档