Linux 是用 ''C'' 语言编写的,和每个应用程序一样,它有
当一个模块修改静态变量时,所有其他模块都将看到新值。
Linux 中的静态变量非常重要,因为它们是为内核添加新支持的唯一方式:它们通常是指向已注册元素列表头部的指针,这些元素可以被
_______ _______ _______ Global variable -------> |Item(1)| -> |Item(2)| -> |Item(3)| .. |_______| |_______| |_______|
________________ 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'' 是一个哈希向量。