徒手写uboot_1

来源:互联网 发布:mac 硬盘隐藏文件 编辑:程序博客网 时间:2024/05/01 21:39

相信大家在使用Source Insight的时候曾经遇到过输入大括号会自动缩进的情况,

现有一方法可以关闭Source Insight的这个自动缩进的方法:

1.打开Options - Document Options,打开界面如下图



2.点击 Auto Indent,界面如下

3.将Smart Indent Options中的两项取消,即可实现类似VC++上的自动调整功能。这样就省去了我们手动将缩进去掉的麻烦。

      将Auto Indent Type选择为“Simple”则可以使按回车后每行自动缩进和上一行对齐

      将Auto Indent Type选择为“None”则每次回车后,不会进行任何缩进

我设置了simple , 这样每次对齐到上一行

看了韦东山老师的视频, 竟然自己写了一个uboot并启动内核成功. 很是震撼决定记录该过程, 决心拿下u-boot移植!


上图以简要的方式设置参数来说明参数设置及跳转的过程

在uboot启动第二阶段, 设置内核启动参数的时候, setup_cmdline_tag()中, 字符串要4字节对齐, 韦老师推荐 +3 而不是用uboot中的 +4 , 这里有什么意义么? 

/* 2. 设置参数*/
/* 2.1 设置tag起始信息*/
setup_start_tag();

/* 2.2 设置memory_tag, 告诉内核: 内存从哪里开始, 有多大*/
setup_memory_tag();

/* 2.3 设置commandline_tag, 设置命令行参数*/
setup_commandline_tag();

/* 2.4 设置tag终止信息*/
setup_end_tag();

/* 3. 跳转执行*/
thekernel = (void (*)(int, int, unsigned int))0x30008000;
thekernal(); //等同于汇编的 mov pc, #0x30008000

在 thekernel 指针指向的函数, 有三个形参: 第一个 0   . 第二个表示 单板的类型代号(机器ID)   .   第三个表示   启动参数的存放地址(就是start_tag中设置的起始位置) 0x30000100 .




1. nand_read(unsigned int, unsigned char *; unsigned int);  这里是将nand中的数据读取到sdram中, 这里nand的地址(源地址)一般是用一个整型数据来表示的, 而读取到目的地址在sdram上,可以用char *来表示

2. 打开uboot.dis文件可以查看反汇编,如果代码有误, 可以通过查看反汇编来找到原因
2.1 33f8005c: e59f2058 ldr r2, [pc, #88] ; 33f800bc  <sdram_cfg_val+0x44> , 由这条汇编知道33f800bc出存放的是_bss段的开始位置,也就是用这个值减去0x33f80000就是生成的bin文件的大小, 
3. nand_read的时候 col = src % 2048


改进:
1. 提高cpu频率,200MHz提升到400MHz
2. 启动ICACHE,  DCACHE必须要开了mmu之后才能使用icache 是在cpu的内部的, 而程序是在sdram中的, 如果不用icache的话, cpu每次都要去访问sdram, 如果启用了icache, 每次拿出多条指令, 如果cpu在icache中找到需要的指令就不需要再去访问sdram, 大大缩短了取指时间