linux内核初始化及启动之start_kernel

来源:互联网 发布:方正交易软件下载 编辑:程序博客网 时间:2024/05/12 07:30
导读:
  Linux的源代码可以从www.kernel.org得到,或者你可以查看linux代码交叉引用网站:http://lxr.linux.no/ 进行在线的代码查看,这是一个很好的工具网站。
  在start_kernel中将调用到大量的init函数,来完成内核的各种初始化。如:
  page_address_init();
  sched_init();
  page_alloc_init();
  init_IRQ();
  softirq_init();
  console_init();
  calibrate_delay();
  vfs_caches_init(num_physpages);
  rest_init();
  具体内容可以参考[http://lxr.linux.no/source/init/main.c]
  Linux version 2.4.22-uc0 (root@local) (gcc version 2.95.3 20010315 (release)) #33 .?1.. 20 12:09:106
  上面的代码输出信息,是跟踪linux代码分析后得到的,进入init目录下的main.c的start_kernel启动函数.
  嵌入式linux使用的是linux内核版本为2.4.22
  linux source code代码中start_kernel中输出的linux_banner信息。这个信息是每个linux kernel都会打印一下的信息,如果你没有把这句去掉的话。
  Found bootloader memory map at 0x10000fc0.
  bootloader经过内存映射后的地址为:0x10000fc0, 按上面的地址换算方法,1后面有7个0,那么虚拟地址256M左右处。
  Processor: ARM pt110 revision 0
  pT110是ARM微处理器arm核的一种,另一种为pT100。此处为显示ARM的类型。
  On node 0 totalpages: 20480
  zone(0): 20480 pages.
  zone(0): Set minimum memory threshold to 12288KB
  Warning: wrong zone alignment (0x90080000, 0x0000000c, 0x00001000)
  zone(1): 0 pages.
  zone(2): 0 pages.
  预留内存大小,在节点0上总共20页, zone(0) 设置最小内存为12MB, zone(1)和zone(2)为0页。警告:对齐不正确
  Kernel command line: root=/dev/mtdblock3
  Kernel 启动命令设为:/dev/mtdblock3(在后面的说明中会看到mtdblock3是指的flash上的romfs分区。),用来指定根文件系统所在的位置,kernel会将块设备mtdblock3当作文件系统来处理。
  也就是说,内核会根据上面的kernel命令行,知道只读文件系统romfs将是根文件系统rootfs。
  start_kernel(void)中输出的上面的这句信息。
  这行命令是在linux内核启动过程中都会输出的一句。
  Console: colour dummy device 80x30
  代码中console_init()的输出信息, 显示控制台属性:一般使用VGA text console,标准是80 X 25行列的文本控制台,这里是对属性进行了设置。
  serial_xx: setup_console @ 115
  串口设置值为115200,此为波特率输出信息。对串口设置的信息做一个打印的动作,在调试时会非常有用。
  Calibrating delay loop... 82.94 BogoMIPS
  Calibrate:校准, 进入时延校准循环。检查CPU的MIPS(每秒百万条指令),Bogo是Bogus(伪)的意思。这里是对CPU进行一个实时测试,来得到一个大体的MIPS数值
  Bogomips,是由linus Torvalds写的, 是Linux操作系统中衡量计算机处理器运行速度的一种尺度。提供这种度量的程序被称为BogoMips,当启动计算机时,BogoMips能显示系统选项是否处于最佳性能。
  linux内核中有一个函数calibrate_delay(),它可以计算出cpu在一秒钟内执行了多少次一个极短的循环,计算出来的值经过处理后得到BogoMIPS值
  你可以将计算机的bogomips与计算机处理器的bogomips进行比较。Torvalds称这个程序为BogoMips来暗示两台计算机间的性能度量是错误的,因为并非所有起作用因素都能被显示出来或被认可。尽管计算机基准中经常用到MIPS,但环境的变化容易导致度量的错误。Bogomips能测出一秒钟内某程序运行了多少次。
  察看/proc/cpuinfo文件中的最后一行也能得到这个数值。
  上面这个输出,在所有的linux系统启动中都会打印出来。
  进入内存初始化
  mem_init(void), [arch/i386/mm/init.c]
  Memory: 80MB = 80MB total
  Memory: 76592KB available (1724K code, 2565K data, 72K init)
  当前内存使用情况,将列出总的内存大小, 及分配给内核的内存大小:包括代码部分,数据部分,初始化部分,总共刚好4M。请留意此处的内核的内存大小的各个值。
  进入虚拟文件系统VFS初始化
  vfs_caches_init()
  Dentry cache hash table entries: 16384 (order: 5, 131072 bytes)
  Inode cache hash table entries: 8192 (order: 4, 65536 bytes)
  Mount cache hash table entries: 512 (order: 0, 4096 bytes)
  Buffer cache hash table entries: 4096 (order: 2, 16384 bytes)
  Page-cache hash table entries: 32768 (order: 5, 131072 bytes)
  名词:
  ① Dentry:目录数据结构
  ② Inode:i节点
  ③ Mount cache:文件系统加载缓冲
  ④ buffer cache:内存缓冲区
  ⑤ Page Cache:页缓冲区
  Dentry目录数据结构(目录入口缓存),提供了一个将路径名转化为特定的dentry的一个快的查找机制,Dentry只存在于RAM中;
  i节点(inode)数据结构存放磁盘上的一个文件或目录的信息,i节点存在于磁盘驱动器上;存在于RAM中的i节点就是VFS的i节点,dentry所包含的指针指向的就是它;
  buffer cache内存缓冲区,类似kupdated,用来在内存与磁盘间做缓冲处理;
  Page Cache 用来加快对磁盘上映像和数据的访问。
  在内存中建立各个缓冲hash表,为kernel对文件系统的访问做准备。
  VFS(virtual filesystem switch)虚拟文件切换目录树有用到类似这样的结构表。
  上面的输出信息,在一般的linux启动过程中都会看到。
  POSIX conformance testing by UNIFIX
  conformance:顺应, 一致。即POSIX适应性检测。UNIFIX是一家德国的技术公司,Linux 原本要基于 POSIX.1 的, 但是 POSIX 不是免费的, 而且 POSIX.1 证书相当昂贵. 这使得 Linux 基于 POSIX 开发相当困难. Unifix公司(Braunschweig, 德国) 开发了一个获得了 FIPS 151-2 证书的 Linux 系统. 这种技术用于 Unifix 的发行版 Unifix Linux 2.0 和 Lasermoon 的 Linux-FT。
  在2.6的内核中就将上面的这句输出给拿掉了。

本文转自
http://dev.yesky.com/355/2547355.shtml
原创粉丝点击