下一页 上一页 目录

14. 静态变量

14.1 概述

Linux 是用 ''C'' 语言编写的,和每个应用程序一样,它有

  1. 局部变量
  2. 模块变量(在源文件内部,并且仅相对于该模块)
  3. 全局/静态变量,仅存在一份副本(所有模块都相同)

当一个模块修改静态变量时,所有其他模块都将看到新值。

Linux 中的静态变量非常重要,因为它们是为内核添加新支持的唯一方式:它们通常是指向已注册元素列表头部的指针,这些元素可以被

                           _______      _______      _______
Global variable  -------> |Item(1)| -> |Item(2)| -> |Item(3)|  ..
                          |_______|    |_______|    |_______|

14.2 主要变量

Current(当前进程)

                           ________________
Current ----------------> | Actual process |
                          |________________|

Current 指向 ''task_struct'' 结构体,其中包含有关进程的所有数据,例如

Current 不是一个真正的变量,它是

static inline struct task_struct * get_current(void) { 
   struct task_struct *current; 
   __asm__("andl %%esp,%0; ":"=r" (current) : "0" (~8191UL)); 
   return current; 
}
#define current get_current()

上述代码行只是获取 ''esp'' 寄存器(堆栈指针)的值,并使其像变量一样可用,我们可以从中指向我们的 task_struct 结构体。

从 ''current'' 元素,我们可以直接访问任何其他进程(就绪、停止或任何其他状态)的内核数据结构,例如更改 STATE(像 I/O 驱动程序所做的那样),PID,在就绪列表或阻塞列表中的存在状态等等。

已注册的文件系统

                       ______      _______      ______
file_systems  ------> | ext2 | -> | msdos | -> | ntfs |
 [fs/super.c]         |______|    |_______|    |______|

当您使用诸如 ''modprobe some_fs'' 之类的命令时,您将在文件系统列表中添加一个新条目,而删除它(通过使用 ''rmmod'')将删除它。

已挂载的文件系统

                        ______      _______      ______
mount_hash_table  ---->|   /  | -> | /usr  | -> | /var |
[fs/namespace.c]       |______|    |_______|    |______|

当您使用 ''mount'' 命令添加文件系统时,新条目将插入到列表中,而 ''umount'' 命令将删除该条目。

已注册的网络数据包类型

                        ______      _______      ______ 
     ptype_all  ------>|  ip  | -> |  x25  | -> | ipv6 |
[net/core/dev.c]       |______|    |_______|    |______|

例如,如果您添加对 IPv6 的支持(加载相关模块),则将在列表中添加一个新条目。

已注册的网络互联网协议

                          ______      _______      _______ 
inet_protocol_base ----->| icmp | -> |  tcp  | -> |  udp  |
[net/ipv4/protocol.c]    |______|    |_______|    |_______|

其他数据包类型在每个列表中也有许多内部协议(例如 IPv6)。

                          ______      _______      _______ 
inet6_protos ----------->|icmpv6| -> | tcpv6 | -> | udpv6 |
[net/ipv6/protocol.c]    |______|    |_______|    |_______|

已注册的网络设备

                          ______      _______      _______ 
dev_base --------------->|  lo  | -> |  eth0 | -> |  ppp0 |
[drivers/core/Space.c]   |______|    |_______|    |_______|

已注册的字符设备

                          ______      _______      ________ 
chrdevs ---------------->|  lp  | -> | keyb  | -> | serial |
[fs/devices.c]           |______|    |_______|    |________|

''chrdevs'' 不是指向真实列表的指针,而是一个标准向量。

已注册的块设备

                          ______      ______      ________ 
bdev_hashtable --------->|  fd  | -> |  hd  | -> |  scsi  |
[fs/block_dev.c]         |______|    |______|    |________|

''bdev_hashtable'' 是一个哈希向量。


下一页 上一页 目录