[code]PCI:bus0:Fastbacktobacktransfersdisabled
PCI:ConfiguredXXasaPCIslavewith128MBPCImemory
PCI:EachRegionsizeis16384KB
PCI:Reservedmemoryfrom0x10080000to0x15080000forDMAandmappedto0x12000000[/code]
设备的初始化init()--->do_basic_init()--->pci_init(),初始化PCI,测量系统的PCI设备。
[code]LinuxNET4.0forLinux2.4BaseduponSwanseaUniversityComputerSocietyNET3.039[/code]
日本英格兰,曼联学院的NET3.039,TCP/IP合同栈
此信息,在linux启动过程中还会出现。
[code]InitializingRTnetlinksocket[/code]
对Socket的初始化,socket_init()linux 用户空间 mtd,Netlink一种路由器管理合同(linux-2.4.22netcoreRtnetlink.c,Routingnetlinksocketinterface:protocolindependentpart。其中RT是route路由的意思。这句输出是在create形成rtnetlink的socket套接字时的一个调试输出。)
此信息,在linux启动过程中还会出现。
[code]Startingkswapd[/code]
启动交换守护进程kswapd,进程IO操作解释器kpiod
kswapd可以配合kpiod运行。进程有时侯无事可做,当它运行时也不一定须要把其所有的代码和数据都置于显存中。这就意味着我们可以通过把运行中程序不用的内容切换到交换分区来更好的是借助显存。大概每隔一秒,kswapd睡醒并检测显存情况。假如在硬碟的东西要读入显存,或则显存可用空间不足,kpiod都会被调用来做移入/移出操作。kswapd负责检测,kpiod负责联通。
[code]JournalledBlockDevicedriverloaded[/code]
加载日志块设备驱动。
日志块设备是拿来对文件系统进行日志记录的一个块设备。日志文件系统是在传统文件系统的基础上,加入文件系统修改的日志记录。
它的设计思想是:跟踪记录文件系统的变化,并将变化内容记录入日志。日志文件系统在c盘分区中保存有日志记录,写操作首先是对记录文件进行操作,若整个写操作因为某种缘由(如系统掉电)而中断,系统重启时,会依照日志记录来恢复中断前的写操作。在日志文件系统中linux运维博客,所有的文件系统的变化都被记录到日志,每隔一定时间,文件系统会将更新后的元数据及文件内容写入c盘。在对元数据做任何改变原先,文件系统驱动程序会向日志中写入一个条目,这个条目描述了它将要做些哪些,之后它更改元数据。
[code]devfs:v1.12c(20020818)RichardGooch(rgooch@atnf.csiro.au)devfs:boot_options:0x1[/code]
Devfs模块的输出信息。
设备文件系统devfs,版本1.12c,
[code]pty:256Unix98ptysconfigured[/code]
Pty模块的输出信息,与控制台操作有关的设置。
将通过devpts文件系统使用Unix98PTYs,(Pseudo-ttys(telnetetc)device是伪ttys设备的简写。
①TTY(/dev/tty)是TeleTYpe的一个老简写,为用户输入提供不同控制台的设备驱动程序。它的名子来始于实际挂接到UNIX系统的、被称为电传打字机(teletype)的终端。在Linux下,这种文件提供对虚拟控制台的支持,可以通过按到键来访问那些虚拟控制台。这种虚拟控制台提供独立的、同时进行的本地登陆对话过程
②ttys(/dev/ttys)是计算机终端的串行插口。/dev/ttyS0对应MS-DOS下的COM1。
使用makedev脚本MAKEDEV来构建pty文件。这样系统内核就支持Unix98风格的pty了。在进行Telnet登陆时即将用到/dev/pty设备。pty是伪终端设备,在远程登陆等须要以终端形式进行联接,但又并非真实终端的应用程序中必须使用这些设备,如telnet或xterm等程序。Linux2.2之后平添了UNIX98风格的Pty设备,它使用一个新的文件系统(devpts针对伪终端的文件系统)和一个克隆的设备cloningdevice来实现其功能。
[code]linux-2.4.22driverscharPty.c,在devfs_mk_dir(NULL,"pts",NULL);时会输出里面的信息。
loop:loaded(max8devices)[/code]
加载退还块设备驱动,最多支持8个设备
[code]8139tooFastEthernetdriver0.9.27eth0:RealTekRTL8139at0x60112000,00:10:0d:42:a0:03,IRQ14etheth0:Identified8139chiptype'RTL-8100B/8139D'[/code]
网卡驱动,基地址为:0x60112000,MAC地址:00:10:0d:42:a0:03,中断号:14
RTL8139的接收路径设计成一个环型缓冲区(一段线性的显存,映射成一个环型显存)。当设备接收到数据时,数据的内容就保存在这个环型缓冲区内并更新下个储存数据的地址(第一个数据包的开始地址+第一个数据包的宽度)。设备会仍然保留缓冲区内的数据直至整个缓冲区用尽。这样,设备会再度重画缓冲区内起始位置的内容,如同一个环那样。
从2.2版内核升级到2.4版时,RTL-8139支持模块已不再叫rtl8139,而叫它8139too,如今你再见到8139too就不会不明白它的由来了吧。
[code]SCSIsubsystemdriverRevision:1.00[/code]
USB设备信息,USB会被当作SCSI来处理。
[code]mumk_register_tasklet:(1)tasklet0xx905905bfbf99cc0status@0x9025e974[/code]
软中断信息输出。Tasklet是在2.4中才出现,它是为了更好地借助多CPU。
[code]ProbingXXFlashMemory[/code]
侦测XX的闪存(FlashMemory),"NORNANDFlashMemoryTechnology"
[code]Amd/FujitsuExtendedQueryTablev1.3at0xx00400040numberofCFIchips:1[/code]
AMD与东芝合资筹建的Flash供货商Spansion。AMD因获利不佳,早已退出Flash市场,后续由Spansion合资公司经营.主要生产NOR类型的flash,特征是容量小,速率快。Spansion商标的flash,在我们开发中会时常见到。之后你们看见Spansion的芯片,能够了解到它和AMD还有东芝的来龙去脉了。
CommonflashInterface(CFI)是指一个统一的flash访问插口,表示这些flash是这些插口类型的。
[code]Usingbufferwritemethod[/code]
使用flash写缓冲方法
flash提供了写BUFFER的命令来推动对flash上块的操作。对Flash擦除和写数据是很慢的。假如用写BUFFER的命令会快一点。据指南上说,会快20倍。BufferSize:5bytes的buffer缓冲不是每位块都有,是整个flash只有一个5bytes的buffer,用写BUFFER命令对所有的块进行写操作,都要用同一个buffer,写Buffer是主要检测buffer是否available,虽然buffer起缓冲作用,来提升工作效率。
例如某flash有128个128K字节块。容许用户对任意块进行字节编程和写缓冲器字节编程操作,每字节编程时间为210μs;若采用写缓冲器字节编程方法,32字节编程共需218μs,每字节编程时间仅为6.8μs。芯片的块擦除时间为1s,容许在编程或块擦除操作的同时进行悬挂中断去进行读操作,待读操作完成后,写入悬挂恢复命令,再继续编程或块擦除。Creating3MTDpartitionson"XXmappedflash":0x00000000-0x00020000:"BootLoader"0x00020000-0x00040000:"Config"0x00040000-0x01000000:"Romfs"
此处为重要信息部份,须要非常留心。
在显存中映射过的flash,创建三个MTD分区:
flash上的内容将被映射到显存中的对应地址
前128K为BootLoader--->0x00000000-0x00020000
接着的128K为系统配置信息Config储存的位置--->0x00020000-0x00040000
再前面的16M-2X128K为romfs的储存处.--->0x00040000-0x01000000
里面的内容,你们可以按照上面的换算公式得到。
A>编译的bootloader通常大小约50K左右;
B>在此处就晓得了配置信息config是置于第2分区中的;
C>制做的romfs的大小,通常为8M或10M左右,所以能放得下;
嵌入式Linux内核的块设备驱动:
对于linux的根文件系统,目前有三种块设备的驱动可以选择,它们分别是:
a)Blkmem驱动
b)MTD驱动
c)RAMdisk驱动
Blkmem驱动是专门为嵌入式linux开发的一种块设备驱动,它是嵌入式linux系统中最为古老和通用的块设备驱动。它原理相对简单而且配置比较复杂,须要依照你即的Flash的分区使用情况来更改代码。其实更改的结果是它可以对一些NOR型的Flash进行读写操作。不过目前支持的Flash类型不够多。假如新加入对一种Flash的支持须要作的工作量比较大。
Linux的MTD驱动是标准Linux的Flash驱动。它支持大量的设备,有足够的功能来定义Flash的分区,进行地址映射等等。使用MTD你可以在一个系统中使用不同类型的Flash。它可以将不同的Flash组合成一个线性的地址让你来使用。
在标准的Linux2.4内核中MTD有一系列的选项,你可以按照个人系统的须要来选择,订制。
另外一种选择就是RAMdisk驱动。在PC上它常常用于没有硬碟的Linux的启动过程。它和Flash没有直接的关系。不过当Flash上启动的是经过压缩的内核时。RAMdisk可以作为根文件系统。
MTD驱动提供了对Flash强悍的支持,你通过它甚至可以在Flash上运行一个可以读写的真正的文件系统,例如JFFS2。而Blkmem驱动则望尘莫及。
[code]NET4:LinuxTCP/IP1.0forNET4.0[/code]
调用inet_init[linux-2.4.22netipv4Af_inet.c]时的输出信息,在启动过程中被socket.c调用到。
[code]IPProtocols:ICMP,UDP,TCP,IGMP[/code]
列举可以支持的IP合同,此处为kernel源代码inet_add_protocol(p);的输出。
在linux启动过程中,还会看见这句的输出。
[code]IP:routingcachehashtableof512buckets,4Kbytes[/code]
IP路由代码的输出信息。
[code]ip_rt_init[linux-2.4.22netipv4Route.c],SettheIPmoduleup,路由缓冲hash表
TCP:Hashtablesconfigured(established8192bind8192)
TCP合同初始化输出信息。tcp_init[linux-2.4.22netipv4Tcp.c],
NET4:Unixdomainsockets1.0/SMPforLinuxNET4.0.[/code]
UNIX网路合同信息。
af_unix_init[linux-2.4.22netunixAf_unix.c],多种联接的一种(IPv4,UNIXdomainsockets,IPv6和IrDA).SMP对称多处理器-SymmetricalMultiProcessing,这儿主要是指UNIX的一些网路合同.
里面的关于网路的输出信息是在linux启动信息中还会出现的。
加载各类文件系统
[code]cramfs:wrongmagic[/code]
会出现"cramfs:wrongmagic",别害怕这没有哪些危害,这个是kernel的书写bug,在2.6中有更改之,它是一个警告信息,拿来检测cramfs的superblock超级块的。superblock也是VFS要用到的数据结构。
代码linux-2.4.22fscramfsInode.c:
[code]2.4
cramfs_read_super(。。。)
/*Dosanitychecksonthesuperblock*/
if(super.magic!=CRAMFS_MAGIC){
/*checkat512byteoffset*/
memcpy(&super,cramfs_read(sb,512,sizeof(super)),sizeof(super));
if(super.magic!=CRAMFS_MAGIC){
printk(KERN_ERR"cramfs:wrongmagicn");
gotoout;
}
}
2.6
if(super.magic!=CRAMFS_MAGIC){
if(!silent)printk(KERN_ERR"cramfs:wrongmagicn");
gotoout;
}[/code]
超级块是文件系统的"腹部"。它包含文件系统的状态、尺寸和空闲c盘块等信息。假如受损了一个文件系统的超级块(比如不留神直接将数据讲到了文件系统的超级块分区中),这么系统可能会完全不辨识该文件系统,这样也就不能安装它了,虽然采用e2fsck命令也不能处理这个问题。
Cramfs文件系统:
cramfs是LinusTorvalds本人开发的一个适用于嵌入式系统的小文件系统。因为它是只读的,所以,即使它采取了zlib做压缩,并且它还是可以做到高效的随机读取。cramfs不会影响系统读取文件的速率,又是一个高度压缩的文件系统。
我们制做image文件以后,我们还要考虑如何能够在系统运行的时侯,把这个image文件mount上来,成为一个可用的文件系统。因为这个image文件不是一个一般意义上的block设备,我们必须采用loopback设备来完成这一任务,如:
[code]mount-oloop-tcramfs/usr.img/usr[/code]
这样,就可以经由loopback设备,把usr.img这个cramfs的image文件mount到/usr目录起来了。内核中须要对loopback这个设备的支持。
cramfs的压缩效率通常都能达到将近50%。
Cramfs通过优化索引节点表的规格和去除传统文件系统中文件之间的空间浪费来达到节省空间的目的。它还使用了zlib压缩,实现优于2:1的压缩比列。解压缩过程的系统开支并不是很大,由于Cramfs支持指定单块的解压,而并毋须解压缩整个文件。
Cramfs除了能节约空间,能够防止非正常死机造成的等待fsck或手工进行fsck的麻烦。它通过只读的形式达到这一目的。
RamDisk有三种实现形式:
在Linux中可以将一部份显存mount为分区来使用,一般称之为RamDisk,分为:
[code]Ramdisk,ramfs,tmpfs.[/code]
①第一种就是传统意义上的,可以低格,之后加载。
这在Linux内核2.0/2.2就早已支持,其不足之处是大小固定,然后不能改变。
为了才能使用Ramdisk,我们在编译内核时须将blockdevice中的Ramdisk支持选上,它下边还有两个选项,一个是设定Ramdisk的大小,默认是4096k;另一个是initrd的支持。
假如对Ramdisk的支持早已编译进内核,我们就可以使用它了:
首先查看一下可用的RamDisk,使用ls/dev/ram*
首先创建一个目录,例如test,运行mkdir/mnt/test;
之后对/dev/ram0创建文件系统,运行mke2fs/dev/ram0;
最后挂载/dev/ram0,运行mount/dev/ram/mnt/test,就可以象对普通硬碟一样对它进行操作了。
②另两种则是内核2.4才支持的,通过Ramfs或则Tmpfs来实现:
它们不需经过低格,用上去灵活,其大小随所须要的空间而降低或降低。
Ramfs顾名思义是显存文件系统,它处于虚拟文件系统(VFS)层,而不像ramdisk那样基于虚拟在显存中的其他文件系统(ex2fs)。
因此,它无需低格,可以创建多个,只要显存足够,在创建时可以指定其最大能使用的显存大小。
假如你的Linux早已将Ramfs编译进内核,你就可以很容易地使用Ramfs了。创建一个目录,加载Ramfs到该目录即可:
[code]#mkdir/testRam
#mount-tramfsnone/testRAM[/code]
缺省情况下,Ramfs被限制最多可使用显存大小的一半。可以通过maxsize(以kbyte为单位)选项来改变。
#mount-tramfsnone/testRAM-omaxsize=2000(创建了一个限定最大使用显存为2M的ramdisk)
③Tmpfs是一个虚拟显存文件系统,它不同于传统的用块设备方式来实现的Ramdisk,也不同于针对化学显存的Ramfs。
Tmpfs可以使用化学显存,也可以使用交换分区。在Linux内核中,虚拟显存资源由化学显存(RAM)和交换分区组成,这种资源是由内核中的虚拟显存子系统来负责分配和管理。
Tmpfs向虚拟显存子系统恳求页来储存文件linux 用户空间 mtd,它同Linux的其它恳求页的部份一样,不晓得分配给自己的页是在显存中还是在交换分区中。同Ramfs一样,其大小也不是固定的linux多线程编程,而是随着所须要的空间而动态的增减。
使用tmpfs,首先你编译内核时得选择"虚拟显存文件系统支持(Virtualmemoryfilesystemsupport)"。
之后就可以加载tmpfs文件系统了:
[code]#mkdir-p/mnt/tmpfs
#mounttmpfs/mnt/tmpfs-ttmpfs[/code]
同样可以在加载时指定tmpfs文件系统大小的最大限制:
[code]#mounttmpfs/mnt/tmpfs-ttmpfs-osize=32m
FAT:boguslogicalsectorsize21072[/code]
具体的文件系统FAT格式。
虚拟逻辑磁道大小为20K,linux-2.4.22fsfatInode.c。
在初始化MS-DOS文件系统时,读MS-DOS文件系统的superblock,函数fat_read_super中输出的前面的信息。
[code]UMSDOS:msdos_read_superfailed,mountaborted.[/code]
UMSDOS:一种文件系统,特征容量大但相对而言不大稳定。是Linux使用的扩充了的DOS文件系统。它在DOS文件系统下降低了长文件名、UID/GID、POSIX权限和特殊文件(设备、命名管线等)功能,而不牺牲对DOS的兼容性。容许一个普通的msdos文件系统用于Linux,并且无须为它构建单独的分区,非常适宜初期的硬碟空间不足的硬件条件。
[code]VFS:Mountedroot(romfsfilesystem)readonly[/code]
虚拟文件系统VFS(VirtualFilesystemSwitch)的输出信息。
再度指出一下一个概念。VFS是一种软件机制,也可称它为Linux的文件系统管理者,它是拿来管理实际文件系统的挂载点,目的是为了能支持多种文件系统。kernel会先在显存中构建一颗VFS目录树,是显存中的一个数据对象,之后在其下挂载rootfs文件系统,还可以挂载其他类型的文件系统到某个子目录上。
[code]Mounteddevfson/dev[/code]
加载devfs设备管理文件系统到dev安装点上。
/dev是我们常常会用到的一个目录。
在2.4的kernel中才有使用到。每次启动时内核会手动挂载devfs。
devfs提供了访问内核设备的命名空间。它并不是构建或修改设备节点,devfs只是为你的非常文件系统进行维护。通常我们可以手工mknod创件设备节点。/dev目录最初是空的,上面特定的文件是在系统启动时、或是加载模组后驱动程序载入时构建的。当模组和驱动程序卸载时,文件就消失了。
[code]Freeinginitmemory:72K[/code]
释放1号用户进程init所占用的显存。