详解Linux内核定义的常量

时间:2011-09-04

   引言 

   操作系统是一个用来和硬件打交道并为用户程序提供一个有限服务集的低级支撑软件。一个计算机系统是一个硬件和软件的共生体,它们互相依赖,不可分割。计算机的硬件,含有外围设备、处理器、内存、硬盘和其他的电子设备组成计算机的发动机。但是没有软件来操作和控制它,自身是不能工作的。完成这个控制工作的软件就称为操作系统,在Linux的术语中被称为“内核”,也可以称为“”。Linux内核的主要模块(或组件)分以下几个部分:存储管理、CPU和进程管理、文件系统、设备管理和驱动、网络通信,以及系统的初始化(引导)、系统调用等。今天我们要了解的是Linux内核定义的常量。希望能给大家带来帮助。

    1 初始定义

  定义了你的机器上的地址转换__virt_to_phys()。这个宏用于把虚拟地址转换为一个物理地址。通常情况下:phys = virt - PAGE_OFFSET PHYS_OFFSET

  2 解压缩符号

  l ZTEXTADDR

  解压缩器的地址地址。由于当你调用解压缩器代码时,通常关闭MMU,因此这里并不讨论虚拟地址和物理地址的问题。通常你在这个地址处调用内核,开始引导内核。它不需要在RAM中,只需要位于FLASH或其他只读或读/写的可寻址的存储设备中。

  l ZBSSADDR

  解压缩器的初始化为0的工作区的起始地址。必须位于RAM中,解压缩器会替你把它初始化为0,此外,需要关闭MMU。

  l ZRELADDR

  解压缩内核将被写入的地址和终的执行地址。必须满足:

  __virt_to_phys(TEXTADDR) == ZRELADDR

  内核的开始部分被编码为与位置无关的代码。

  l INITRD_PHYS

  放置初始RAM盘的物理地址。仅当你使用bootpImage时相关(这是一种非常老的param_struct结构)

  l INITRD_VIRT

  初始RAM盘的虚拟地址。必须满足:

  __virt_to_phys(INITRD_VIRT) == INITRD_PHYS

  l PARAMS_PHYS

  param_struct 结构体或tag lis的物理地址,用于给定内核执行环境下的不同参数。

  3 内核符号

  l PHYS_OFFSET

  RAM个BANK的物理地址地址。

  l PAGE_OFFSET

  RAM个BANK的虚拟地址地址。在内核引导阶段,虚拟地址PAGE_OFFSE将被映射为物理地址PHYS_OFFSET,它应该与TASK_SIZE具有相同的值。

  l TASK_SIZE

  一个用户进程的值,单位为byte。用户空间的堆栈从这个地址处向下增长。

  任何一个低于TASK_SIZE的虚拟地址对用户进程来说都是不可见的,因此,内核通过进程偏移对每个进行进行动态的管理。我把这叫做用户段。任何高于TASK_SIZE的对所有进程都是相同的,称之为内核段。(换句话说,你不能把IO映射放在低于TASK_SIZE和PAGE_OFFSET的位置处。)

  l TEXTADDR

  内核的虚拟起始地址,通常为PAGE_OFFSET 0x8000。内核映射必须在此结束。

  l DATAADDR

  内核数据段的虚拟地址,不能在使用解压缩器的情况下定义。

  l VMALLOC_START

  l VMALLOC_END

  用于限制vmalloc( )区域的虚拟地址。此地址必须位于内核段。 通常,vmalloc( )区域在的虚拟RAM地址以上开始VMALLOC_OFFSET字节。

  l VMALLOC_OFFSET

  Offset normally incorporated into VMALLOC_START to provide a hole between virtual RAM and the vmalloc area. We do this to allow out of bounds memory accesses (eg, something writing off the end of the mapped memory map) to be caught. Normally set to 8MB.

  4 构架相关的宏

  l BOOT_MEM(pram,pio,vio)

  pram——指定了RAM起始的物理地址,必须始终存在,并应等于PHYS_OFFSET。

  pio——是供arch/arm/kernel/debug-armv.S中的调试宏使用的,包含IO的8 MB区域的物理地址。

  vio——是8MB调试区域的虚拟地址。

  这个调试区域将被位于代码中(通过MAPIO函数)的随后的构架相关代码再次进行初始化。

  l BOOT_PARAMS

  参见 PARAMS_PHYS.

  l FIXUP(func)

  机器相关的修正,在存储子系统被初始化前运行。

  l MAPIO(func)

  机器相关的函数,用于IO区域的映射(包括上面的调试区)。

  l INITIRQ(func)

  用于初始化中断的机器相关的函数。

  5 关于Linux内核

  Linux是的自由电脑操作系统内核。它是一个用C语言写成,符合POSIX标准的类Unix操作系统。Linux早是由芬兰黑客 Linus Torvalds为尝试在英特尔x86架构上提供自由的类Unix操作系统而开发的。该计划开始于1991年,在计划的早期有一些Minix 黑客提供了协助,而今天无数程序员正在为该计划无偿提供帮助。 技术上说Linux是一个内核。“内核”指的是一个提供硬件抽象层、磁盘及文件系统控制、多任务等功能的系统软件。一个内核不是一套完整的操作系统。一套基于Linux内核的完整操作系统叫作Linux操作系统,或是GNU/Linux。

  5.1 架构

  Linux是一个一体化内核(monolithic kernel)系统。设备驱动程序可以完全访问硬件。Linux内的设备驱动程序可以方便地以模块化(modularize)的形式设置,并在系统运行期间可直接装载或卸载。

  5.2 可移植性

  尽管Linus Torvalds的初衷不是使Linux成为一个可移植的操作系统,今天的Linux却是被广泛移植的操作系统内核。从掌上电脑iPaq到巨型电脑IBM S/390,甚至于微软出品的游戏机XBOX都可以看到Linux内核的踪迹。Linux也是IBM超级计算机Blue Gene的操作系统。

  5.3 发表形式

  原先Linus Torvalds将Linux置于一个禁止任何商业行为的条例之下,但之后改用GNU通用公共许可证第二版。该协议允许任何人对软件进行修改或发行,包括商业行为,只要其遵守该协议,所有基于Linux的软件也必须以该协议的形式发表,并提供源代码。   

    Linus Torvalds曾经公开声称将Linux置于GNU通用公共许可证之下是他一生中所做的“的决定”。



  
上一篇:怎样设置S3c2440A平台HIVE注册表 binfs
下一篇:Linux内核学习的误区相关书籍

免责声明: 凡注明来源本网的所有作品,均为本网合法拥有版权或有权使用的作品,欢迎转载,注明出处。非本网作品均来自互联网,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。

相关技术资料