1 / 16 L inux-mips 启动流程- 存储相关 linux 内核启动的第一个阶段是从/arch/mips/kernel/ 文件开始的。而此处正是内核入口函数 kernel_entry(), 该函数定义在/arch/mips/kernel/ 文件里。 kernel_entry() 函数是体系结构相关的汇编语言, 它首先初始化内核堆栈段, 来为创建系统中的第一个进程进行准备, 接着用一段循环将内核映像的未初始化数据段( bss 段在_edata 和_end 之间)清零,最后跳转到/arch/mips/kernel/ 中的 start_kernel() 初始化硬件平台相关的代码。下面讲述 start_kernel() 函数。在这个函数中跟内存初始化的函数是 setup_arch ()。第一部分:以函数调用关系为线索下面是函数之间调用关系的框图: 第一章: start_kenel()->setup_arch() setup_arch(&command_line); 每种体系结构都有自己的 setup_arch() 函数, 这些是体系结构相 2 / 16 关的。【如何确定编译那个体系结构的 setup_arch() 函数呢?主要由 linux 源码树顶层 Makefile 中 ARCH 变量来决定的。例如: MIPS 体系结构的。 SUBARCH := mips ARCH ?= $(SUBARCH) 】。 void __init setup_arch(char **cmdline_p) { cpu_probe(); 调用函数 cpu_probe(), 该函数通过 MIPS CPU 的 PRID 寄存器来确定 CPU 类型, 从而确定使用的指令集和其他一些 CPU 参数,如 TLB 等 prom_init(); prom_init() 函数是和硬件相关的,做一些低层的初始化,接受引导装载程序传给内核的参数, 确定 mips_machgroup , mips_machtype 这两个变量,这两个变量分别对应着相应的芯片组合开发板; cpu_report(); 打印 cpu_probe() 函数检测到的 CPU 的 Processor ID 。如果有浮点处理器,也打印浮点处理器的 Processor ID。【应用程序通过终端接口设备使用特定的接口规程与终端进行交互, 与操作系统内核本身交互的终端称为控制台, 它可以是内核本身的内部显示终端,也可以是通过串口连接的外部哑终端。由于大多数情况下控制台都是内核显示终端,因此内核显示终端也常常直接称为控制台。内核终端对用户来说具有若干个虚拟终端子设备,它们共享同一物理终端, 但同一时刻只能有一个虚拟终端操作硬件屏幕。宏 CONFIG_VT 的意思是否支持虚拟终端。当配置了宏 CONFIG_VGA_CONSOLE 时为内核本身的内部显示终端。当配置了宏 CONFIG_DUMMY_CONSOLE 时为通过串口连接的外部哑终端。用变量 conswitchp 来进行指定。#if defined(CONFIG_VT) #if defined(CONFIG_VGA_CONSOLE) conswitchp = &vga_con; #elif defined(CONFIG_DUMMY_CONSOLE) conswitchp = &dummy_con; #endif #endif 】 arch_mem_init(cmdline_p); 对内存进行初始化。 resource_init(); 这个函数遍历每一个内存空间范围(物理地址) ,在资源管理器中进行资源申请,并对内核代码和数据段进行资源申请。#ifdef CONFIG_SMP 3 / 16 plat_smp_setup(); #endif }/ /start_kernel 函数到此结束(以下均是)。以下图片是截自版本 linux- 内核版本。第二章: start_kenel()->setup_arch()->arch_mem_init() 接下来我们看看 arch_mem_init () 函数中的函数调用关系及各自的功能。 static void __init arch_mem_init(char **cmdline_p) { plat_mem_setup(); 这个函数是平台具体相关的,移植内核需要自己手动编写。对于开发板的 CPU 和 board 的初始化都是在这个函数中进行的。 detects the memory configuration and will record detected memory areas using add_memory_region 。就是在这里面建立了内存的初始面貌
linux_mips启动流程_存储相关 来自淘豆网m.daumloan.com转载请标明出处.