Linux内核启动解析:从u-boot到OS接管

需积分: 9 6 下载量 2 浏览量 更新于2024-09-24 收藏 99KB DOC 举报
"Linux2.6内核启动流程及其在ARM架构下的细节" 在Linux操作系统中,内核的启动流程是一个复杂且关键的过程,它决定了系统的初始化和运行环境的建立。在Linux 2.6版本中,这个过程尤其重要,因为它需要处理各种硬件初始化和驱动程序的加载。本节将深入探讨Linux 2.6内核在ARM架构下的启动流程,以及与initrd(初始RAM磁盘)相关的配置。 首先,让我们从内核的加载开始。在ARM架构中,内核通常以压缩的形式存储在引导加载程序(如u-boot)加载的位置,例如`arch/arm/boot/compressed/`目录下的文件。在这个阶段,`start.S`文件包含汇编语言代码,负责解压缩内核并转移到未压缩的内核镜像(vmlinux)。 当内核开始执行时,它首先检查处理器的状态。如果通过u-boot引导,系统已处于超级用户模式(SVC32模式),否则需要通过特定的指令切换到该模式。接着,内核会确保中断是关闭的,并进行必要的模式设置,以防止引导加载程序(如Angel)重新介入。 然后,内核开始处理链接地址和实际运行地址之间的差异。在ARM架构中,内核可能被解压缩到不同的内存位置运行,因此需要计算和更新寄存器,特别是r5寄存器中的zImage基地址,以适应这种变化。 关于initrd,这是在内核启动时提供额外文件系统支持的一种机制。在文档中,我们看到`CONFIG_BLK_DEV_INITRD`宏用于检查是否启用了initrd。如果initrd的起始地址低于最低物理页面(min_low_pfn),并且不满足`initrd_below_start_ok`条件,那么内核将打印警告信息并禁用initrd,以防止它覆盖其他重要数据。 启动流程继续涉及设置页表、初始化内存管理、设备检测和驱动程序加载等步骤。一旦这些基础服务准备就绪,内核将开始执行初始化脚本,加载模块,最终达到用户空间,启动第一个进程(通常是init)。 总结来说,Linux 2.6内核在ARM架构下的启动流程涉及解压缩、模式切换、地址修正、初始化内存管理、处理initrd以及进一步的系统设置。这个过程需要精确的控制和计算,以确保系统的稳定和安全启动。对于开发者和系统管理员来说,理解这一过程对于调试问题和优化系统性能至关重要。

(1)在内核中实现缺页次数统计: 1.cd /usr/sec/linux-2.6.32.60 // 切换到预编译内核 2.sudo gedit arch/x86/mm/fault.c / /编辑fault.c 3.Unsigned long volatile pfcount //在fault.c中定义缺页次数全局变量. 4.将pfcount加入到do_page_fault中,用以统计缺页次数. 5.sudo gedit include/linux/mm.h //声明全局变量pfcount到头文件mm.h. 6.在extern int page_cluster下面添加代码 Extern unsigned long volatile pfcount; 7.Sudo gedit kernel/kallsym.c // 导出pfcount全局变量,整个内核都可以访问. 8.在最后一行添加代码EXPORT_SYMBOL(pfcount); (2)编译安装新内核: 1.sudo make mrproper //删除原来编译产生的垃圾 2.sudo cp /boot/config-3.2.0-29-generic-pag .config //导入原系统的内核配置 3.sudo make odlconfig; //更改配置 4.Sudo make clean; 5.make bzImage //编译内核 6.make modules //编译内核模块 7.make modules_install //安装内核模块 8.make install //安装内核 9.Sudo reboot //重新启动Linux系统 (3)新建内核模块,通过/proc实现用户态下查看缺页次数: 1.make source //创建source文件,存放编写的模块程序. 2.cd source/ //切换到source目录. 3.gedit pf.c// 新建用于构建模块的代码 4.Gedit Makefile //构建Makefile 5.在Makefile中添加 obj-m := pf.o 6.Sudo make -C /usr/src/linux-2.6.32.60 SUBDIRS=$PWD modules //编译、构建内核模块 7.sudo insmod pf.ko //加载模块到内核 8.sudo lsmod | grep pf //验证pf内核模块是否加载到内核进程中,运行命令出现pf信息说明加载成功 9.cat /proc/pf/pfcount //查看缺页统计次数通过以上步骤,你能帮我解读实验的结果吗

2023-06-08 上传