sysctl分析

2009-05-13 11:11:04来源:未知 阅读 ()

新老客户大回馈,云服务器低至5折

qiuhan
2007-7-20
1 重要数据结构
sys/sysctl.h
kern/kern_sysctl.c
SET_DECLARE(sysctl_set, struct sysctl_oid);
SYSINIT(sysctl, SI_SUB_KMEM, SI_ORDER_ANY, sysctl_register_all, 0);
static SYSCTL_NODE(_sysctl, 1, name, CTLFLAG_RD, sysctl_sysctl_name, "");
全局变量sysctl__children,保存MIB树。其结构为:
sle_next指向兄弟节点, void指针oid_arg1指向子节点。我们总是从sysctl__children开始遍历MIB树,
不匹配时继续访问sle_next,匹配时访问其子节点,直到节点为空或者匹配节点数达到预定值或者遇到
oid_handler不为空的非叶子节点,然后调用该函数。
一般而言,非叶子节点(NODE)的oid_handler都为空,除非它想用oid_number序列来传递参数。
例如_kern_proc下的很多NODE都有oid_handler,用最后的oid_number来传递pid. 还有_sysctl下的NODE
(gdb) p *sysctl__children->slh_first
$72 = {oid_parent = 0xc0a13c40, oid_link = {sle_next = 0xc09a5f20}, oid_number = 0, oid_kind = 3221225473,
  oid_arg1 = 0xc0a12244, oid_arg2 = 0, oid_name = 0xc0934198 "sysctl", oid_handler = 0, oid_fmt = 0xc0900a9e "N",
  oid_refcnt = 0, oid_descr = 0xc092d95d "Sysctl internal magic"}
(gdb) p *sysctl__children->slh_first->oid_link->sle_next
$73 = {oid_parent = 0xc0a13c40, oid_link = {sle_next = 0xc09a5f60}, oid_number = 1, oid_kind = 3221225473,
  oid_arg1 = 0xc0a12240, oid_arg2 = 0, oid_name = 0xc092d973 "kern", oid_handler = 0, oid_fmt = 0xc0900a9e "N",
  oid_refcnt = 0, oid_descr = 0xc092d978 "High kernel, proc, limits &c"}
(gdb) p *sysctl__children->slh_first->oid_link->sle_next->oid_link->sle_next
$74 = {oid_parent = 0xc0a13c40, oid_link = {sle_next = 0xc09a5fa0}, oid_number = 2, oid_kind = 3221225473,
  oid_arg1 = 0xc0a12248, oid_arg2 = 0, oid_name = 0xc0942340 "vm", oid_handler = 0, oid_fmt = 0xc0900a9e "N",
  oid_refcnt = 0, oid_descr = 0xc092d995 "Virtual memory"}
(gdb) p *((struct sysctl_oid_list *)(sysctl__children->slh_first->oid_arg1))->slh_first
$78 = {oid_parent = 0xc0a12244, oid_link = {sle_next = 0xc09a8b40}, oid_number = 1, oid_kind = 2147483649,
  oid_arg1 = 0xc0a13ca0, oid_arg2 = 0, oid_name = 0xc093b71a "name", oid_handler = 0xc068c030 ,
  oid_fmt = 0xc0900a9e "N", oid_refcnt = 0, oid_descr = 0xc0924c8d ""}
/*
* This describes the access space for a sysctl request.  This is needed
* so that we can use the interface from the kernel or from user-space.
*/
struct sysctl_req {
    struct thread   *td;        /* used for access checking */
    int     lock;       /* locking/wiring state */
//缓冲指针,用于传递__sysctl运行的结果
    void        *oldptr;

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇:CRUX

下一篇:MAC内存泄漏的调试