📄 sysctl.c
字号:
/* * sysctl.c: General linux system control interface * * Begun 24 March 1995, Stephen Tweedie * Added /proc support, Dec 1995 * Added bdflush entry and intvec min/max checking, 2/23/96, Tom Dyas. * Added hooks for /proc/sys/net (minor, minor patch), 96/4/1, Mike Shaver. * Added kernel/java-{interpreter,appletviewer}, 96/5/10, Mike Shaver. * Dynamic registration fixes, Stephen Tweedie. * Added kswapd-interval, ctrl-alt-del, printk stuff, 1/8/97, Chris Horn. * Made sysctl support optional via CONFIG_SYSCTL, 1/10/97, Chris * Horn. * Added proc_doulongvec_ms_jiffies_minmax, 09/08/99, Carlos H. Bauer. * Added proc_doulongvec_minmax, 09/08/99, Carlos H. Bauer. * Changed linked lists to use list.h instead of lists.h, 02/24/00, Bill * Wendling. * The list_for_each() macro wasn't appropriate for the sysctl loop. * Removed it and replaced it with older style, 03/23/00, Bill Wendling */#include <linux/module.h>#include <linux/mm.h>#include <linux/swap.h>#include <linux/slab.h>#include <linux/sysctl.h>#include <linux/proc_fs.h>#include <linux/capability.h>#include <linux/ctype.h>#include <linux/utsname.h>#include <linux/capability.h>#include <linux/smp_lock.h>#include <linux/init.h>#include <linux/kernel.h>#include <linux/kobject.h>#include <linux/net.h>#include <linux/sysrq.h>#include <linux/highuid.h>#include <linux/writeback.h>#include <linux/hugetlb.h>#include <linux/security.h>#include <linux/initrd.h>#include <linux/times.h>#include <linux/limits.h>#include <linux/dcache.h>#include <linux/syscalls.h>#include <linux/nfs_fs.h>#include <linux/acpi.h>#include <asm/uaccess.h>#include <asm/processor.h>extern int proc_nr_files(ctl_table *table, int write, struct file *filp, void __user *buffer, size_t *lenp, loff_t *ppos);#ifdef CONFIG_X86#include <asm/nmi.h>#include <asm/stacktrace.h>#endif#if defined(CONFIG_SYSCTL)/* External variables not in a header file. */extern int C_A_D;extern int sysctl_overcommit_memory;extern int sysctl_overcommit_ratio;extern int sysctl_panic_on_oom;extern int max_threads;extern int core_uses_pid;extern int suid_dumpable;extern char core_pattern[];extern int pid_max;extern int min_free_kbytes;extern int printk_ratelimit_jiffies;extern int printk_ratelimit_burst;extern int pid_max_min, pid_max_max;extern int sysctl_drop_caches;extern int percpu_pagelist_fraction;extern int compat_log;extern int maps_protect;extern int sysctl_stat_interval;/* this is needed for the proc_dointvec_minmax for [fs_]overflow UID and GID */static int maxolduid = 65535;static int minolduid;static int min_percpu_pagelist_fract = 8;static int ngroups_max = NGROUPS_MAX;#ifdef CONFIG_KMODextern char modprobe_path[];#endif#ifdef CONFIG_CHR_DEV_SGextern int sg_big_buff;#endif#ifdef __sparc__extern char reboot_command [];extern int stop_a_enabled;extern int scons_pwroff;#endif#ifdef __hppa__extern int pwrsw_enabled;extern int unaligned_enabled;#endif#ifdef CONFIG_S390#ifdef CONFIG_MATHEMUextern int sysctl_ieee_emulation_warnings;#endifextern int sysctl_userprocess_debug;extern int spin_retry;#endifextern int sysctl_hz_timer;#ifdef CONFIG_BSD_PROCESS_ACCTextern int acct_parm[];#endif#ifdef CONFIG_IA64extern int no_unaligned_warning;#endif#ifdef CONFIG_RT_MUTEXESextern int max_lock_depth;#endif#ifdef CONFIG_SYSCTL_SYSCALLstatic int parse_table(int __user *, int, void __user *, size_t __user *, void __user *, size_t, ctl_table *);#endif#ifdef CONFIG_PROC_SYSCTLstatic int proc_do_cad_pid(ctl_table *table, int write, struct file *filp, void __user *buffer, size_t *lenp, loff_t *ppos);static int proc_dointvec_taint(ctl_table *table, int write, struct file *filp, void __user *buffer, size_t *lenp, loff_t *ppos);#endifstatic ctl_table root_table[];static struct ctl_table_header root_table_header = { root_table, LIST_HEAD_INIT(root_table_header.ctl_entry) };static ctl_table kern_table[];static ctl_table vm_table[];static ctl_table fs_table[];static ctl_table debug_table[];static ctl_table dev_table[];extern ctl_table random_table[];#ifdef CONFIG_UNIX98_PTYSextern ctl_table pty_table[];#endif#ifdef CONFIG_INOTIFY_USERextern ctl_table inotify_table[];#endif#ifdef HAVE_ARCH_PICK_MMAP_LAYOUTint sysctl_legacy_va_layout;#endif/* The default sysctl tables: */static ctl_table root_table[] = { { .ctl_name = CTL_KERN, .procname = "kernel", .mode = 0555, .child = kern_table, }, { .ctl_name = CTL_VM, .procname = "vm", .mode = 0555, .child = vm_table, },#ifdef CONFIG_NET { .ctl_name = CTL_NET, .procname = "net", .mode = 0555, .child = net_table, },#endif { .ctl_name = CTL_FS, .procname = "fs", .mode = 0555, .child = fs_table, }, { .ctl_name = CTL_DEBUG, .procname = "debug", .mode = 0555, .child = debug_table, }, { .ctl_name = CTL_DEV, .procname = "dev", .mode = 0555, .child = dev_table, }, { .ctl_name = 0 }};static ctl_table kern_table[] = { { .ctl_name = KERN_PANIC, .procname = "panic", .data = &panic_timeout, .maxlen = sizeof(int), .mode = 0644, .proc_handler = &proc_dointvec, }, { .ctl_name = KERN_CORE_USES_PID, .procname = "core_uses_pid", .data = &core_uses_pid, .maxlen = sizeof(int), .mode = 0644, .proc_handler = &proc_dointvec, }, { .ctl_name = KERN_CORE_PATTERN, .procname = "core_pattern", .data = core_pattern, .maxlen = CORENAME_MAX_SIZE, .mode = 0644, .proc_handler = &proc_dostring, .strategy = &sysctl_string, },#ifdef CONFIG_PROC_SYSCTL { .ctl_name = KERN_TAINTED, .procname = "tainted", .data = &tainted, .maxlen = sizeof(int), .mode = 0644, .proc_handler = &proc_dointvec_taint, },#endif { .ctl_name = KERN_CAP_BSET, .procname = "cap-bound", .data = &cap_bset, .maxlen = sizeof(kernel_cap_t), .mode = 0600, .proc_handler = &proc_dointvec_bset, },#ifdef CONFIG_BLK_DEV_INITRD { .ctl_name = KERN_REALROOTDEV, .procname = "real-root-dev", .data = &real_root_dev, .maxlen = sizeof(int), .mode = 0644, .proc_handler = &proc_dointvec, },#endif#ifdef __sparc__ { .ctl_name = KERN_SPARC_REBOOT, .procname = "reboot-cmd", .data = reboot_command, .maxlen = 256, .mode = 0644, .proc_handler = &proc_dostring, .strategy = &sysctl_string, }, { .ctl_name = KERN_SPARC_STOP_A, .procname = "stop-a", .data = &stop_a_enabled, .maxlen = sizeof (int), .mode = 0644, .proc_handler = &proc_dointvec, }, { .ctl_name = KERN_SPARC_SCONS_PWROFF, .procname = "scons-poweroff", .data = &scons_pwroff, .maxlen = sizeof (int), .mode = 0644, .proc_handler = &proc_dointvec, },#endif#ifdef __hppa__ { .ctl_name = KERN_HPPA_PWRSW, .procname = "soft-power", .data = &pwrsw_enabled, .maxlen = sizeof (int), .mode = 0644, .proc_handler = &proc_dointvec, }, { .ctl_name = KERN_HPPA_UNALIGNED, .procname = "unaligned-trap", .data = &unaligned_enabled, .maxlen = sizeof (int), .mode = 0644, .proc_handler = &proc_dointvec, },#endif { .ctl_name = KERN_CTLALTDEL, .procname = "ctrl-alt-del", .data = &C_A_D, .maxlen = sizeof(int), .mode = 0644, .proc_handler = &proc_dointvec, }, { .ctl_name = KERN_PRINTK, .procname = "printk", .data = &console_loglevel, .maxlen = 4*sizeof(int), .mode = 0644, .proc_handler = &proc_dointvec, },#ifdef CONFIG_KMOD { .ctl_name = KERN_MODPROBE, .procname = "modprobe", .data = &modprobe_path, .maxlen = KMOD_PATH_LEN, .mode = 0644, .proc_handler = &proc_dostring, .strategy = &sysctl_string, },#endif#if defined(CONFIG_HOTPLUG) && defined(CONFIG_NET) { .ctl_name = KERN_HOTPLUG, .procname = "hotplug", .data = &uevent_helper, .maxlen = UEVENT_HELPER_PATH_LEN, .mode = 0644, .proc_handler = &proc_dostring, .strategy = &sysctl_string, },#endif#ifdef CONFIG_CHR_DEV_SG { .ctl_name = KERN_SG_BIG_BUFF, .procname = "sg-big-buff", .data = &sg_big_buff, .maxlen = sizeof (int), .mode = 0444, .proc_handler = &proc_dointvec, },#endif#ifdef CONFIG_BSD_PROCESS_ACCT { .ctl_name = KERN_ACCT, .procname = "acct", .data = &acct_parm, .maxlen = 3*sizeof(int), .mode = 0644, .proc_handler = &proc_dointvec, },#endif#ifdef CONFIG_MAGIC_SYSRQ { .ctl_name = KERN_SYSRQ, .procname = "sysrq", .data = &__sysrq_enabled, .maxlen = sizeof (int), .mode = 0644, .proc_handler = &proc_dointvec, },#endif#ifdef CONFIG_PROC_SYSCTL { .ctl_name = KERN_CADPID, .procname = "cad_pid", .data = NULL, .maxlen = sizeof (int), .mode = 0600, .proc_handler = &proc_do_cad_pid, },#endif { .ctl_name = KERN_MAX_THREADS, .procname = "threads-max", .data = &max_threads, .maxlen = sizeof(int), .mode = 0644, .proc_handler = &proc_dointvec, }, { .ctl_name = KERN_RANDOM, .procname = "random", .mode = 0555, .child = random_table, },#ifdef CONFIG_UNIX98_PTYS { .ctl_name = KERN_PTY, .procname = "pty", .mode = 0555, .child = pty_table, },#endif { .ctl_name = KERN_OVERFLOWUID, .procname = "overflowuid", .data = &overflowuid, .maxlen = sizeof(int), .mode = 0644, .proc_handler = &proc_dointvec_minmax, .strategy = &sysctl_intvec, .extra1 = &minolduid, .extra2 = &maxolduid, }, { .ctl_name = KERN_OVERFLOWGID, .procname = "overflowgid", .data = &overflowgid, .maxlen = sizeof(int), .mode = 0644, .proc_handler = &proc_dointvec_minmax, .strategy = &sysctl_intvec, .extra1 = &minolduid, .extra2 = &maxolduid, },#ifdef CONFIG_S390#ifdef CONFIG_MATHEMU { .ctl_name = KERN_IEEE_EMULATION_WARNINGS, .procname = "ieee_emulation_warnings", .data = &sysctl_ieee_emulation_warnings, .maxlen = sizeof(int), .mode = 0644, .proc_handler = &proc_dointvec, },#endif#ifdef CONFIG_NO_IDLE_HZ { .ctl_name = KERN_HZ_TIMER, .procname = "hz_timer", .data = &sysctl_hz_timer, .maxlen = sizeof(int), .mode = 0644, .proc_handler = &proc_dointvec, },#endif { .ctl_name = KERN_S390_USER_DEBUG_LOGGING, .procname = "userprocess_debug", .data = &sysctl_userprocess_debug, .maxlen = sizeof(int), .mode = 0644, .proc_handler = &proc_dointvec, },#endif { .ctl_name = KERN_PIDMAX, .procname = "pid_max", .data = &pid_max, .maxlen = sizeof (int), .mode = 0644, .proc_handler = &proc_dointvec_minmax, .strategy = sysctl_intvec, .extra1 = &pid_max_min, .extra2 = &pid_max_max, }, { .ctl_name = KERN_PANIC_ON_OOPS, .procname = "panic_on_oops", .data = &panic_on_oops, .maxlen = sizeof(int), .mode = 0644, .proc_handler = &proc_dointvec, }, { .ctl_name = KERN_PRINTK_RATELIMIT, .procname = "printk_ratelimit", .data = &printk_ratelimit_jiffies, .maxlen = sizeof(int), .mode = 0644, .proc_handler = &proc_dointvec_jiffies, .strategy = &sysctl_jiffies, }, { .ctl_name = KERN_PRINTK_RATELIMIT_BURST, .procname = "printk_ratelimit_burst", .data = &printk_ratelimit_burst, .maxlen = sizeof(int), .mode = 0644, .proc_handler = &proc_dointvec, }, { .ctl_name = KERN_NGROUPS_MAX, .procname = "ngroups_max", .data = &ngroups_max, .maxlen = sizeof (int), .mode = 0444, .proc_handler = &proc_dointvec, },#if defined(CONFIG_X86_LOCAL_APIC) && defined(CONFIG_X86) { .ctl_name = KERN_UNKNOWN_NMI_PANIC, .procname = "unknown_nmi_panic", .data = &unknown_nmi_panic, .maxlen = sizeof (int), .mode = 0644, .proc_handler = &proc_dointvec, }, { .ctl_name = KERN_NMI_WATCHDOG, .procname = "nmi_watchdog", .data = &nmi_watchdog_enabled, .maxlen = sizeof (int), .mode = 0644, .proc_handler = &proc_nmi_enabled, },#endif#if defined(CONFIG_X86) { .ctl_name = KERN_PANIC_ON_NMI, .procname = "panic_on_unrecovered_nmi", .data = &panic_on_unrecovered_nmi, .maxlen = sizeof(int), .mode = 0644, .proc_handler = &proc_dointvec, }, { .ctl_name = KERN_BOOTLOADER_TYPE, .procname = "bootloader_type", .data = &bootloader_type, .maxlen = sizeof (int), .mode = 0444, .proc_handler = &proc_dointvec, }, { .ctl_name = CTL_UNNUMBERED, .procname = "kstack_depth_to_print", .data = &kstack_depth_to_print, .maxlen = sizeof(int), .mode = 0644, .proc_handler = &proc_dointvec, },#endif#if defined(CONFIG_MMU) { .ctl_name = KERN_RANDOMIZE, .procname = "randomize_va_space", .data = &randomize_va_space, .maxlen = sizeof(int), .mode = 0644, .proc_handler = &proc_dointvec, },#endif#if defined(CONFIG_S390) && defined(CONFIG_SMP) { .ctl_name = KERN_SPIN_RETRY, .procname = "spin_retry", .data = &spin_retry, .maxlen = sizeof (int), .mode = 0644, .proc_handler = &proc_dointvec, },#endif#ifdef CONFIG_ACPI_SLEEP { .ctl_name = KERN_ACPI_VIDEO_FLAGS, .procname = "acpi_video_flags", .data = &acpi_video_flags, .maxlen = sizeof (unsigned long), .mode = 0644, .proc_handler = &proc_doulongvec_minmax, },#endif#ifdef CONFIG_IA64 { .ctl_name = KERN_IA64_UNALIGNED, .procname = "ignore-unaligned-usertrap", .data = &no_unaligned_warning, .maxlen = sizeof (int), .mode = 0644, .proc_handler = &proc_dointvec, },#endif#ifdef CONFIG_COMPAT { .ctl_name = KERN_COMPAT_LOG, .procname = "compat-log", .data = &compat_log, .maxlen = sizeof (int), .mode = 0644, .proc_handler = &proc_dointvec, },#endif#ifdef CONFIG_RT_MUTEXES {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -