Linux的启动流程、移植到开发板

1、linux驱动开发与裸机开发的区别

   Linux系统驱动和裸机驱动的主要区别在于运行时的环境和依赖。Linux系统驱动依赖于Linux内核提供的API和服务,而裸机驱动则是在没有操作系统支持的情况下直接与硬件交互。因此,两者的开发和调试方法也有很大差异。

2、驱动基础

2440里的IRAM ,ubuntu与ARM之间通过net(网络)连接

页表:记录虚拟地址与物理地址之间的关系。

norflash接在0地址,程序放在 norflash,上电后pc指向0地址,程序刚好可以运行。(程序放在nandflash就不能运行,pc没有指向)

要想访问nandflash,需要专用程序/控制逻辑。

内存:掉电数据丢失

flash:掉电不丢失 

norflash和nandflash 

我们开发板上的nandflash大小256M,norflash2M

norflash: 可线性访问,和内存的访问方式相同---有专用的数据、地址、控制总线

nandflash: 不可线性访问,需要有程序配合访问

 内核的任务

加载完后先启动init进程(内核里的进程),init退化到应用层,init再创建其他进程(shell nfs等)

 跟文件系统

bootloader:

bootloader放在nandflash里时:系统上电后,会自动搬移nandflash前4KB的程序到IRAM中,将0地址映射到0x40000000(IRAM的地址)地址处,bootloader在前4KB代码中初始化 好内存,并将自己剩余的部分搬移到内存中运行。

在norflash里时: 系统上电后,PC默认指向0地址处(norflash被连接到0地址处),直接运行norflash中的程序。

kernel:
内核在nandflash时: bootloader 启动最后阶段将 nandflash 中的内核搬移到内存的 0x30008000 地址处,启动 0x30008000 地址处的内核
内核在ubuntu时 bootloader 通过 tftp 服务将 ubuntu 上的内核下载到内存的 0x30008000 地址处,启动 0x30008000 地址处的内核

rootfs:

nandflash: 直接挂载 nandflash mtdblock3 分区(nandflash的分区)上的根文件系统
ubuntu: 通过 nfs 服务挂载 ubuntu 上的根文件系统

移植方法

1、使用sd卡,运行nandflash里的程序,文件都在nandflash里,上图右

2 、见第5点,bootloader在norflash里,内核文件、根系统文件在ubunt,上图左(上述的绿色组合)

方法2调试方便、数据不在开发板上,在虚拟机上

3、bootloader程序的作用 

bootloader 程序
初始化 CPU( 工作模式 )
初始化堆栈
初始化异常向量表
初始化时钟
初始化内存
关看门狗
Cache
MMU
初始化相关的硬件设备 ( 调试串口、网口、 led)
集成相关的通信协议
搬移内核到内存
向内核传参 -- 根文件系统位置,调试端口
Linux 启动过程:
1. 先启动 bootloader —一段裸机程序,为内核启动准备环境
2. 启动内核 --- 操作系统
3. 加载 ( 挂载 ) 根文件系统
引导内核启动
------CPU 的控制权彻底移交给内核, bootloader 不再
控制 CPU

4、uboot命令:

reset 重启uboot
help/? 帮助
setenv key value 设置环境变量
setenv key 删除环境变量
saveenv 保存环境变量(保存在nand)

 保存的位置在

5、Linux启动过程:

1. 先启动 bootloader —一段裸机程序,为内核启动准备环境
2. 启动内核 --- 操作系统
3. 加载 ( 挂载 ) 根文件系统
具体步骤:
1. norflash 中下载 uboot.bin
通过J-link下载
2. 安装 tftp 服务,并拷贝一个 uImage tftp 服务目录下
3. 安装 nfs 服务,并将 rootfs 拷贝到 nfs 服务目录下 ( 拷贝压缩包,在该目录下解压 )
sudo tar -xvf rootfs.tar.gz

4.ping ip ,测试开发板与虚拟机是否链接成功

5.修改环境变量中的服务器ip,改为虚拟机的ip

6.从虚拟机的里下载内核,下载命令: tftp 0x30008000 uImage    

下载到地址0x30008000处

7.挂载根文件系统:设置环境变量

命令: setenv bootargs root=/dev/nfs nfsroot=192.168.1.200:/home/linux/nfs/rootfs ip=192.168.1.99 console=ttySAC0,115200 init=/linuxrc te
(前:虚拟机ip,后:开发板ip(随便设置)) n
v配   
配置好后要保存saveenv
bootargs root=/dev/nfs nfsroot=192.168.1.3:/home/linux/nfs/rootfs ip=192.168.1.99 console=ttySAC0,115200 init=/linuxrc

 8.启动内核

命令:bootm 0x30008000

启动 0x30008000 地址处的内核 ( 会向内核传参 )

9.遇到的问题

nfs版本不一样

解决方法: setenv bootargs root=/dev/nfs nfsroot=192.168.1.3:/home/linux/nfs/rootfs,nfsvers=3 ip=192.168.1.99 console=ttySAC0,115200 init=/linuxrc

对于:bootargs=console=ttySAC0 root=/dev/mtdblock3;

bootargs=console=ttySAC0向内核传参,ttySAC0是s3c2440的串口

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值