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()以外返回时的返回地址,让其死循环。

相关文章推荐

MTK Kernel启动流程源码解析 2 head.S

http://blog.csdn.net/xichangbao/article/details/51605462 __cpu_setup。定义kernel\arch\arm64\mm\pro...
  • ffmxnjm
  • ffmxnjm
  • 2017年04月18日 17:46
  • 423

ARM架构内核启动分析-head.S(1.4、stext分析之打开MMU并跳到start kernel)

1.2.5、打开MMU: 接下来,调用__enable_mmu来打开MMU,在该函数的最后会使用这里保存在R13中的__switch_data函数地址并调用它,函数__switch_data定义在he...

ARMv8 Linux内核head.S源码分析

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

Linux0.11内核--idt(中断描述符表的初始化)head.s分析

head.s被编译成system模块的最前面部分,故而称为头部。这段程序处于地址的绝对0处,首先是加载各个数据段寄存器,重新设置中断描述符表 idt,共 256 项,并使各个表项均指向一个只报错误的哑...

Linux 0.00简单多任务内核head.s超详注释

# head.s包含32位保护模式初始化设置代码、时钟中断代码、系统调用中断代码和两个任务的代码。 # 在初始化完成之后程序移动到任务0开始执行,并在时钟中断控制下进行任务0和1之间的切换操作。 ...

ARM架构内核启动分析-head.S(1.3、stext分析之内存临时页表建立)

1.2.4、创建临时页表: 对于创建临时页表,使用的是arm的L1主页表,L1主页表也称为段页表(section page table,说白了就是采用段式管理而不是页式管理),它将4GB的地址空间分成...

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

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

linux内核启动head.s

linux内核启动head.s已知条件: 1.首先通过分析Kernel的Makefile的链接知道 之后内核启动执行的第一个脚本是:../arch/arm/kernel/head.S 2.u-bo...

一站式linux0.11内核head.s代码段图表详解

阅读本文章需要的基础:         计算机组成原理:针对8086,80386CPU架构的计算机硬件体系要有清楚的认知,我们都知道操作系统是用来管理硬件的,那我们就要对本版本的操作系统所依赖的...

head.s 分析

linux/arch/arm/boot/compressed/head.S 这是ARM-Linux运行的第一个文件,这些代码是一个比较独立的代码包裹器。其作用就是解压Linux内核,并将PC指针跳到...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:head.s
举报原因:
原因补充:

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