核心初始化程序

1.start.S

.text
.global _start
_start:
    b reset
    ldr pc,_undefined_instruction
    ldr pc,_software_interrupt
    ldr pc,_prefetch_abort
    ldr pc,_data_abort
    ldr pc,_not_used
    ldr pc,_irq
    ldr pc,_fiq

_undefined_instruction: .word undefined_instruction
_software_interrupt: .word software_interrupt
_prefetch_abort: .word prefetch_abort
_data_abort: .word data_abort
_not_used: .word not_used
_irq: .word irq
_fiq: .word fiq

undefined_instruction:
    nop

software_interrupt:
    nop

prefetch_abort:
    nop

data_abort:
    nop

not_used:
    nop

irq:
    nop

fiq:
    nop

reset:
    bl set_svc
    bl disable_watchdog
    bl disable_interrupt
    bl disable_mmu

set_svc:
    mrs r0,cpsr
    bic r0,r0,#0x1f
    orr r0,r0,#0xd3
    msr cpsr,r0
    mov pc,lr

#define pWACON    0x7e004000
disable_watchdog:
    ldr r0,=pWACON
    mov r1,#0x0
    str r1,[r0]
    mov pc,lr

disable_interrupt:
    mvn r1,#0x0
    ldr r0,=0x71200014
    str r1,[r0]

    ldr r0,=0x71300014
    str r1,[r0]

    mov pc,lr

disable_mmu:
    mcr p15,0,r0,c7,c7,0

    mrc p15,0,r0,c1,c0,0
    bic r0,r0,#0x00000005
    mcr p15,0,r0,c1,c0,0

    mov pc,lr

2.xboot.lds

OUTPUT_ARCH(arm)
ENTRY(_start)
SECTIONS
{
    . = 0X5000000;

    . = ALIGN(4);
    .text :
    {
        start.o(.text)
        *(.text)
    }

    . = ALIGN(4);
    .data :
    {
        *(.data)
    }

    . = ALIGN(4);
    bss_start = .;
    .bss :
    {
        *(.bss)
    }
    bss_end = .;
}

3.Makefile

all : start.o
    arm-linux-ld -Txboot.lds -o xboot.elf $^
    arm-linux-objcopy -O binary xboot.elf xboot.bin

%.o : %.c
    arm-linux-gcc -g -c $^

%.o : %.S
    arm-linux-gcc -g -c $^

.PHONY : clean
clean:
        rm *.o *.bin *.elf
时间: 2024-12-28 20:17:49

核心初始化程序的相关文章

26.核心初始化之关闭MMU和cache

26.核心初始化之关闭MMU和cache 下面看看ARM存储体系: 可以看到速度最快的是处理器和内部寄存器,他们的数量很少,价格很昂贵.接着是TCM紧耦合存储器:cache和main memory.速度最慢的是外部存储介质:Flash和SD卡等. CACHE: 上面是两种访存的两种机制,一种是处理器直接访问主存,另一种是处理器-cache-主存.第一种中,处理器的速度相比主存是非常快的,所以两者的速度很不匹配.浪费了处理器的很多资源.第二种是为了改进第一种的缺陷,在处理器和主存之间增加了一种叫C

核心初始化基本介绍

1.核心初始化主要工作 2.设置中断向量表 arm处理器支持7种类型的异常,如下表: 异常向量:当一种异常发生的时候,ARM处理器会跳转到对应该异常的固定地址去执行异常处理程序,而这个固定的地址,就称之为异常向量. 异常向量表:由七个异常向量及其处理函数跳转关系组成的表即为异常向量表. 3.设置svc模式 通过设置程序状态寄存器Current Program Status Register (CPSR) ,来设置模式. 步骤:先利用mrs将cpsr的值保持到通用寄存器中,清零相应5位(bic),

理解隐式类型、对象初始化程序和匿名类型

在C# 3.0中,几乎每个新特性都是为LINQ服务的.所以,本文将介绍下面几个在C# 3.0中引入的新特性: 自动实现的属性 隐式类型的局部变量 对象和集合初始化程序 隐式类型的数组 匿名类型 其实这几个特性都是比较容易理解的,对于这几个特性,编译器帮我们做了更多的事情(想想匿名方法和迭代器块),从而简化我们的代码. 自动实现的属性 在C# 3.0以前,当我们定义属性的时候,一般使用下面的代码 public class Book { private int _id; private string

《linux 内核完全剖析》 chapter 7 初始化程序

初始化程序 7.1 main.c 程序 图中,高速缓存的部分还要扣除显存和ROM BIOS占用的部分.告诉缓冲区是用于磁盘等块设备临时存放数据的地方,以1K字节为一个数据单位. init().函数的功能可分为四个部分 安装根文件系统 显示系统信息 运行系统初始资源配置文件rc中的命令 执行用户登录程序shell程序 要注意的是,由于创建新进程的过程通过完全复制父进程代码段和数据段的方式实现.因此在首次使用fork()创建新进程init时,为了确保新进程用户态栈中没有进程0的多余信息,要求进程0在

浏览器默认标签样式总结及css初始化程序

html中的大部分的标签都有一些糟糕的样式,有的是标签天然自带的,有的是浏览器默认设置的,我们在写网页时,这些默认的样式就会时不时的跳出来捣一下乱,搞得我们很是无奈.所以成手在写css样式时,一般都会在开头写一段初始化程序,来去掉这些默认样式,比如最简单的方法就是使用*{margin:0:padding:0:}.但是通常我们很少使用这种方法,因为通配符*的效率极低.那我们应该使用哪种方法呢,下面博主就来为大家介绍一些常用的方法. 一.浏览器默认样式总结 在介绍初始化程序之前,我们先了解一下都有那

中颖SH79F1616 timer5初始化程序

//========timer5.h============================================= #ifndef _TIMER5_H_ #define _TIMER5_H_ //#include "timer5.h" //==timer5 define===== #define TIM5_DIV1 (0<<4) #define TIM5_DIV8 (1<<4) #define TIM5_DIV64 (2<<4) #def

Linux0.11内核剖析--初始化程序(init)

1.概述 在内核源代码的 init/目录中只有一个 main.c 文件. 系统在执行完 boot/目录中的 head.s 程序后就会将执行权交给 main.c.该程序虽然不长,但却包括了内核初始化的所有工作.因此在阅读该程序的代码时需要参照很多其它程序中的初始化部分.如果能完全理解这里调用的所有程序,那么看完这章内容后你应该对Linux 内核有了大致的了解.从本文开始,我们将接触大量的 C 程序代码,因此读者最好具有一定的 C 语言知识.最好的一本参考书还是 Brian W. Kernighan

20.核心初始化之异常向量表

20.核心初始化之异常向量表 一.异常向量表: 包含:1.异常定义 ???? 2.异常类型 ???? 3.异常入口 ???? 4.向量表 首先异常定义,在ARM Architecture Reference Manual.pdf文档中,2.Programmers' Model的2.6.Exceptions异常: 异常:因为内部或外部的一些事件,导致处理器停下来正在处理的工作,转而去处理这些发生的事件. 2.异常类型 当一种异常发生的时候,ARM处理器会跳转到对应该异常的固定地址去执行异常处理程序

23.核心初始化之中断屏蔽-2440

23.核心初始化之中断屏蔽-2440 ? 在上一节中,我在设置关闭看门狗的时候,已经把WTCON的[2]设置为0,屏蔽了中断.如下图: 这一节是要屏蔽中断寄存器: 下面是2440芯片处理中断的机制: 中断屏蔽寄存器: ? 可以看到,只要把中断对应的中断屏蔽寄存器对应的位置为1即可.所以屏蔽中断就是往中断屏蔽寄存器置为全1,就屏蔽了所有中断. ? 编译: ? ?