通过sysctl 配置shall memory

来源:互联网 发布:拖动拼图验证码java 编辑:程序博客网 时间:2024/06/03 20:03
sysctl/sysfs/系统调用/netlink/ioctl 等都是user space和 kernel space通信的方式,其中sysctl是通过在user space配置kernel space的有效手段,sysctl是基于proc系统的

这里以用户空间配置shall memory为例


其源代码在ipc/ipc_sysctl.c中
static struct ctl_table ipc_root_table[] = {
    {
        .procname    = "kernel",
        .mode        = 0555,
        .child        = ipc_kern_table,
    },
    {}
};

static int __init ipc_sysctl_init(void)
{
    register_sysctl_table(ipc_root_table);
    return 0;
}

device_initcall(ipc_sysctl_init);
在kernel初始化的过程中会调用ipc_sysctl_init
static struct ctl_table ipc_kern_table[] = {
    {
        .procname    = "shmmax",
        .data        = &init_ipc_ns.shm_ctlmax,
        .maxlen        = sizeof(init_ipc_ns.shm_ctlmax),
        .mode        = 0644,
        .proc_handler    = proc_ipc_doulongvec_minmax,
    },
    {
        .procname    = "shmall",
        .data        = &init_ipc_ns.shm_ctlall,
        .maxlen        = sizeof(init_ipc_ns.shm_ctlall),
        .mode        = 0644,
        .proc_handler    = proc_ipc_doulongvec_minmax,
    },

}
当在用户空间访问shmall,其会调用到proc_ipc_doulongvec_minmax 来修改init_ipc_ns.shm_ctlall的值。从proc_ipc_doulongvec_minmax的命名来看init_ipc_ns.shm_ctlall 是一个ulong形的参数,修改时不能超过最大最小值