• 正文
  • 推薦器件
  • 相關(guān)推薦
申請入駐 產(chǎn)業(yè)圖譜

linux內(nèi)核中打印cpumask的方法總結(jié)

2024/04/24
4371
加入交流群
掃碼加入
獲取工程師必備禮包
參與熱點資訊討論

哈嘍,大家好,我是LittleG。

前言

Linux內(nèi)核中,CPU掩碼(cpumask)用于表示一組CPU編號,常用于描述進程或任務的親和性、中斷或定時器的分配范圍等場景。

如下類似打印:

Task scheduled on CPUs: 0-3,7

下面就記錄一些常用的打印cpumask的方法。

正文

1、printk?與?cpumask_printk?宏:

Linux內(nèi)核中最常用的打印接口是printk函數(shù),可以接收格式化字符串和參數(shù),類似用戶空間的printf。同時為了便于打印cpumask,內(nèi)核還提供了一些輔助宏,如cpumask_printk,可以接受一個cpumask_t類型的變量和一個格式化字符串作為參數(shù)。

例如:

#include <linux/cpumask.h>
#include <linux/kernel.h>

void print_cpu_mask(cpumask_t *mask)
{
    printk(KERN_INFO "CPU mask: %*pbn", cpumask_bits(mask)[0]);
    // 或者使用 cpumask_printk 宏
    cpumask_printk("CPU mask: ", mask);
}

說明: 上述代碼中,%*pb是一種特殊的格式化符,用于打印位掩碼(cpumask_t本質(zhì)上是一個位掩碼)。cpumask_bits(mask)[0]獲取掩碼的第一個長整型元素,用于指定要打印的位數(shù)。cpumask_printk宏則提供了一種更直接的方式,它內(nèi)部會處理掩碼的格式化輸出。

2、dump_stack?和?dump_cpu_mask

當需要在內(nèi)核崩潰報告或調(diào)試信息中包含當前CPU掩碼時,可以調(diào)用dump_stack()函數(shù),它會自動打印當前CPU的標識。如果需要更詳細地打印某個cpumask_t,可以結(jié)合dump_cpu_mask()函數(shù),通常與dump_stack()一起使用,用于在內(nèi)核oops堆棧跟蹤中輸出CPU掩碼。

例如:

#include <linux/dump_stack.h>
#include <linux/kernel.h>

void dump_cpu_mask_example(cpumask_t *mask)
{
    dump_stack();
    dump_cpu_mask(mask);
}

調(diào)用dump_cpu_mask_example()時,會在內(nèi)核日志中看到堆棧跟蹤信息以及跟隨其后的CPU掩碼打印。

3、直接訪問cpumask_t的位:

對于更精細的控制或特殊情況,可以直接遍歷cpumask_t的位數(shù)組,并使用printk打印其中的每一位。雖然cpumask_printk通常已能滿足需求,但cpumask_t 提供了更大的靈活性。

例如:

#include <linux/bitops.h>
#include <linux/cpumask.h>
#include <linux/kernel.h>

void print_cpu_mask_manual(cpumask_t *mask)
{
    int cpu;

    for_each_cpu(cpu, mask) {
        printk(KERN_INFO "CPU %d is set in the mask.n", cpu);
    }
}

上述代碼使用for_each_cpu宏遍歷cpumask_t中的每個已置位CPU,并使用printk打印其編號。

4、cpumask_pr_args?宏

cpumask_pr_args?可以直觀可讀的形式輸出?cpumask_t?中包含的 CPU 核心編號列表,并將其作為函數(shù)參數(shù)傳遞給其他內(nèi)核日志打印函數(shù)。這樣做的好處是能夠方便地將?cpumask_t?的內(nèi)容嵌入到其他日志消息中,而不必單獨調(diào)用cpumask_printk或者手動構(gòu)建包含 CPU 列表的字符串。

例如:

// https://elixir.bootlin.com/linux/latest/source/include/linux/cpumask.h#L36
/**
 * cpumask_pr_args - printf args to output a cpumask
 * @maskp: cpumask to be printed
 *
 * Can be used to provide arguments for '%*pb[l]' when printing a cpumask.
 */
#define cpumask_pr_args(maskp)   nr_cpu_ids, cpumask_bits(maskp)

// https://elixir.bootlin.com/linux/latest/source/arch/arm64/kernel/cpufeature.c#L1521
static ssize_t aarch32_el0_show(struct device *dev,
                                struct device_attribute *attr, char *buf)
{
        const struct cpumask *mask = system_32bit_el0_cpumask();

        return sysfs_emit(buf, "%*pbln", cpumask_pr_args(mask));
}
static const DEVICE_ATTR_RO(aarch32_el0);

說明:

%*pbl?是格式占位符,用于接收?cpumask_pr_args?生成的 CPU 核心列表字符串。

%*pbl?是內(nèi)核日志特有的格式說明符,其中?*?表示寬度由參數(shù)決定,pbl?表示以空格分隔的 CPU 核心列表。

cpumask_pr_args?提供了一種便捷的方式來將?cpumask_t?的內(nèi)容以方便肉眼可讀的形式嵌入到日志消息中,通過使用?%*pbl?格式說明符與內(nèi)核日志打印函數(shù)(如?pr_info(),?pr_debug(),?pr_err()?等)配合使用,可以清晰地記錄與 CPU 核心關(guān)聯(lián)的操作情況。

總結(jié),具體開發(fā)過程中選擇哪種打印方法取決于具體的需求和調(diào)試環(huán)境。在大多數(shù)情況下,直接使用cpumask_printk宏就可以滿足打印CPU掩碼的需求了。

下期見~

推薦器件

更多器件
器件型號 數(shù)量 器件廠商 器件描述 數(shù)據(jù)手冊 ECAD模型 風險等級 參考價格 更多信息
KSZ8895RQI 1 Micrel Inc Ethernet Transceiver, CMOS, PQFP128, LEAD FREE, PLASTIC, QFP-128
暫無數(shù)據(jù) 查看
CDCV304PWRG4 1 Texas Instruments General purpose and PCI-X 1:4 LVCMOS clock buffer 8-TSSOP -40 to 85

ECAD模型

下載ECAD模型
$3.4 查看
NC26LF-327 1 Fox Electronics Parallel - Fundamental Quartz Crystal, 0.032768MHz Nom,
$0.49 查看

相關(guān)推薦

登錄即可解鎖
  • 海量技術(shù)文章
  • 設(shè)計資源下載
  • 產(chǎn)業(yè)鏈客戶資源
  • 寫文章/發(fā)需求
立即登錄