我们可以将内核代码分为3个部分:1.arch是cpu架构相关的部分。2.drivers是硬件驱动部分。3,别的部分,主要进行硬件弱相关或无相关的内容。
arch文件夹中的主要内容:
mach (machine architecture)机器架构相关文件arch/arm中的mach-xxx就是一个machine,一个开发板一个机器码。plat(platform)平台相关文件一个平台就是一个SOC相关的内容与内设外设相关,驱动分层与分离思想使得驱动放在drivers文件夹,数据放在plat文件夹。include是与架构相关的头文件,内核通用的头文件在内核源代码属=树kernel中,不在arch、中。
#includ <linux/keeernel.h>位置在kernel/include/linux/kernel
#include <plat/s5pv210.h>位置在kernel/arch/arm/plat-s5p/include/plat/s5pv210.h中
内核配置的解压地址应等于链接地址,链接地址是一个虚拟地址,解压地址是物理地址,在head.S中可以看到,自解压地址存放在mach/Makefile.boot中。
内核机器码确定,机器码在mach-xxx中,用MACHINE_START宏进行编译,以MACHINE_START开始~MACHINE_END结束。使用结构体进行封装。
MACHINE_START(_type,"_name");用宏定义一个类型为machine_dosc类型,名为__mach_dese_xxx的结构体变量,会被定义到arch.info.init段(vmlinux.lds.s)。
一个结构体可以定义一个cpu机器码mach-xxx.c machine_desc_xxx。
在结构体中:init_machin=xxx_machine_init。是一个机器init函数,包括初始化的种种,初始化硬件的信息,网卡什么的都有,硬件问题可以在这个函数中进行分析。
oops内核致命错误信息,通过PC与LR进行失败分析,PC与LR会指向某符号指出的错误点。
linux内核模块错误可针对配置项menuconfig进行分析,menuconfig会正针对配置进行改变,本质是一堆宏条件编译,再根据这些配置编译出zImage。
kernel panic内核错误,backtre回溯信息得到错误点。
unknow_block(0,0) (主设备号,从设备号),但0,0说明没找到错误点
如果要挂载或者使用一个东西,这个东西(设备)用不了可以去考虑其依赖的设备驱动是否正确。
SD/iNand本身是由2一个个扇区组成。SD卡的0扇区存放MBR(分区信息),1扇区存放BL1(也就是uboot的第一部分)。
iNand分区依赖于fdisk指令进行分区,iNand分区已经分好了,所以uboot不会传递这个信息,Nand分区依赖kernel与uboot分区表进行传递。
xxx_machine_init是所有硬件的初始化函数,Devs.c中记录了相关的一些硬件连接方法的配置(数据),map.h记录了IO基地址与bank值(链接)。
内核上电:设置模式、校验cpu、校验机器码、校验tag传递、创建页表、清bss段等最后用b strart_kernel跳转到2阶段。
插入一个调试方法:led调试函数适用于X210开发板
ldr r3 = 0x11111111
ldr r4 = 0xE0200240
str r3 ,[r4]ldr r3 = oxff
ldr r4 = 0xE0200244
str r3 ,[r4]
mov pc,lr <-返回