私の質問は主にハードウェアについてです。特にインテルi5-2500K CPUIntelはこれを次のように説明しています。
コア数 4
スレッド数 4
Linuxには4つのプロセッサが表示されます。
$ cat /proc/cpuinfo | grep ^processor
processor : 0
processor : 1
processor : 2
processor : 3
それにもかかわらず、私は8つのプロセッサを表示する小さなカーネルモジュールを書いています。
$ cat show_cpus_mod.c
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/version.h>
#define CLASS_NAME "show_cpus_mod"
#define dbg( format, arg... ) do { if ( debug ) pr_info( CLASS_NAME ": %s: " format , __FUNCTION__ , ## arg ); } while ( 0 )
#define err( format, arg... ) pr_err( CLASS_NAME ": " format, ## arg )
#define info( format, arg... ) pr_info( CLASS_NAME ": " format, ## arg )
#define warn( format, arg... ) pr_warn( CLASS_NAME ": " format, ## arg )
MODULE_DESCRIPTION( "shows all cpus" );
MODULE_VERSION( "0.1" );
MODULE_LICENSE( "GPL" );
MODULE_AUTHOR( "author <[email protected]>" );
static int show_cpus_mod_init( void ) {
int cpu;
info( "Start loading module show_cpus_mod.\n" );
for_each_possible_cpu( cpu ) {
info( "cpu = %d\n", cpu );
}
return 0;
}
static void show_cpus_mod_exit( void ) {
info( "Module show_cpus_mod unloaded\n" );
}
module_init( show_cpus_mod_init );
module_exit( show_cpus_mod_exit );
建築学:
$ cat Makefile
CURRENT = $(shell uname -r)
KDIR = /lib/modules/$(CURRENT)/build
PWD = $(shell pwd)
TARGET = show_cpus_mod
obj-m := $(TARGET).o
default:
$(MAKE) -C $(KDIR) M=$(PWD) modules
clean:
@rm -f *.o .*.cmd .*.flags *.mod.c *.order
@rm -f .*.*.cmd *.symvers *~ *.*~ TODO.*
@rm -fR .tmp*
@rm -rf .tmp_versions
埋め込む:
# make
# cp show_cpus_mod.ko /lib/modules/4.14.0-kali3-amd64/
# depmod
# modprobe show_cpus_mod
システムログ:
localhost kernel: [67596.578805] show_cpus_mod: Start loading module show_cpus_mod.
localhost kernel: [67596.578808] show_cpus_mod: cpu = 0
localhost kernel: [67596.578809] show_cpus_mod: cpu = 1
localhost kernel: [67596.578810] show_cpus_mod: cpu = 2
localhost kernel: [67596.578811] show_cpus_mod: cpu = 3
localhost kernel: [67596.578811] show_cpus_mod: cpu = 4
localhost kernel: [67596.578812] show_cpus_mod: cpu = 5
localhost kernel: [67596.578812] show_cpus_mod: cpu = 6
localhost kernel: [67596.578813] show_cpus_mod: cpu = 7
localhost kernel: [67607.725738] show_cpus_mod: Module show_cpus_mod unloaded
Intelの説明に欠けているものは何ですか?なぜ8ですか?それとも私のカーネルモジュールに問題があるのでしょうか?
答え1
代わりにまたはfor_each_online_cpu
を使用する必要があります。これにより、それぞれ実際にオンラインになっているか、または存在するCPUに出力が制限されます。for_each_present_cpu
for_each_possible_cpu