start_kernel——setup_nr_cpu_ids

原创 2015年07月06日 18:58:18

kernel/smp.c

/* An arch may set nr_cpu_ids earlier if needed, so this would be redundant */
void __init setup_nr_cpu_ids(void)
{
    nr_cpu_ids = find_last_bit(cpumask_bits(cpu_possible_mask),NR_CPUS) + 1;
}

include/linux/cpumask.h

#if NR_CPUS == 1
#define nr_cpu_ids      1
#else
extern int nr_cpu_ids;
#endif

NR_CPUS不是1,所以编译extern int nr_cpu_ids;,我在源代码中没有找到nr_cpu_ids的定义,资料上说nr_cpu_ids全局变量被声明为__read_mostly属性。
nr_cpu_ids保存的是所有可处于联机状态的CPU总数。
nr_cpu_ids具有当前系统能具备的CPU数的信息,默认值为NR_CPUS值,NR_CPUS是编译时用户可设置的常量值。NR_CPUS并非当前系统内存在的CPU的数值,而是Linux内核能支持的最大CPU数的最大值。
UP(Uni-Processor)中是1,32位SMP中具有2~32的值,64位内核中具有2~64位的值。
kernel/cpu.c

#ifdef CONFIG_INIT_ALL_POSSIBLE
static DECLARE_BITMAP(cpu_possible_bits, CONFIG_NR_CPUS) __read_mostly
    = CPU_BITS_ALL;
#else
static DECLARE_BITMAP(cpu_possible_bits, CONFIG_NR_CPUS) __read_mostly;
#endif

没有定义CONFIG_INIT_ALL_POSSIBLE,所以编译

static DECLARE_BITMAP(cpu_possible_bits, CONFIG_NR_CPUS) __read_mostly;

DECLARE_BITMAP我们在http://blog.csdn.net/yin262/article/details/46774041已经分析过了,这句定义的最终结果是生车功能一个unsigned long 类型的数组,数组名为cpu_possible_bits,用位图来管理cpu个数,每一位对应一个cpu。

关于利用位图来管理cpu变量,还有以下:
include/linux/cpumask.h

/*
 * The following particular system cpumasks and operations manage
 * possible, present, active and online cpus.
 *
 *     cpu_possible_mask- has bit 'cpu' set iff cpu is populatable
 *     cpu_present_mask - has bit 'cpu' set iff cpu is populated
 *     cpu_online_mask  - has bit 'cpu' set iff cpu available to scheduler
 *     cpu_active_mask  - has bit 'cpu' set iff cpu available to migration
 *
 *  If !CONFIG_HOTPLUG_CPU, present == possible, and active == online.
 *
 *  The cpu_possible_mask is fixed at boot time, as the set of CPU id's
 *  that it is possible might ever be plugged in at anytime during the
 *  life of that system boot.  The cpu_present_mask is dynamic(*),
 *  representing which CPUs are currently plugged in.  And
 *  cpu_online_mask is the dynamic subset of cpu_present_mask,
 *  indicating those CPUs available for scheduling.
 *
 *  If HOTPLUG is enabled, then cpu_possible_mask is forced to have
 *  all NR_CPUS bits set, otherwise it is just the set of CPUs that
 *  ACPI reports present at boot.
 *
 *  If HOTPLUG is enabled, then cpu_present_mask varies dynamically,
 *  depending on what ACPI reports as currently plugged in, otherwise
 *  cpu_present_mask is just a copy of cpu_possible_mask.
 *
 *  (*) Well, cpu_present_mask is dynamic in the hotplug case.  If not
 *      hotplug, it's a copy of cpu_possible_mask, hence fixed at boot.
 *
 * Subtleties:
 * 1) UP arch's (NR_CPUS == 1, CONFIG_SMP not defined) hardcode
 *    assumption that their single CPU is online.  The UP
 *    cpu_{online,possible,present}_masks are placebos.  Changing them
 *    will have no useful affect on the following num_*_cpus()
 *    and cpu_*() macros in the UP case.  This ugliness is a UP
 *    optimization - don't waste any instructions or memory references
 *    asking if you're online or how many CPUs there are if there is
 *    only one CPU.
 */

extern const struct cpumask *const cpu_possible_mask;
extern const struct cpumask *const cpu_online_mask;
extern const struct cpumask *const cpu_present_mask;
extern const struct cpumask *const cpu_active_mask;

cpu_possible_mask:系统内可安装的最多CPU的位图
cpu_online_mask:系统内安装的CPU中,正在使用的CPU的位图
cpu_present_mask:系统内安装的CPU的位图
cpu_active_mask:处于联机状态且可以动的(migration)的CPU的位图

以上都是结构体指针类型,由相应的bitmap转化而来:
kernel/cpu.c

#ifdef CONFIG_INIT_ALL_POSSIBLE
static DECLARE_BITMAP(cpu_possible_bits, CONFIG_NR_CPUS) __read_mostly
    = CPU_BITS_ALL;
#else
static DECLARE_BITMAP(cpu_possible_bits, CONFIG_NR_CPUS) __read_mostly;
#endif
const struct cpumask *const cpu_possible_mask = to_cpumask(cpu_possible_bits);
EXPORT_SYMBOL(cpu_possible_mask);

static DECLARE_BITMAP(cpu_online_bits, CONFIG_NR_CPUS) __read_mostly;
const struct cpumask *const cpu_online_mask = to_cpumask(cpu_online_bits);
EXPORT_SYMBOL(cpu_online_mask);

static DECLARE_BITMAP(cpu_present_bits, CONFIG_NR_CPUS) __read_mostly;
const struct cpumask *const cpu_present_mask = to_cpumask(cpu_present_bits);
EXPORT_SYMBOL(cpu_present_mask);

static DECLARE_BITMAP(cpu_active_bits, CONFIG_NR_CPUS) __read_mostly;
const struct cpumask *const cpu_active_mask = to_cpumask(cpu_active_bits);
EXPORT_SYMBOL(cpu_active_mask);

转换的过程,在之前的文章里也分析了。

设置每CPU环境

5.3 设置每CPU环境回到start_kernel,563行调用mm_init_owner函数,将init_mm的owner字段指回init_task。这个函数可以说进入start_kernel以来...
  • yunsongice
  • yunsongice
  • 2011年02月01日 02:09
  • 4523

start_kernel()分析(一)

从某种意义上,函数start_kernel就好像一般可执行程序中的主函数main,系统进入这个函数之前已经进行了一些最低限度的初始化,再往前研究就涉及很多硬件相关及编程语言了,这里是较高层次的初始化,...
  • njufeng
  • njufeng
  • 2014年06月09日 22:14
  • 6985

Linux内核启动分析

Linux内核启动代码由位于init/main.cinit/main.c的start_kernel开始,下面对start_kernel进行分析,start_kernel代码如下 asmlink...
  • ccshijtgc
  • ccshijtgc
  • 2016年03月13日 17:18
  • 416

Linux 内核 SMP 代码追踪

init/main.c : kernel_init(); init/main.c : smp_init(); kernel/cpu.c cpu_up(); arch/x8...
  • crazyss
  • crazyss
  • 2013年01月21日 19:03
  • 3062

Kernel启动流程源码解析 4 start_kernel 上

一 start_kernel start_kernel函数是kernel启动过程执行的第一个c语言函数,其通过调用一系列初始化函数完成的内核的初始化工作,上篇分析local_irq_en...
  • xichangbao
  • xichangbao
  • 2016年10月21日 23:47
  • 954

Linux系统启动分析-从start_kernel到init进程的启动

##################################### 作者:张卓 原创作品转载请注明出处:《Linux操作系统分析》MOOC课程 http://www.xuetangx.com/...
  • cagent_z
  • cagent_z
  • 2017年03月11日 23:15
  • 227

全面解析Linux 内核 3.10.x - start_kernel()

From: 全面解析Linux 内核 3.10.x - 本文章完全基于MIPS架构 赶得早,不如赶得巧 - 古语start_kernel前几年穿越题材很火爆,如神话,宫,步步惊心等,可是这些剧都有一些...
  • ongoingcre
  • ongoingcre
  • 2015年11月30日 21:09
  • 1033

3、分析Linux内核的启动过程

姓名:周毅 原创作品转载请注明出处  《Linux内核分析》MOOC课程http://mooc.study.163.com/course/USTC-1000029000 一、基础知识 ...
  • u011301547
  • u011301547
  • 2017年03月12日 02:31
  • 112

Kernel启动流程源码解析 5 start_kernel 下

一 start_kernel start_kernel函数是kernel启动过程执行的第一个c语言函数,其通过调用一系列初始化函数完成的内核的初始化工作,下篇分析local_irq_enab...
  • xichangbao
  • xichangbao
  • 2016年10月22日 23:14
  • 459

arm-linux内核start_kernel之前启动分析(1)-接过bootloader的衣钵

如果想运行和链接地址不一致,我能想到的办法,只能是汇编中尽量不去涉及一些绝对地址,使用PIC位置无关代码。 联想之前分析的uboot relocation原理,uboot在relocation之后,k...
  • skyflying2012
  • skyflying2012
  • 2014年11月21日 10:05
  • 9557
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:start_kernel——setup_nr_cpu_ids
举报原因:
原因补充:

(最多只允许输入30个字)