韦东山第10课-内核启动

来源:互联网 发布:windows电脑装mac系统 编辑:程序博客网 时间:2024/06/03 05:07


1 判断内核是否支持cpu,是否支持单板

u-boot/armlinux.c 的theKernel (0, bd->bi_arch_number, bd->bi_boot_params); 是uboot启动时的uboot的结束点,kernel的开始点,bd->bi_arch_number指的是支持的挡板类型。

ENTRY(stext)

msr cpsr_c, #PSR_F_BIT | PSR_I_BIT | SVC_MODE @ ensure svc mode

@ and irqs disabled

mrc p15, 0, r9, c0, c0@ get processor id

bl __lookup_processor_type@ r5=procinfo r9=cpuid

movs r10, r5@ invalid processor (r5=0)?

beq __error_p@ yes, error 'p'

bl __lookup_machine_type@ r5=machinfo

movs r8, r5@ invalid machine (r5=0)?

beq __error_a@ yes, error 'a'

bl __create_page_tables

__lookup_processor_type  是否支持该cpu

__lookup_machine_type  是否支持该单板

gd->bd->bi_arch_number = MACH_TYPE_SMDK2410;(board\smdk2410\smdk2410.c)(2410的cpu类型)

#define MACH_TYPE_SMDK2410             193  (include\asm-arm\mach-types.h) (2410的cpu类型) 在uboot中

__lookup_machine_type:

adr r3, 3b   //3b表示的是地址 (3:.long)如下

ldmia r3, {r4, r5, r6}

sub r3, r3, r4

3: .long .

.long __arch_info_begin

.long __arch_info_end

(linux\arch\arm\kernel\vmlinux.lds.S) :

         __arch_info_begin = .;

*(.arch.info.init)

__arch_info_end = .;


#define MACHINE_START(_type,_name) \

static const struct machine_desc __mach_desc_##_type\

 __used \

 __attribute__((__section__(".arch.info.init"))) = {\

.nr = MACH_TYPE_##_type,\

.name = _name,



#define MACHINE_END \

};


MACHINE_START(S3C2440, "SMDK2440")

/* Maintainer: Ben Dooks <ben@fluff.org> */

.phys_io = S3C2410_PA_UART,

.io_pg_offst = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,

.boot_params = S3C2410_SDRAM_PA + 0x100,



.init_irq = s3c24xx_init_irq,

.map_io = smdk2440_map_io,

.init_machine = smdk2440_machine_init,

.timer = &s3c24xx_timer,

MACHINE_END


struct machine_desc {

/*

* Note! The first four elements are used

* by assembler code in head-armv.S

*/

unsigned int nr;/* architecture number*/

unsigned int phys_io;/* start of physical io*/

unsigned int io_pg_offst;/* byte offset for io 

* page tabe entry*/



const char *name;/* architecture name*/

unsigned long boot_params;/* tagged list*/



unsigned int video_start;/* start of video RAM*/

unsigned int video_end;/* end of video RAM*/



unsigned int reserve_lp0 :1;/* never has lp0*/

unsigned int reserve_lp1 :1;/* never has lp1*/

unsigned int reserve_lp2 :1;/* never has lp2*/

unsigned int soft_reboot :1;/* soft reboot*/

void (*fixup)(struct machine_desc *,

struct tag *, char **,

struct meminfo *);

void (*map_io)(void);/* IO mapping function*/

void (*init_irq)(void);

struct sys_timer*timer;/* system tick timer*/

void (*init_machine)(void);

};

uboot传入的参数bd->bi_arch_number正好和内核中的machine_desc类型(内核中编辑进去谁的machine_desc就表示支持哪种单板)对应。驱动内核时,内核的类型要和uboot传入的一一比较,看是否支持单板。

2 内核启动流程

1 判断是否支持内核

2 判断是否支持单板

3 建立页表,

4 启动mmu 因为原来uboot的地址和单板实际地址不一样要地址映射

5 跳到start_kernel

arch/arm/kernel/head.S


start_kernel

      setup_arch                         //解析uboot传入的启动参数

      setup_command_line         //解析uboot传入的启动参数

      rest_init

           kernel_init

                prepare_namespace

                        mount_root        //挂接根文件系统

                init_post

我们的uboot,内核,文件系统是在flash里写死的那么程序怎么知道内核的地址呢。因为在程序里有boot,内核,文件系统的地址;我们烧写flash的时候是根据代码写的地址烧写的。

问:我如何查找地址表呢?

答:开机启动时,串口肯定会打印出内核的相关设置信息,如:


然后可以在源代码中查找“bootloader”字样(grep “”bootloader“” * -nR),查看在哪个文件夹中有(arch/arm/plat-s3c24xx/common_amdk.c)



uboot在.arch.info.init 段处存放支持的类型,

每一个machone_desc都会被放在.arch.info.init 段处,其指的是内核支持的芯片类型,然后__lookup_processor_type函数挨着比较,没有一样的说明不支持。




原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 魔兽世界神器满级任务放弃了怎么办 魔兽世界神器满级任务没接到怎么办 情侣空间上的照片删了怎么办 微信好友群群主把你踢出房间怎么办 我被车撞了对方把现场破坏该怎么办 美术生专业分可以文化分不行怎么办 小狗又吐又拉不吃东西怎么办 狗狗把脖子挠破了怎么办 几分钟我的手机疯狂收到短信怎么办 初中孩子沉迷动漫及画动漫画怎么办 打仗在派出所保释出来人跑了怎么办 贴门槛石瓷砖贴多了要怎么办 建设银行中职学生资助卡丢了怎么办 建行网银u盾丢了怎么办 深水区换气时喝了口水怎么办 撞到别人车了 我走了 怎么办 自己班同学被自己取好多外号怎么办 刚学会走路的宝宝脚外八字怎么办 宝宝两岁走路膝盖弯曲不直怎么办 一岁多的宝宝走路o型腿怎么办 21个月的宝宝走路o型腿怎么办 宝宝十一个月了0型腿怎么办 14个月宝宝o型腿怎么办 深蹲了三个月大腿变粗了怎么办 脚踢球时被踢肿了变紫了怎么办 没钱去健身房想要练出好身材怎么办 群里有人发反政府视频怎么办 部队取消番号后之前军人档案怎么办 新疆武警黄金部队新兵改革后怎么办 别人偷了自己的东西没有证据怎么办 家里项链被邻居偷了没有证据怎么办 知道是谁偷钱都是没有证据怎么办 武警驾照开地方车被交警拦了怎么办 双手擦了纤体瘦身膏辣疼怎么办 乳房全切术后切口裂开化脓怎么办 擦了锁水的霜之后出汗怎么办 用完瘦脸霜感觉脸部又痒又烧怎么办 嘴角起好多的小炮泡怎么办快好 DNF龙腾光环领错角色怎么办 海盗来了卡在新手奖励怎么办 海盗来了获得新手奖励卡了怎么办