head.s

原创 2012年03月26日 03:07:34
  • stack_start,定义在kernel/sched.c中。使用lss指令加载,所以stack_start为一个结构体,低字节为long*,高位为short。实际48位长地址为0x10:user_stack。user_stack为sched.c中定义的数组。
  • 设置idt,256个描述符都指向ignore_int中断例程,显示一句消息,中断门描述符,包含48位长指针
  • 设置gdt,与setup中的基本一样,段长变为16M。
    • 代码段描述符。特权值0,存在,可读非一致性代码段,段长度(段限长+1)16M,颗粒度G=1(4kb),D=1(32位地址,32位或8位数据)
    • 数据段描述符。特权值0,存在,非下扩段,可读可写,未访问,B=1使用32位esp,G=1(4kb),段长度(16M)
    重新加载gdt后,应该将各个寄存器重新赋值,以刷新影子寄存器的内容。0.12中没有使用jmp指令刷新CS段寄存器,谨记,修改gdt表后要重新加载相关寄存器
  • 测试A20地址线是否打开。比较0x000000与0x100000的内容,若果相等,[0x000000]的内容增加1,再循环比较。若果无法寻址则陷入死循环。
  • 设置页目录表及对应的页表,设置cr0让cpu进入分页机制。页目录表位于0x00000000;紧接着是4个页表,分别存在于0x00001000,0x00002000,0x00003000,0x00004000。页目录,页表的属性一样:可供任意特权级访问(U/S=1),可读,可写或可执行(R/W=1),存在(P=1)。在为页表建立映射时,使用了一个技巧,从16M-4k开始建立,这样可以根据每次减去1024,判断目的地址是否大于等于0,大于等于0则继续。充分利用标志寄存器的值,注意0标志的作用,而不需像递增时那样再与16M比较。根据已有的条件作判断,不要再做无用功。
  • 进入main()函数。通过push传递main的参数,包括main的地址。在after_page_tabes后,ret进入main。在main地址之前压了,envp,arvp指针和argc的值,还有一个当main()以外返回时的返回地址,让其死循环。

<Linux>Linux内核启动分析(一)——head.S

之前我们说到u-boot的最终目的是将内核从flash中读出,并且启动内核。那么内核一旦开始启动之后,就没有u-boot什么事情了,控制权就交给了内核,那么先来明确一下内核要做的事情:运行用户程序,而...
  • Stephen_Lu_Fahai
  • Stephen_Lu_Fahai
  • 2017年04月13日 21:09
  • 458

ARMv8 Linux内核head.S源码分析

ARMv8 Linue 内核Head.S主要工作内容: 1、 从el2特权级退回到el1 2、 确认处理器类型 3、 计算内核镜像的起始物理地址及物理地址与虚拟地址之间的偏移 4、 验证设备树的地址是...
  • qianlong4526888
  • qianlong4526888
  • 2013年09月03日 11:55
  • 7717

mips体系 head.S

内核启动过程总结 之前配置编译过内核源代码,在交叉编译源代码后产生了三个文件(还有其他文件)分别是vmlinuz、vmlinux、vmlinux32,其中vmlinuz是可引导的、压缩了的内核,...
  • edward1253149151
  • edward1253149151
  • 2013年04月02日 20:06
  • 1166

arm-linux head.s 分析 基于mini2440 uboot后的解压过程

/*  *  linux/arch/arm/boot/compressed/head.S  *  *  Copyright (C) 1996-2002 Russell King  *  Cop...
  • dp__mcu
  • dp__mcu
  • 2015年01月11日 16:45
  • 775

Linux 内核启动过程--head.S(arch/xxx/kernel下的)

由上篇的分析可以知道,uImage是zImage加上64字节的头信息得到的,而zImage又是compressed下的vmlinux经过objcopy得到的,compressed下的vmlinux是由...
  • linchuanzhi_886
  • linchuanzhi_886
  • 2015年04月04日 18:33
  • 1323

linux kernel head.S文件解析

.text#include #include #include #include #include #include #include #include #include #include //初始化...
  • YUAN1125
  • YUAN1125
  • 2010年05月11日 22:08
  • 2860

Linux启动过程分析(head.s)

/********判断内核是否支持硬件并启动MMU************/         bl         __lookup_processor_type                 /...
  • y695385603
  • y695385603
  • 2013年12月21日 12:07
  • 1354

nasm重写linux-0.11 head.s (博古以通今)

;文件名:followking/boot/head.s;本文件改写linux-0.11/boot/head.s,目的是为了体验整个系统构建的过程。;我是看着赵炯《Linux内核0.11完全注释》编写的...
  • huer0625
  • huer0625
  • 2010年04月25日 18:39
  • 2031

kernel 启动流程之 【head.S】 学习笔记

1、系统引导程序 【参考:kernel-3.18/Documentation/arm/Booting】 bootloader 要干的主要事情: 找到并初始化内存; 初始化和使能一个串口输出,这...
  • forever_2015
  • forever_2015
  • 2016年10月21日 17:53
  • 839

内核启动的汇编阶段——head.S文件

以下内容源于朱有鹏嵌入式课程的学习,如有侵权,请告知删除。 汇编阶段主要是arch/arm/kernel/目录下的head.S文件,主要完成以下内容: (1)校验启动合法性;(CPU ID...
  • oqqHuTu12345678
  • oqqHuTu12345678
  • 2017年05月03日 23:13
  • 478
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:head.s
举报原因:
原因补充:

(最多只允许输入30个字)