sysctl/sysfs/系统调用/netlink/ioctl 等都是user space和 kernel space通信的方式,其中sysctl是通过在user space配置kernel space的有效手段,sysctl是基于proc系统的
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形的参数,修改时不能超过最大最小值
这里以用户空间配置shall memory为例
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形的参数,修改时不能超过最大最小值