커널 모듈은 Intel i5-2500K에 4개가 아닌 8개의 프로세서가 있음을 보여줍니다.

커널 모듈은 Intel i5-2500K에 4개가 아닌 8개의 프로세서가 있음을 보여줍니다.

내 질문은 주로 하드웨어에 관한 것입니다. 특히인텔 i5-2500K CPU인텔은 이를 다음과 같이 설명합니다.

코어 수 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

인텔 설명에서 누락된 내용은 무엇입니까?왜 8인가?아니면 내 커널 모듈에 문제가 있는 걸까요?

답변1

대신 for_each_online_cpu또는 를 사용해야 합니다 . 이렇게 하면 각각 실제로 온라인 상태이거나 존재하는 CPU로 출력이 제한됩니다.for_each_present_cpufor_each_possible_cpu

관련 정보