提高kernel log level 有两种方法。
一种是通过bootloader传递参数给kernel,可以传的参数为debug和quiet。分别对应CONSOLE_LOGLEVEL_DEBUG 和 CONSOLE_LOGLEVEL_QUIET 两种level
static int __init debug_kernel(char *str)
{
console_loglevel = CONSOLE_LOGLEVEL_DEBUG;
return 0;
}
static int __init quiet_kernel(char *str)
{
console_loglevel = CONSOLE_LOGLEVEL_QUIET;
return 0;
}
early_param("debug", debug_kernel);
early_param("quiet", quiet_kernel);
第二中是通过proc文件系统修改.
echo 10 4 1 7 > /proc/sys/kernel/printk
上面这条语句可以同第一种通过bootloader传递debug达到一样的效果.
具体实现在sysctl.c 中
{
.procname = "printk",
.data = &console_loglevel,
.maxlen = 4*sizeof(int),
.mode = 0644,
.proc_handler = proc_dointvec,
}
int proc_dointvec(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos)
{
return do_proc_dointvec(table, write, buffer, lenp, ppos, NULL, NULL);
}
int proc_douintvec(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos)
{
return do_proc_dointvec(table, write, buffer, lenp, ppos,
do_proc_douintvec_conv, NULL);
}
可见处理函数是do_proc_douintvec_conv
static int do_proc_douintvec_conv(bool *negp, unsigned long *lvalp,
int *valp,
int write, void *data)
{
if (write) {
if (*negp)
return -EINVAL;
*valp = *lvalp;
} else {
unsigned int val = *valp;
*lvalp = (unsigned long)val;
}
return 0;
}
这里write=1,所以执行*valp = *lvalp;
而valp指向的是console_loglevel,而lvalp就是通过echo写入的值.
注意起data为console_loglevel,最终通过proc_handler 来修改console_loglevel的值.
一种是通过bootloader传递参数给kernel,可以传的参数为debug和quiet。分别对应CONSOLE_LOGLEVEL_DEBUG 和 CONSOLE_LOGLEVEL_QUIET 两种level
static int __init debug_kernel(char *str)
{
console_loglevel = CONSOLE_LOGLEVEL_DEBUG;
return 0;
}
static int __init quiet_kernel(char *str)
{
console_loglevel = CONSOLE_LOGLEVEL_QUIET;
return 0;
}
early_param("debug", debug_kernel);
early_param("quiet", quiet_kernel);
第二中是通过proc文件系统修改.
echo 10 4 1 7 > /proc/sys/kernel/printk
上面这条语句可以同第一种通过bootloader传递debug达到一样的效果.
具体实现在sysctl.c 中
{
.procname = "printk",
.data = &console_loglevel,
.maxlen = 4*sizeof(int),
.mode = 0644,
.proc_handler = proc_dointvec,
}
int proc_dointvec(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos)
{
return do_proc_dointvec(table, write, buffer, lenp, ppos, NULL, NULL);
}
int proc_douintvec(struct ctl_table *table, int write,
void __user *buffer, size_t *lenp, loff_t *ppos)
{
return do_proc_dointvec(table, write, buffer, lenp, ppos,
do_proc_douintvec_conv, NULL);
}
可见处理函数是do_proc_douintvec_conv
static int do_proc_douintvec_conv(bool *negp, unsigned long *lvalp,
int *valp,
int write, void *data)
{
if (write) {
if (*negp)
return -EINVAL;
*valp = *lvalp;
} else {
unsigned int val = *valp;
*lvalp = (unsigned long)val;
}
return 0;
}
这里write=1,所以执行*valp = *lvalp;
而valp指向的是console_loglevel,而lvalp就是通过echo写入的值.
注意起data为console_loglevel,最终通过proc_handler 来修改console_loglevel的值.