RHEL5/init/main.c
<<
>>
Prefs
   1/*
   2 *  linux/init/main.c
   3 *
   4 *  Copyright (C) 1991, 1992  Linus Torvalds
   5 *
   6 *  GK 2/5/95  -  Changed to support mounting root fs via NFS
   7 *  Added initrd & change_root: Werner Almesberger & Hans Lermen, Feb '96
   8 *  Moan early if gcc is old, avoiding bogus kernels - Paul Gortmaker, May '96
   9 *  Simplified starting of init:  Michael A. Griffith <grif@acm.org> 
  10 */
  11
  12#define __KERNEL_SYSCALLS__
  13
  14#include <linux/types.h>
  15#include <linux/module.h>
  16#include <linux/proc_fs.h>
  17#include <linux/kernel.h>
  18#include <linux/syscalls.h>
  19#include <linux/string.h>
  20#include <linux/ctype.h>
  21#include <linux/delay.h>
  22#include <linux/utsname.h>
  23#include <linux/ioport.h>
  24#include <linux/init.h>
  25#include <linux/smp_lock.h>
  26#include <linux/initrd.h>
  27#include <linux/hdreg.h>
  28#include <linux/bootmem.h>
  29#include <linux/tty.h>
  30#include <linux/gfp.h>
  31#include <linux/percpu.h>
  32#include <linux/kmod.h>
  33#include <linux/kernel_stat.h>
  34#include <linux/security.h>
  35#include <linux/workqueue.h>
  36#include <linux/profile.h>
  37#include <linux/rcupdate.h>
  38#include <linux/moduleparam.h>
  39#include <linux/kallsyms.h>
  40#include <linux/writeback.h>
  41#include <linux/cpu.h>
  42#include <linux/cpuset.h>
  43#include <linux/efi.h>
  44#include <linux/taskstats_kern.h>
  45#include <linux/delayacct.h>
  46#include <linux/unistd.h>
  47#include <linux/rmap.h>
  48#include <linux/mempolicy.h>
  49#include <linux/key.h>
  50#include <linux/unwind.h>
  51#include <linux/buffer_head.h>
  52#include <linux/debug_locks.h>
  53#include <linux/lockdep.h>
  54
  55#include <asm/io.h>
  56#include <asm/bugs.h>
  57#include <asm/setup.h>
  58#include <asm/sections.h>
  59#include <asm/cacheflush.h>
  60
  61#ifdef CONFIG_X86_LOCAL_APIC
  62#include <asm/smp.h>
  63#endif
  64
  65/*
  66 * This is one of the first .c files built. Error out early if we have compiler
  67 * trouble.
  68 *
  69 * Versions of gcc older than that listed below may actually compile and link
  70 * okay, but the end product can have subtle run time bugs.  To avoid associated
  71 * bogus bug reports, we flatly refuse to compile with a gcc that is known to be
  72 * too old from the very beginning.
  73 */
  74#if (__GNUC__ < 3) || (__GNUC__ == 3 && __GNUC_MINOR__ < 2)
  75#error Sorry, your GCC is too old. It builds incorrect kernels.
  76#endif
  77
  78static int init(void *);
  79
  80extern void init_IRQ(void);
  81extern void fork_init(unsigned long);
  82extern void mca_init(void);
  83extern void sbus_init(void);
  84extern void sysctl_init(void);
  85extern void signals_init(void);
  86extern void pidhash_init(void);
  87extern void pidmap_init(void);
  88extern void prio_tree_init(void);
  89extern void radix_tree_init(void);
  90extern void free_initmem(void);
  91extern void populate_rootfs(void);
  92extern void driver_init(void);
  93extern void prepare_namespace(void);
  94#ifdef  CONFIG_ACPI
  95extern void acpi_early_init(void);
  96#else
  97static inline void acpi_early_init(void) { }
  98#endif
  99#ifndef CONFIG_DEBUG_RODATA
 100static inline void mark_rodata_ro(void) { }
 101#endif
 102
 103#ifdef CONFIG_TC
 104extern void tc_init(void);
 105#endif
 106
 107enum system_states system_state;
 108EXPORT_SYMBOL(system_state);
 109
 110/*
 111 * Boot command-line arguments
 112 */
 113#define MAX_INIT_ARGS CONFIG_INIT_ENV_ARG_LIMIT
 114#define MAX_INIT_ENVS CONFIG_INIT_ENV_ARG_LIMIT
 115
 116extern void time_init(void);
 117/* Default late time init is NULL. archs can override this later. */
 118void (*late_time_init)(void);
 119extern void softirq_init(void);
 120
 121/* Untouched command line (eg. for /proc) saved by arch-specific code. */
 122char saved_command_line[COMMAND_LINE_SIZE];
 123
 124static char *execute_command;
 125static char *ramdisk_execute_command;
 126
 127/* Setup configured maximum number of CPUs to activate */
 128static unsigned int max_cpus = NR_CPUS;
 129
 130/*
 131 * Setup routine for controlling SMP activation
 132 *
 133 * Command-line option of "nosmp" or "maxcpus=0" will disable SMP
 134 * activation entirely (the MPS table probe still happens, though).
 135 *
 136 * Command-line option of "maxcpus=<NUM>", where <NUM> is an integer
 137 * greater than 0, limits the maximum number of CPUs activated in
 138 * SMP mode to <NUM>.
 139 */
 140static int __init nosmp(char *str)
 141{
 142        max_cpus = 0;
 143        return 1;
 144}
 145
 146__setup("nosmp", nosmp);
 147
 148static int __init maxcpus(char *str)
 149{
 150        get_option(&str, &max_cpus);
 151        return 1;
 152}
 153
 154__setup("maxcpus=", maxcpus);
 155
 156static char * argv_init[MAX_INIT_ARGS+2] = { "init", NULL, };
 157char * envp_init[MAX_INIT_ENVS+2] = { "HOME=/", "TERM=linux", NULL, };
 158static const char *panic_later, *panic_param;
 159
 160extern struct obs_kernel_param __setup_start[], __setup_end[];
 161
 162static int __init obsolete_checksetup(char *line)
 163{
 164        struct obs_kernel_param *p;
 165
 166        p = __setup_start;
 167        do {
 168                int n = strlen(p->str);
 169                if (!strncmp(line, p->str, n)) {
 170                        if (p->early) {
 171                                /* Already done in parse_early_param?  (Needs
 172                                 * exact match on param part) */
 173                                if (line[n] == '\0' || line[n] == '=')
 174                                        return 1;
 175                        } else if (!p->setup_func) {
 176                                printk(KERN_WARNING "Parameter %s is obsolete,"
 177                                       " ignored\n", p->str);
 178                                return 1;
 179                        } else if (p->setup_func(line + n))
 180                                return 1;
 181                }
 182                p++;
 183        } while (p < __setup_end);
 184        return 0;
 185}
 186
 187/*
 188 * This should be approx 2 Bo*oMips to start (note initial shift), and will
 189 * still work even if initially too large, it will just take slightly longer
 190 */
 191unsigned long loops_per_jiffy = (1<<12);
 192
 193EXPORT_SYMBOL(loops_per_jiffy);
 194
 195static int __init debug_kernel(char *str)
 196{
 197        if (*str)
 198                return 0;
 199        console_loglevel = 10;
 200        return 1;
 201}
 202
 203static int __init quiet_kernel(char *str)
 204{
 205        if (*str)
 206                return 0;
 207        console_loglevel = 4;
 208        return 1;
 209}
 210
 211__setup("debug", debug_kernel);
 212__setup("quiet", quiet_kernel);
 213
 214static int __init loglevel(char *str)
 215{
 216        get_option(&str, &console_loglevel);
 217        return 1;
 218}
 219
 220__setup("loglevel=", loglevel);
 221
 222/*
 223 * Unknown boot options get handed to init, unless they look like
 224 * failed parameters
 225 */
 226static int __init unknown_bootoption(char *param, char *val)
 227{
 228        /* Change NUL term back to "=", to make "param" the whole string. */
 229        if (val) {
 230                /* param=val or param="val"? */
 231                if (val == param+strlen(param)+1)
 232                        val[-1] = '=';
 233                else if (val == param+strlen(param)+2) {
 234                        val[-2] = '=';
 235                        memmove(val-1, val, strlen(val)+1);
 236                        val--;
 237                } else
 238                        BUG();
 239        }
 240
 241        /* Handle obsolete-style parameters */
 242        if (obsolete_checksetup(param))
 243                return 0;
 244
 245        /*
 246         * Preemptive maintenance for "why didn't my mispelled command
 247         * line work?"
 248         */
 249        if (strchr(param, '.') && (!val || strchr(param, '.') < val)) {
 250                printk(KERN_ERR "Unknown boot option `%s': ignoring\n", param);
 251                return 0;
 252        }
 253
 254        if (panic_later)
 255                return 0;
 256
 257        if (val) {
 258                /* Environment option */
 259                unsigned int i;
 260                for (i = 0; envp_init[i]; i++) {
 261                        if (i == MAX_INIT_ENVS) {
 262                                panic_later = "Too many boot env vars at `%s'";
 263                                panic_param = param;
 264                        }
 265                        if (!strncmp(param, envp_init[i], val - param))
 266                                break;
 267                }
 268                envp_init[i] = param;
 269        } else {
 270                /* Command line option */
 271                unsigned int i;
 272                for (i = 0; argv_init[i]; i++) {
 273                        if (i == MAX_INIT_ARGS) {
 274                                panic_later = "Too many boot init vars at `%s'";
 275                                panic_param = param;
 276                        }
 277                }
 278                argv_init[i] = param;
 279        }
 280        return 0;
 281}
 282
 283static int __init init_setup(char *str)
 284{
 285        unsigned int i;
 286
 287        execute_command = str;
 288        /*
 289         * In case LILO is going to boot us with default command line,
 290         * it prepends "auto" before the whole cmdline which makes
 291         * the shell think it should execute a script with such name.
 292         * So we ignore all arguments entered _before_ init=... [MJ]
 293         */
 294        for (i = 1; i < MAX_INIT_ARGS; i++)
 295                argv_init[i] = NULL;
 296        return 1;
 297}
 298__setup("init=", init_setup);
 299
 300static int __init rdinit_setup(char *str)
 301{
 302        unsigned int i;
 303
 304        ramdisk_execute_command = str;
 305        /* See "auto" comment in init_setup */
 306        for (i = 1; i < MAX_INIT_ARGS; i++)
 307                argv_init[i] = NULL;
 308        return 1;
 309}
 310__setup("rdinit=", rdinit_setup);
 311
 312#ifndef CONFIG_SMP
 313
 314#ifdef CONFIG_X86_LOCAL_APIC
 315static void __init smp_init(void)
 316{
 317        APIC_init_uniprocessor();
 318}
 319#else
 320#define smp_init()      do { } while (0)
 321#endif
 322
 323static inline void setup_per_cpu_areas(void) { }
 324static inline void smp_prepare_cpus(unsigned int maxcpus) { }
 325
 326#else
 327
 328#ifdef __GENERIC_PER_CPU
 329unsigned long __per_cpu_offset[NR_CPUS] __read_mostly;
 330
 331EXPORT_SYMBOL(__per_cpu_offset);
 332
 333static void __init setup_per_cpu_areas(void)
 334{
 335        unsigned long size, i;
 336        char *ptr;
 337        unsigned long nr_possible_cpus = num_possible_cpus();
 338
 339        /* Copy section for each CPU (we discard the original) */
 340        size = ALIGN(__per_cpu_end - __per_cpu_start, SMP_CACHE_BYTES);
 341#ifdef CONFIG_MODULES
 342        if (size < PERCPU_ENOUGH_ROOM)
 343                size = PERCPU_ENOUGH_ROOM;
 344#endif
 345        ptr = alloc_bootmem(size * nr_possible_cpus);
 346
 347        for_each_possible_cpu(i) {
 348                __per_cpu_offset[i] = ptr - __per_cpu_start;
 349                memcpy(ptr, __per_cpu_start, __per_cpu_end - __per_cpu_start);
 350                ptr += size;
 351        }
 352}
 353#endif /* !__GENERIC_PER_CPU */
 354
 355#include <linux/ext3_fs_i.h>
 356#include <linux/skbuff.h>
 357
 358/* Called by boot processor to activate the rest. */
 359static void __init smp_init(void)
 360{
 361        unsigned int i;
 362
 363        /* FIXME: This should be done in userspace --RR */
 364        for_each_present_cpu(i) {
 365                if (num_online_cpus() >= max_cpus)
 366                        break;
 367                if (!cpu_online(i))
 368                        cpu_up(i);
 369        }
 370
 371        /* Any cleanup work */
 372        printk(KERN_INFO "Brought up %ld CPUs\n", (long)num_online_cpus());
 373        smp_cpus_done(max_cpus);
 374#if 0
 375        /* Get other processors into their bootup holding patterns. */
 376
 377        smp_commence();
 378#endif
 379
 380        printk(KERN_DEBUG "sizeof(vma)=%u bytes\n", (unsigned int) sizeof(struct vm_area_struct));
 381        printk(KERN_DEBUG "sizeof(page)=%u bytes\n", (unsigned int) sizeof(struct page));
 382        printk(KERN_DEBUG "sizeof(inode)=%u bytes\n", (unsigned int) sizeof(struct inode));
 383        printk(KERN_DEBUG "sizeof(dentry)=%u bytes\n", (unsigned int) sizeof(struct dentry));
 384        printk(KERN_DEBUG "sizeof(ext3inode)=%u bytes\n", (unsigned int) sizeof(struct ext3_inode_info));
 385        printk(KERN_DEBUG "sizeof(buffer_head)=%u bytes\n", (unsigned int) sizeof(struct buffer_head));
 386        printk(KERN_DEBUG "sizeof(skbuff)=%u bytes\n", (unsigned int) sizeof(struct sk_buff));
 387}
 388
 389#endif
 390
 391/*
 392 * We need to finalize in a non-__init function or else race conditions
 393 * between the root thread and the init thread may cause start_kernel to
 394 * be reaped by free_initmem before the root thread has proceeded to
 395 * cpu_idle.
 396 *
 397 * gcc-3.4 accidentally inlines this function, so use noinline.
 398 */
 399
 400static void noinline rest_init(void)
 401        __releases(kernel_lock)
 402{
 403        kernel_thread(init, NULL, CLONE_FS | CLONE_SIGHAND);
 404        numa_default_policy();
 405        unlock_kernel();
 406
 407        /*
 408         * The boot idle thread must execute schedule()
 409         * at least one to get things moving:
 410         */
 411        preempt_enable_no_resched();
 412        schedule();
 413        preempt_disable();
 414
 415        /* Call into cpu_idle with preempt disabled */
 416        cpu_idle();
 417} 
 418
 419/* Check for early params. */
 420static int __init do_early_param(char *param, char *val)
 421{
 422        struct obs_kernel_param *p;
 423
 424        for (p = __setup_start; p < __setup_end; p++) {
 425                if (p->early && strcmp(param, p->str) == 0) {
 426                        if (p->setup_func(val) != 0)
 427                                printk(KERN_WARNING
 428                                       "Malformed early option '%s'\n", param);
 429                }
 430        }
 431        /* We accept everything at this stage. */
 432        return 0;
 433}
 434
 435/* Arch code calls this early on, or if not, just before other parsing. */
 436void __init parse_early_param(void)
 437{
 438        static __initdata int done = 0;
 439        static __initdata char tmp_cmdline[COMMAND_LINE_SIZE];
 440
 441        if (done)
 442                return;
 443
 444        /* All fall through to do_early_param. */
 445        strlcpy(tmp_cmdline, saved_command_line, COMMAND_LINE_SIZE);
 446        parse_args("early options", tmp_cmdline, NULL, 0, do_early_param);
 447        done = 1;
 448}
 449
 450/*
 451 *      Activate the first processor.
 452 */
 453
 454static void __init boot_cpu_init(void)
 455{
 456        int cpu = smp_processor_id();
 457        /* Mark the boot cpu "present", "online" etc for SMP and UP case */
 458        cpu_set(cpu, cpu_online_map);
 459        cpu_set(cpu, cpu_present_map);
 460        cpu_set(cpu, cpu_possible_map);
 461}
 462
 463void __init __attribute__((weak)) smp_setup_processor_id(void)
 464{
 465}
 466
 467asmlinkage void __init start_kernel(void)
 468{
 469        char * command_line;
 470        extern struct kernel_param __start___param[], __stop___param[];
 471
 472        smp_setup_processor_id();
 473
 474        /*
 475         * Need to run as early as possible, to initialize the
 476         * lockdep hash:
 477         */
 478        unwind_init();
 479        lockdep_init();
 480
 481        local_irq_disable();
 482        early_boot_irqs_off();
 483        early_init_irq_lock_class();
 484
 485/*
 486 * Interrupts are still disabled. Do necessary setups, then
 487 * enable them
 488 */
 489        lock_kernel();
 490        boot_cpu_init();
 491        page_address_init();
 492        printk(KERN_NOTICE);
 493        printk(linux_banner);
 494        setup_arch(&command_line);
 495        setup_per_cpu_areas();
 496        smp_prepare_boot_cpu(); /* arch-specific boot-cpu hooks */
 497
 498        /*
 499         * Set up the scheduler prior starting any interrupts (such as the
 500         * timer interrupt). Full topology setup happens at smp_init()
 501         * time - but meanwhile we still have a functioning scheduler.
 502         */
 503        sched_init();
 504        /*
 505         * Disable preemption - early bootup scheduling is extremely
 506         * fragile until we cpu_idle() for the first time.
 507         */
 508        preempt_disable();
 509        build_all_zonelists();
 510        page_alloc_init();
 511        printk(KERN_NOTICE "Kernel command line: %s\n", saved_command_line);
 512        parse_early_param();
 513        parse_args("Booting kernel", command_line, __start___param,
 514                   __stop___param - __start___param,
 515                   &unknown_bootoption);
 516        sort_main_extable();
 517        trap_init();
 518        rcu_init();
 519        init_IRQ();
 520        pidhash_init();
 521        init_timers();
 522        hrtimers_init();
 523        softirq_init();
 524        timekeeping_init();
 525        time_init();
 526        profile_init();
 527        if (!irqs_disabled())
 528                printk("start_kernel(): bug: interrupts were enabled early\n");
 529        early_boot_irqs_on();
 530        local_irq_enable();
 531
 532        /*
 533         * HACK ALERT! This is early. We're enabling the console before
 534         * we've done PCI setups etc, and console_init() must be aware of
 535         * this. But we do want output early, in case something goes wrong.
 536         */
 537        console_init();
 538        if (panic_later)
 539                panic(panic_later, panic_param);
 540
 541        lockdep_info();
 542
 543        /*
 544         * Need to run this when irqs are enabled, because it wants
 545         * to self-test [hard/soft]-irqs on/off lock inversion bugs
 546         * too:
 547         */
 548        locking_selftest();
 549
 550#ifdef CONFIG_BLK_DEV_INITRD
 551        if (initrd_start && !initrd_below_start_ok &&
 552                        initrd_start < min_low_pfn << PAGE_SHIFT) {
 553                printk(KERN_CRIT "initrd overwritten (0x%08lx < 0x%08lx) - "
 554                    "disabling it.\n",initrd_start,min_low_pfn << PAGE_SHIFT);
 555                initrd_start = 0;
 556        }
 557#endif
 558        vfs_caches_init_early();
 559        cpuset_init_early();
 560        mem_init();
 561        kmem_cache_init();
 562        setup_per_cpu_pageset();
 563        numa_policy_init();
 564        if (late_time_init)
 565                late_time_init();
 566        calibrate_delay();
 567        pidmap_init();
 568        pgtable_cache_init();
 569        prio_tree_init();
 570        anon_vma_init();
 571#ifdef CONFIG_X86
 572        if (efi_enabled)
 573                efi_enter_virtual_mode();
 574#endif
 575        fork_init(num_physpages);
 576        proc_caches_init();
 577        buffer_init();
 578        unnamed_dev_init();
 579        key_init();
 580        security_init();
 581        vfs_caches_init(num_physpages);
 582        radix_tree_init();
 583        signals_init();
 584        /* rootfs populating might need page-writeback */
 585        page_writeback_init();
 586#ifdef CONFIG_PROC_FS
 587        proc_root_init();
 588#endif
 589        cpuset_init();
 590        taskstats_init_early();
 591        delayacct_init();
 592
 593        check_bugs();
 594
 595        acpi_early_init(); /* before LAPIC and SMP init */
 596
 597        /* Do the rest non-__init'ed, we're now alive */
 598        rest_init();
 599}
 600
 601static int __initdata initcall_debug;
 602
 603static int __init initcall_debug_setup(char *str)
 604{
 605        initcall_debug = 1;
 606        return 1;
 607}
 608__setup("initcall_debug", initcall_debug_setup);
 609
 610#ifdef CONFIG_BOOT_DELAY
 611
 612unsigned int boot_delay = 0; /* msecs delay after each printk during bootup */
 613extern long preset_lpj;
 614unsigned long long printk_delay_msec = 0; /* per msec, based on boot_delay */
 615
 616static int __init boot_delay_setup(char *str)
 617{
 618        unsigned long lpj = preset_lpj ? preset_lpj : 1000000; /* some guess */
 619        unsigned long long loops_per_msec = lpj / 1000 * CONFIG_HZ;
 620
 621        get_option(&str, &boot_delay);
 622        if (boot_delay > 10 * 1000)
 623                boot_delay = 0;
 624
 625        printk_delay_msec = loops_per_msec;
 626        printk("boot_delay: %u, preset_lpj: %ld, lpj: %lu, CONFIG_HZ: %d, printk_delay_msec: %llu\n",
 627                boot_delay, preset_lpj, lpj, CONFIG_HZ, printk_delay_msec);
 628
 629        return 1;
 630}
 631__setup("boot_delay=", boot_delay_setup);
 632
 633#endif
 634
 635struct task_struct *child_reaper = &init_task;
 636
 637extern initcall_t __initcall_start[], __initcall_end[];
 638
 639static void __init do_initcalls(void)
 640{
 641        initcall_t *call;
 642        int count = preempt_count();
 643
 644        for (call = __initcall_start; call < __initcall_end; call++) {
 645                char *msg = NULL;
 646                char msgbuf[40];
 647                int result;
 648
 649                if (initcall_debug) {
 650                        printk("Calling initcall 0x%p", *call);
 651                        print_fn_descriptor_symbol(": %s()",
 652                                        (unsigned long) *call);
 653                        printk("\n");
 654                }
 655
 656                result = (*call)();
 657
 658                if (result && result != -ENODEV && initcall_debug) {
 659                        sprintf(msgbuf, "error code %d", result);
 660                        msg = msgbuf;
 661                }
 662                if (preempt_count() != count) {
 663                        msg = "preemption imbalance";
 664                        preempt_count() = count;
 665                }
 666                if (irqs_disabled()) {
 667                        msg = "disabled interrupts";
 668                        local_irq_enable();
 669                }
 670                if (msg) {
 671                        printk(KERN_WARNING "initcall at 0x%p", *call);
 672                        print_fn_descriptor_symbol(": %s()",
 673                                        (unsigned long) *call);
 674                        printk(": returned with %s\n", msg);
 675                }
 676        }
 677
 678        /* Make sure there is no pending stuff from the initcall sequence */
 679        flush_scheduled_work();
 680}
 681
 682/*
 683 * Ok, the machine is now initialized. None of the devices
 684 * have been touched yet, but the CPU subsystem is up and
 685 * running, and memory and process management works.
 686 *
 687 * Now we can finally start doing some real work..
 688 */
 689static void __init do_basic_setup(void)
 690{
 691        /* drivers will send hotplug events */
 692        init_workqueues();
 693        usermodehelper_init();
 694        driver_init();
 695
 696#ifdef CONFIG_SYSCTL
 697        sysctl_init();
 698#endif
 699
 700        do_initcalls();
 701}
 702
 703static int __initdata nosoftlockup;
 704
 705static int __init nosoftlockup_setup(char *str)
 706{
 707        nosoftlockup = 1;
 708        return 1;
 709}
 710__setup("nosoftlockup", nosoftlockup_setup);
 711
 712static void do_pre_smp_initcalls(void)
 713{
 714        extern int spawn_ksoftirqd(void);
 715#ifdef CONFIG_SMP
 716        extern int migration_init(void);
 717
 718        migration_init();
 719#endif
 720        spawn_ksoftirqd();
 721        if (!nosoftlockup)
 722                spawn_softlockup_task();
 723}
 724
 725static void run_init_process(char *init_filename)
 726{
 727        argv_init[0] = init_filename;
 728        execve(init_filename, argv_init, envp_init);
 729}
 730
 731static int init(void * unused)
 732{
 733        lock_kernel();
 734        /*
 735         * init can run on any cpu.
 736         */
 737        set_cpus_allowed(current, CPU_MASK_ALL);
 738        /*
 739         * Tell the world that we're going to be the grim
 740         * reaper of innocent orphaned children.
 741         *
 742         * We don't want people to have to make incorrect
 743         * assumptions about where in the task array this
 744         * can be found.
 745         */
 746        child_reaper = current;
 747
 748        smp_prepare_cpus(max_cpus);
 749
 750        do_pre_smp_initcalls();
 751
 752        smp_init();
 753        sched_init_smp();
 754
 755        cpuset_init_smp();
 756
 757        /*
 758         * Do this before initcalls, because some drivers want to access
 759         * firmware files.
 760         */
 761        populate_rootfs();
 762
 763        do_basic_setup();
 764
 765        /*
 766         * check if there is an early userspace init.  If yes, let it do all
 767         * the work
 768         */
 769
 770        if (!ramdisk_execute_command)
 771                ramdisk_execute_command = "/init";
 772
 773        if (sys_access((const char __user *) ramdisk_execute_command, 0) != 0) {
 774                ramdisk_execute_command = NULL;
 775                prepare_namespace();
 776        }
 777
 778        /*
 779         * Ok, we have completed the initial bootup, and
 780         * we're essentially up and running. Get rid of the
 781         * initmem segments and start the user-mode stuff..
 782         */
 783        free_initmem();
 784        unlock_kernel();
 785        mark_rodata_ro();
 786        system_state = SYSTEM_RUNNING;
 787        numa_default_policy();
 788
 789        if (sys_open((const char __user *) "/dev/console", O_RDWR, 0) < 0)
 790                printk(KERN_WARNING "Warning: unable to open an initial console.\n");
 791
 792        (void) sys_dup(0);
 793        (void) sys_dup(0);
 794
 795        if (ramdisk_execute_command) {
 796                run_init_process(ramdisk_execute_command);
 797                printk(KERN_WARNING "Failed to execute %s\n",
 798                                ramdisk_execute_command);
 799        }
 800
 801        /*
 802         * We try each of these until one succeeds.
 803         *
 804         * The Bourne shell can be used instead of init if we are 
 805         * trying to recover a really broken machine.
 806         */
 807        if (execute_command) {
 808                run_init_process(execute_command);
 809                printk(KERN_WARNING "Failed to execute %s.  Attempting "
 810                                        "defaults...\n", execute_command);
 811        }
 812        run_init_process("/sbin/init");
 813        run_init_process("/etc/init");
 814        run_init_process("/bin/init");
 815        run_init_process("/bin/sh");
 816
 817        panic("No init found.  Try passing init= option to kernel.");
 818}
 819