linux启动
来源:互联网 发布:网络翡翠挂件故事 编辑:程序博客网 时间:2024/05/30 05:41
Bootloader及u-boot简介
Bootloader代码是芯片复位后进入操作系统之前执行的一段代码,主要用于完成由硬件启动到操作系统启动的过渡,从而为操作系统提供基本的运行环境,如初始化CPU、堆栈、存储器系统等。Bootloader 代码与CPU 芯片的内核结构、具体型号、应用系统的配置及使用的操作系统等因素有关,其功能类似于PC机的BIOS程序。由于Bootloader和CPU及电路板的配置情况有关,因此不可能有通用的bootloader ,开发时需要用户根据具体情况进行移植。嵌入式Linux系统中常用的bootloader有armboot、redboot、blob、u-boot等,其中u-boot是当前比较流行,功能比较强大的bootloader,可以支持多种体系结构,但相对也比较复杂。Bootloader的实现依赖于CPU的体系结构,大多数bootloader都分为stage 1和stage2两大部分。Bootloader的基本原理见参考文献。u-boot是sourceforge网站上的一个开放源代码的项目。它可对 PowerPC MPC5XX、MPC8XX、MPC82XX、 MPC7XX、MPC74XX、ARM(ARM7、ARM9、StrongARM、VxWorks、NetBSD、QNX、RTEMS、ARTOS、LynxOS等,主要用来开发嵌入式系统初始化代码bootloader。软件的主站点是[url]http://sourceforge.net/projects/u-boot[/url]。u-boot 最初是由denx的PPC-boot发展而来的,它对PowerPC系列处理器的支持最完善,对Linux操作系统的支持最好。源代码开放的U-boot软件项目经常更新。
u-boot系统启动流程
(7)进入命令循环(即整个boot的工作循环),接受用户从串口输入的命令,然后进行相应的工作。
常用uboot命令介绍
baudrate=115200
ipaddr=192.168.1.1
ethaddr=12:34:56:78:9A:BC
serverip=192.168.1.5
Environment size: 80/8188 bytes
Uboot> printenv
baudrate=115200
ipaddr=192.168.1.1
ethaddr=12:34:56:78:9A:BC
serverip=192.168.1.5
myboard=AT91RM9200DK
Environment size: 102/8188 bytes
Uboot> setenv ipaddr 192.168.1.1
Uboot> setenv serverip 192.168.1.254 (tftp服务器的地址)
下载bin文件到地址0x20000000处。
Uboot> tftp 20000000 application.bin (application.bin应位于tftp服务程序的目录)
把server(IP=环境变量中设置的serverip)中/tftpdroot/ 下的vmlinux通过TFTP读入到物理内存32000000处。
protect off 1:0-3取消写保护
erase 1:0-2(就是对每一块FLASH的0-2扇区进行删除)
0xC0000000---NPCS0
0xD0000000---NPCS3
cp.b 20000000 10020000 8000
Uboot> saveenv
Uboot> run flashit
起动UBOOT TOOLS制作的压缩LINUX内核, bootm 3200000
usb info: 列出设备
usb scan: 扫描usb storage(u 盘)设备
nfs 32000000 192.168.0.2:aa.txt
把192.168.0.2(LINUX 的NFS文件系统)中的NFS文件系统中的aa.txt 读入内存0x32000000处
1)u-boot版本1.1.3,gcc version 3.3.3 (DENX ELDK 3.1.1 3.3.3-9)
bks2410_config : unconfig
@./mkconfig $(@:_config=) arm arm920t bks2410 NULL s3c24x0
我把我的板子起名叫bks2410,可以依自己的喜好修改
make bks2410_config
make all ARCH=arm
生成u-boot.bin就OK了
#include <config.h>
#include <version.h>
#define DW8 (0x0)
#define DW16 (0x1)
#define DW32 (0x2)
#define WAIT (0x1<<2)
#define UBLB (0x1<<3)
#define B2_BWSCON (DW16)
#define B3_BWSCON (DW16 + WAIT + UBLB)
#define B4_BWSCON (DW16)
#define B5_BWSCON (DW16)
#define B6_BWSCON (DW32)
#define B7_BWSCON (DW32)
#if 0
#define B0_Tacs 0x0 /* 0clk */
#define B0_Tcos 0x0 /* 0clk */
#define B0_Tacc 0x7 /* 14clk */
#define B0_Tcoh 0x0 /* 0clk */
#define B0_Tah 0x0 /* 0clk */
#define B0_Tacp 0x0
#define B0_PMC 0x0 /* normal */
#endif
#define B0_Tcos 0x3 /* 0clk */
#define B0_Tacc 0x7 /* 14clk */
#define B0_Tcoh 0x3 /* 0clk */
#define B0_Tah 0x3 /* 0clk */
#define B0_Tacp 0x1
#define B0_PMC 0x0 /* normal */
#if 0
#define B1_Tacs 0x0 /* 0clk */
#define B1_Tcos 0x0 /* 0clk */
#define B1_Tacc 0x7 /* 14clk */
#define B1_Tcoh 0x0 /* 0clk */
#define B1_Tah 0x0 /* 0clk */
#define B1_Tacp 0x0
#define B1_PMC 0x0
#endif
#define B1_Tcos 0x3 /* 0clk */
#define B1_Tacc 0x7 /* 14clk */
#define B1_Tcoh 0x3 /* 0clk */
#define B1_Tah 0x3 /* 0clk */
#define B1_Tacp 0x3
#define B1_PMC 0x0
#define B2_Tcos 0x0
#define B2_Tacc 0x7
#define B2_Tcoh 0x0
#define B2_Tah 0x0
#define B2_Tacp 0x0
#define B2_PMC 0x0
#define B3_Tacs 0x0 /* 0clk */
#define B3_Tcos 0x3 /* 4clk */
#define B3_Tacc 0x7 /* 14clk */
#define B3_Tcoh 0x1 /* 1clk */
#define B3_Tah 0x0 /* 0clk */
#define B3_Tacp 0x3 /* 6clk */
#define B3_PMC 0x0 /* normal */
#endif
#define B3_Tcos 0x0 /* 4clk */
#define B3_Tacc 0x7 /* 14clk */
#define B3_Tcoh 0x0 /* 1clk */
#define B3_Tah 0x0 /* 0clk */
#define B3_Tacp 0x0 /* 6clk */
#define B3_PMC 0x0 /* normal */
#define B4_Tcos 0x0 /* 0clk */
#define B4_Tacc 0x7 /* 14clk */
#define B4_Tcoh 0x0 /* 0clk */
#define B4_Tah 0x0 /* 0clk */
#define B4_Tacp 0x0
#define B4_PMC 0x0 /* normal */
#define B5_Tcos 0x0 /* 0clk */
#define B5_Tacc 0x7 /* 14clk */
#define B5_Tcoh 0x0 /* 0clk */
#define B5_Tah 0x0 /* 0clk */
#define B5_Tacp 0x0
#define B5_PMC 0x0 /* normal */
#define B6_Trcd 0x1
#define B6_SCAN 0x1 /* 9bit */
#define B7_Trcd 0x1 /* 3clk */
#define B7_SCAN 0x1 /* 9bit */
#define REFEN 0x1 /* Refresh enable */
#define TREFMD 0x0 /* CBR(CAS before RAS)/Auto refresh */
#define Trp 0x0 /* 2clk */
#define Trc 0x3 /* 7clk */
#define Tchr 0x2 /* 3clk */
#define REFCNT 1113 /* period=15.6us, HCLK=60Mhz, (2048+1-15.6*60) */
/**************************************/
.word TEXT_BASE
memsetup:
/* memory control configuration */
/* make r0 relative the current location so that it */
/* reads SMRDATA out of FLASH rather than memory ! */
adr r0, SMRDATA
/*ldr r1, _TEXT_BASE*/
/*sub r0, r0, r1*/
ldr r1, =BWSCON /* Bus Width Status Controller */
add r2, r0, #13*4
0:
ldr r3, [r0], #4
str r3, [r1], #4
cmp r2, r0
bne 0b
mov pc, lr
/* the literal pools origin */
.word (0+(B1_BWSCON<<4)+(B2_BWSCON<<8)+(B3_BWSCON<<12)+(B4_BWSCON<<16)+(B5_BWSCON<<20)+(B6_BWSCON<<24)+(B7_BWSCON<<28))
.word ((B0_Tacs<<13)+(B0_Tcos<<11)+(B0_Tacc<<8)+(B0_Tcoh<<6)+(B0_Tah<<4)+(B0_Tacp<<2)+(B0_PMC))
.word ((B1_Tacs<<13)+(B1_Tcos<<11)+(B1_Tacc<<8)+(B1_Tcoh<<6)+(B1_Tah<<4)+(B1_Tacp<<2)+(B1_PMC))
.word ((B2_Tacs<<13)+(B2_Tcos<<11)+(B2_Tacc<<8)+(B2_Tcoh<<6)+(B2_Tah<<4)+(B2_Tacp<<2)+(B2_PMC))
.word 0x1f7c/*((B3_Tacs<<13)+(B3_Tcos<<11)+(B3_Tacc<<8)+(B3_Tcoh<<6)+(B3_Tah<<4)+(B3_Tacp<<2)+(B3_PMC))*/
.word ((B4_Tacs<<13)+(B4_Tcos<<11)+(B4_Tacc<<8)+(B4_Tcoh<<6)+(B4_Tah<<4)+(B4_Tacp<<2)+(B4_PMC))
.word ((B5_Tacs<<13)+(B5_Tcos<<11)+(B5_Tacc<<8)+(B5_Tcoh<<6)+(B5_Tah<<4)+(B5_Tacp<<2)+(B5_PMC))
.word ((B6_MT<<15)+(B6_Trcd<<2)+(B6_SCAN))
.word ((B7_MT<<15)+(B7_Trcd<<2)+(B7_SCAN))
.word ((REFEN<<23)+(TREFMD<<22)+(Trp<<20)+(Trc<<18)+(Tchr<<16)+REFCNT)
.word 0x31
.word 0x30
.word 0x30
8)在board/bks2410加入NAND Flash读函数,建立nand_read.c,加入如下内容(copy from vivi):
#include <config.h>
#define __REGi(x) (*(volatile unsigned int *)(x))
#define NF_BASE 0x4e000000
#define NFCONF __REGi(NF_BASE + 0x0)
#define NFCMD __REGb(NF_BASE + 0x4)
#define NFADDR __REGb(NF_BASE + 0x8)
#define NFDATA __REGb(NF_BASE + 0xc)
#define NFSTAT __REGb(NF_BASE + 0x10)
inline void wait_idle(void) {
int i;
for(i=0; i<10; i++);
}
#define NAND_BLOCK_MASK (NAND_SECTOR_SIZE - 1)
int
nand_read_ll(unsigned char *buf, unsigned long start_addr, int size)
{
int i, j;
return -1; /* invalid alignment */
}
NFCONF &= ~0x800;
for(i=0; i<10; i++);
/* READ0 */
NFCMD = 0;
NFADDR = i & 0xff;
NFADDR = (i >> 9) & 0xff;
NFADDR = (i >> 17) & 0xff;
NFADDR = (i >> 25) & 0xff;
*buf = (NFDATA & 0xff);
buf++;
}
}
NFCONF |= 0x800; /* chip disable */
}
OBJS := bks2410.o flash.o nand_read.o
在ldr pc, _start_armboot之前加入:
#ifdef CONFIG_S3C2410_NAND_BOOT
bl copy_myself
@ jump to ram
ldr r1, =on_the_ram
add pc, r1, #0
nop
nop
1: b 1b @ infinite loop
on_the_ram:
#endif
#ifdef CONFIG_S3C2410_NAND_BOOT
copy_myself:
mov r10, lr
@ reset NAND
mov r1, #NAND_CTL_BASE
ldr r2, =0xf830 @ initial value
str r2, [r1, #oNFCONF]
ldr r2, [r1, #oNFCONF]
bic r2, r2, #0x800 @ enable chip
str r2, [r1, #oNFCONF]
mov r2, #0xff @ RESET command
strb r2, [r1, #oNFCMD]
mov r3, #0 @ wait
cmp r3, #0xa
blt 1b
2:ldr r2, [r1, #oNFSTAT] @ wait ready
tst r2, #0x1
beq 2b
ldr r2, [r1, #oNFCONF]
orr r2, r2, #0x800 @ disable chip
str r2, [r1, #oNFCONF]
ldr sp, DW_STACK_START @ setup stack pointer
mov fp, #0 @ no previous frame, so fp=0
ldr r0, =UBOOT_RAM_BASE
mov r1, #0x0
mov r2, #0x20000
bl nand_read_ll
tst r0, #0x0
beq ok_nand_read
bad_nand_read:
ldr r0, STR_FAIL
ldr r1, SerBase
bl PrintWord
1:b 1b @ infinite loop
#endif
#ifdef CONFIG_DEBUG_LL
ldr r0, STR_OK
ldr r1, SerBase
bl PrintWord
#endif
mov r0, #0
ldr r1, =UBOOT_RAM_BASE
mov r2, #0x400 @ 4 bytes * 1024 = 4K-bytes
go_next:
ldr r3, [r0], #4
ldr r4, [r1], #4
teq r3, r4
bne notmatch
subs r2, r2, #4
beq done_nand_read
bne go_next
#ifdef CONFIG_DEBUG_LL
sub r0, r0, #4
ldr r1, SerBase
bl PrintHexWord
ldr r0, STR_FAIL
ldr r1, SerBase
bl PrintWord
#endif
1:b 1b
done_nand_read:
#ifdef CONFIG_DEBUG_LL
ldr r0, STR_OK
ldr r1, SerBase
bl PrintWord
#endif
mov pc, r10
@ clear memory
@ r0: start address
@ r1: length
mem_clear:
mov r2, #0
mov r3, r2
mov r4, r2
mov r5, r2
mov r6, r2
mov r7, r2
mov r8, r2
mov r9, r2
stmia r0!, {r2-r9}
subs r1, r1, #(8 * 4)
bne clear_loop
mov pc, lr
.align 2
DW_STACK_START:
.word STACK_BASE+STACK_SIZE-4
/*
* Nandflash Boot
*/
#define CONFIG_S3C2410_NAND_BOOT 1
#define STACK_BASE 0x33f00000
#define STACK_SIZE 0x8000
#define UBOOT_RAM_BASE 0x33f80000
/* NAND Flash Controller */
#define NAND_CTL_BASE 0x4E000000
#define bINT_CTL(Nb) __REG(INT_CTL_BASE + (Nb))
/* Offset */
#define oNFCONF 0x00
#define oNFCMD 0x04
#define oNFADDR 0x08
#define oNFDATA 0x0c
#define oNFSTAT 0x10
#define oNFECC 0x14
make all ARCH=arm
RAM Configuration:
Bank #0: 30000000 64 MB
Flash: 512 kB
*** Warning - bad CRC, using default environment
Out: serial
Err: serial
BKS2410 #
kernel结构
/arch 体系结构相关代码
/drivers linux支持的外围设备的驱动程序
/fs linux支持的所有文件系统在fs目录下都有一个对应的子目录
/include linux源程序树中大部分.h文件
/linux 内核和用户应用程序请求特定内核服务时所用的常量 数据结构在头文件中定义,这里就是头文件
/net 供与网络子系统有关的头文件使用
/scs 与SCSI控制器和 SCSI设备有关的头文件使用
/video 与显卡和帧显示缓存有关的头文件使用
/init 引导程序,main.c包含了大部分协调内核初始化的代码
/ipc 实现了System V的进程间通信(IPC)
/kernel 实现平台独立的基本功能
/sched.c 进程调度
/fock.c 创建进程
/exit.c 撤销进程
/lib
/inflate.c 能够在系统启动时展开经过压缩的内核
/*其他文件实现一个标准C库的有用子集
/mm 体系结构无关的内存管理代码,为每个平台实现最底层结构的是源于,他的体系结构特有的内存管理程序是 存储在/arch/platform/mm
/net 包含了linux应用的网络协议代码,例如:AppleTalk ,TCP/IP ,IPX等
/scripts 包含了用来配置内核的脚本
1、系统启动与初始化
通过loadlin.exe或者LILO将核心载入内存并将控制传递给他。程序位于/arch/Kernel/head.s完成处理器相关操作并转跳到init/main.c中的main()
2、内存管理
处理器结构相关部分放在arch/*/mm中,页面出错处理代码位于mm下的/memory.c文件中,内存映射与页面cache代码位于filemap.c中,buffer cache 在mm/buffer.c中,swap cache位于/mm/swap_state.c和/mm/swapfile.c中
3、核心
处理器相关代码放在arch/*/Kernel中,调度器位于/kernel/sched.c中,底层部分处理代码位于/include/linux/interrupt.h,task_struct的描述在/linux/sched.h中可以找到
4、PCI
PCI伪设备驱动在/drivers/pci/pci.c中,系统通用定义放在/include/linux/pci.h中,每个处理器结构具有特殊的PCI BIOS代码,位于/arch/*/kernel/bois32.c中(有变化)
5、进程间通信
所有代码在ipc中,System V IPC对象都包含一个ipc-perm结构,在/include/linux/ipc.h中,System V消息在/ipc/msg.c中实现,共享内存在ipc/shm.c中,信号灯位于/ipc/sem.h,管道在/ipc/pipe.c
6、中断处理
中断处理代码位于/arch/*/kernel/irq.c 定义位于/include/asm-*/irq.h中
7、设备驱动
/block 块设备驱动包括ID(在ide.c中)驱动。初始化过程/drivers/block/genhd.c中的device_setup().当安装一个nfs系统时不但要初始化硬盘,还需要初始化网络,块设备包括IDE和SCSI设备。
/char包含字符设备的驱动
/cdrom 包含所有linux CDROM代码.IDE接口的CD驱动位于/drivers/block/ide-cd.c中,SCSI CD驱动位于drivers/scsi/scsi.c中。
/pci 包含了pci伪设备驱动的源代码。可以找到PCI子系统映射与初始化的代码
/scsi 所有SCSI代码,及linux支持的SCSI设备驱动
/net 包含网络驱动源代码
/sound 所有声卡驱动源代码
8、文件系统
EXT2位于/fs/ext2中,数据结构定义位于/include/linux/ext2_fs.h、ext2_fs_i.h及ext2_fs_sb.h中。虚拟文件系统数据结构在/include/linux/fs/h中描述,代码在fs/*中,buffer cache和update核心后台进程在fs/buffer.c中实现
9、网络
代码位于/net目录中,大多数包含文件位于/include/net中。BSD套接口代码位于/net/socket.c中,IPV4的INET套接口代码位于/net/ipv4/af_inet.c中,通用协议支撑代码(包括sk_buff处理过程)位于net/core中,TCP/IP网络代码位于/net/ipv4中,网络设备驱动代码位于/drivers/net中/
10、模块
核心模块代码位于/modules包中,核心代码位于/kernel/modules.c,数据结构与核心后台进程kerneld消息位于/include/linux/module.h和/include/linux/kerneld.h中。必要时需查询/include/linux/elf.h中的ELF模块。
- linux 启动
- linux 启动
- linux 启动
- linux启动
- linux启动
- linux 启动
- Linux启动
- linux启动
- Linux 启动
- Linux启动
- linux 启动
- linux启动
- linux 启动
- 启动linux
- Linux启动
- 【linux】linux启动流程
- Android启动:Linux启动流程
- Android启动:Linux启动流程
- 基于索引的SQL语句优化之降龙十八掌
- 记录arch 使用中的遇到一些问题及解决方法
- 高手的C++学习忠告,虚心学习下~~
- ul li样式总结
- Extjs4.1:警告&提示窗口
- linux启动
- Android.mk文件中如何输出打印信息 .
- JPEG压缩数据格式
- 模拟多用户点击
- wince bib文件合成
- 顺序容器vector,dequeue和list性能比较
- Unity3d GLDraw
- Fedora 15/16 安装后需要做的28件事 .
- ADF下拉生成