可以看到这是一个module,在init函数中在proc下建立一个config的node,其提供一个read函数可以读取kernel config中的配置
http://lxr.free-electrons.com/source/kernel/configs.c
72 static int __init ikconfig_init(void)
73 {
74 struct proc_dir_entry *entry;
75
76 /* create the current config file */
77 entry = proc_create("config.gz", S_IFREG | S_IRUGO, NULL,
78 &ikconfig_file_ops);
79 if (!entry)
80 return -ENOMEM;
81
82 proc_set_size(entry, kernel_config_data_size);
83
84 return 0;
85 }
86
92 module_init(ikconfig_init);
我们看看ikconfig_file_ops 的实现
66 static const struct file_operations ikconfig_file_ops = {
67 .owner = THIS_MODULE,
68 .read = ikconfig_read_current,
69 .llseek = default_llseek,
70 };
继续看ikconfig_read_current
57 static ssize_t
58 ikconfig_read_current(struct file *file, char __user *buf,
59 size_t len, loff_t * offset)
60 {
61 return simple_read_from_buffer(buf, len, offset,
62 kernel_config_data + MAGIC_SIZE,
63 kernel_config_data_size);
64 }
发现原来kernel config都是存在kernel_config_data 数组中,那这个数组又是在哪里赋值的呢?
答案就是在config_data.h 中定义的
在同级的目录下,可以看到config_data.gz是有KCONFIG_CONFIG 经过gzip 压缩的,而KCONFIG_CONFIG 就是kernel的配置文件.
从126行可以看到config_data.h 就是124行动态生成的。
http://lxr.free-electrons.com/source/kernel/Makefile
116 $(obj)/configs.o: $(obj)/config_data.h
117
118 # config_data.h contains the same information as ikconfig.h but gzipped.
119 # Info from config_data can be extracted from /proc/config*
120 targets += config_data.gz
121 $(obj)/config_data.gz: $(KCONFIG_CONFIG) FORCE
122 $(call if_changed,gzip)
123
124 filechk_ikconfiggz = (echo "static const char kernel_config_data[] __used = MAGIC_START"; cat $< | scripts/basic/bin2c; echo "MAGIC_END;")
125 targets += config_data.h
126 $(obj)/config_data.h: $(obj)/config_data.gz FORCE
127 $(call filechk,ikconfiggz)
所以就可以通过cat proc/config.gz XXX 来查是否有enable 某个config。
要使能这个module的话,需要CONFIG_IKCONFIG_PROC 这个宏
http://lxr.free-electrons.com/source/kernel/configs.c
72 static int __init ikconfig_init(void)
73 {
74 struct proc_dir_entry *entry;
75
76 /* create the current config file */
77 entry = proc_create("config.gz", S_IFREG | S_IRUGO, NULL,
78 &ikconfig_file_ops);
79 if (!entry)
80 return -ENOMEM;
81
82 proc_set_size(entry, kernel_config_data_size);
83
84 return 0;
85 }
86
92 module_init(ikconfig_init);
我们看看ikconfig_file_ops 的实现
66 static const struct file_operations ikconfig_file_ops = {
67 .owner = THIS_MODULE,
68 .read = ikconfig_read_current,
69 .llseek = default_llseek,
70 };
继续看ikconfig_read_current
57 static ssize_t
58 ikconfig_read_current(struct file *file, char __user *buf,
59 size_t len, loff_t * offset)
60 {
61 return simple_read_from_buffer(buf, len, offset,
62 kernel_config_data + MAGIC_SIZE,
63 kernel_config_data_size);
64 }
发现原来kernel config都是存在kernel_config_data 数组中,那这个数组又是在哪里赋值的呢?
答案就是在config_data.h 中定义的
在同级的目录下,可以看到config_data.gz是有KCONFIG_CONFIG 经过gzip 压缩的,而KCONFIG_CONFIG 就是kernel的配置文件.
从126行可以看到config_data.h 就是124行动态生成的。
http://lxr.free-electrons.com/source/kernel/Makefile
116 $(obj)/configs.o: $(obj)/config_data.h
117
118 # config_data.h contains the same information as ikconfig.h but gzipped.
119 # Info from config_data can be extracted from /proc/config*
120 targets += config_data.gz
121 $(obj)/config_data.gz: $(KCONFIG_CONFIG) FORCE
122 $(call if_changed,gzip)
123
124 filechk_ikconfiggz = (echo "static const char kernel_config_data[] __used = MAGIC_START"; cat $< | scripts/basic/bin2c; echo "MAGIC_END;")
125 targets += config_data.h
126 $(obj)/config_data.h: $(obj)/config_data.gz FORCE
127 $(call filechk,ikconfiggz)
所以就可以通过cat proc/config.gz XXX 来查是否有enable 某个config。
要使能这个module的话,需要CONFIG_IKCONFIG_PROC 这个宏