其调用顺序如下:
start_kernel》setup_arch》init_machine》arch_initcall(customize_machine)
786arch_initcall(customize_machine);
787
788void __init setup_arch(char **cmdline_p)
789{
790 struct tag *tags = (struct tag *)&init_tags;
791 struct machine_desc *mdesc;
792 char *from = default_command_line;
793
794 setup_processor();
795 mdesc = setup_machine(machine_arch_type);
//根据machine id获得移植时定义的machine desc结构
796 machine_name = mdesc->name;
797
798 if (mdesc->soft_reboot)
799 reboot_setup("s");
800
801 if (__atags_pointer)
802 tags = phys_to_virt(__atags_pointer);
803 else if (mdesc->boot_params)
804 tags = phys_to_virt(mdesc->boot_params);
805
806 /*
807 * If we have the old style parameters, convert them to
808 * a tag list.
809 */
810 if (tags->hdr.tag != ATAG_CORE)
811 convert_to_tag_list(tags);
812 if (tags->hdr.tag != ATAG_CORE)
813 tags = (struct tag *)&init_tags;
814
815 if (mdesc->fixup)
816 mdesc->fixup(mdesc, tags, &from, &meminfo);
817
818 if (tags->hdr.tag == ATAG_CORE) {
819 if (meminfo.nr_banks != 0)
820 squash_mem_tags(tags);
821 save_atags(tags);
822 parse_tags(tags);
823 }
824
825 init_mm.start_code = (unsigned long) &_text;
826 init_mm.end_code = (unsigned long) &_etext;
827 init_mm.end_data = (unsigned long) &_edata;
828 init_mm.brk = (unsigned long) &_end;
829
830 memcpy(boot_command_line, from, COMMAND_LINE_SIZE);
831 boot_command_line[COMMAND_LINE_SIZE-1] = \'/0\';
832 parse_cmdline(cmdline_p, from);
833 paging_init(&meminfo, mdesc);
834 request_standard_resources(&meminfo, mdesc);
835
836#ifdef CONFIG_SMP
837 smp_init_cpus();
838#endif
839
840 cpu_init();
841
842 /*
843 * Set up various architecture-specific pointers
844 */
845 init_arch_irq = mdesc->init_irq;
846 system_timer = mdesc->timer;
847 init_machine = mdesc->init_machine;
//对init_machine指针赋值
848
849#ifdef CONFIG_VT
850#if defined(CONFIG_VGA_CONSOLE)
851 conswitchp = &vga_con;
852#elif defined(CONFIG_DUMMY_CONSOLE)
853 conswitchp = &dummy_con;
854#endif
855#endif
856}
详解Linux2.6内核中基于platform机制的驱动模型 (经典) (14)
内容版权声明:除非注明,否则皆为本站原创文章。