嵌入式系统移植课笔记1(学通)

1.什么是系统移植 ?
将现有的代码, 根据目标硬件平台的差异 做少量修改从而使得该代码可以在目标硬件平台上执行起来的过程,这个过程叫做移植,
做移植要有两个前提条件 :
1>,对硬件很了解 ,原有硬件和现有硬件的差异 ,
2>,对软件很了解, 找代码差异, 修改哪些代码 ?
2. 移植的内容
2.1 uboot的移植
2.2 linux的移植
2.3根文件系统镜像的制作与作用

一个完整的linux系统最少包含三部分内容 :
1 . bootloader (uboot 属于bootloader 的一种, 烧写uboot.bin 文件)
2. kerner
3. rootfs 根文件系统 cd rm ls … 这些命令 是单独存放在rootfs 根文件系统里的,

fdisk 命令
fdisk + 设备号 列出你指定设备的分区信息
例如 : fdisk 2 代表咱们板子上emmc 固化到板子上,作为第几个设备, 作为第二个, 你的sd0插槽卡sd1插槽里tf卡分别作为它认为fdisk 里的 第0个设备 和 第1个设备, 而这个emmc 就作为第二个设备, 这个uboot烧写实验的时候提到过,

做分区 :
fdisk + 给哪个设备做分区 + 分几个区 + 分区从哪个位置开始 : 分区有多长
uboot kerner rootfs appfs
我们分三个区 把uboot的空间给让出来, 那第一个分区从哪个位置开始呢 ?
1M 用十六进制表示是 0x100000 ,
fdisk 2 3 0x100000:0x4000000 0x410000:0x2F200000 0x33300000:0
(64M空间分给kerner) (819-65 rootfs的空间) (appfs 的空间)

我们首先把 uImage 下载到板子上
tftp 48000000 uImage
完成下载之后, 我整个uImage 文件就放到了 我们内存 48000000 的位置上去了 ,在内存里不行所以要把 它倒到 emmc的分区里,
mmc write 48000000 800 3000
mmc write +要写入的源数据在哪 ? + 写到哪个位置(不是以字节为单位的表示方式,而是以扇区为单位的计量方式,一个扇区是 512 字节, 那么1M对应的扇区是 1024 * 1024 / 512 = 2048 ,然后 2048转16进制 = 0x800 这是扇区的表示方式,) + 写入多少(扇区为单位 , 我们假如下载的 uImage大小为537300字节 转成扇区数 537300 换成十进制 为 5468928 / 512 = 10681 我们再加1 = 10682 然后换成16进制 ,29BA 我们直接用 0x3000 绝对够用了)

然后我们在uboot启动后 进入命令行
第一步 : 你要把linux内核从 emmc 里面读出来 , 加载到开发板里面 ,
加载 linux 内核到开发板得内存
mmc read 48000000 800 3000 (48000000是读到内存得哪个位置上去,那么你得内核在emmc得哪个位置呢 ?哪个编译扇区 ,就是 0x800 , 从0x800这里开始读数据, 往内存得48000000 得位置上放 , 连续读多少个扇区呢 ? 0x3000 烧的也用 0x3000 加载)
第二步 : 你得整个内核已经放到 48000000 位置上去了, 我怎么去运行这个内核
bootm 48000000 (启动linux内核 )
(go 命令和 这个bootm 有什么差异呢? go命令把它当子函数,直接跳到子函数里去执行了,而且那个子函数不需要参数, 而这个bootm 跳转到48000000 之前它回去准备一系列得linux内核启动时所需要参数 , 准备完参数之后再跳转到 48000000 )

kerner panic - not syncing: VFS: Unable to mount root fs on unknown-block(0,0)
(启动起来之后去找根文件系统,找不找根文件系统)
所以报 Rebooting in 5 seconds…

每次启动都要手动加载内核,挺麻烦得 有一个命令可以设置环境变量

bootcmd 咱们可以给它一个值 ,

自启动得实现 :
设置环境变量 setenv bootcmd (命令与命令 ; 号隔开 , 设置得时候要给 ; 号加转义字符)
setenv bootcmd mmc read 48000000 800 3000 ;bootm 48000000
设置好之后 我们可以打印一下看看 printenv bootcmd
最后记得 saveenv
在这里插入图片描述

你放什么命令他就去执行什么命令 ,

linux内核就是启动起来之后,它要去找, 去执行用户空间得 1号进程 , 它找不到1 号进程, 所有得用户进程父进程就没有, 父进程没有得话, 它后续进程就没法启动, 没法启动就处理不了了, 所以就报恐慌

怎么烧写根文件系统镜像 :
假如镜像文件名 是rootfs.img 我们怎么把它烧写到 rootfs 空间里面去呢 ? 这个文件比较大, 完整得这个根文件系统文件大概 100M , 我们把这个文件先放到 tftp 服务文件下 ,
然后tftp 48000000 rootfs.img 进行下载, 下载可能会慢
下载完成后 , 我们写入 (扇区编号)
mmc write 48000000 20800 32000
(从65M这个地址开始写,65M 地址为 65 * 1024 *1024 / 512 = 133120 转 16进制为 0x20800)
(要写入100M 100 *1024 *1024 = 204800 转16进制 为 32000 )
这样我们就把根文件系统放到板子上了, 但是我们重启 它还是报恐慌
原因是我们只是把根文件系统放上去了, 并没有告诉系统从哪里找这个根文件系统

有个新的环境变量叫 bootargs 这个环境变量是用来通知linux内核 启动成功之后去哪找根文件系统,
printenv bootargs

setenv bootargs root=/dev/mmcblk0p2 rootfstype=ext4 init=/linuxrc console=ttySAC0 maxcpus=1 lcd=wy070ml tp=gslx680
地址在哪 什么类型文件系统是 指定用户空间1号进程
root=/dev/mmcblk0p2 指定根文件存在于mmc第二个分区中
rootfstype=ext4 告诉linux内核 mmc 第二个分区中, 使用的文件系统类型 ,
init=/linuxrc 指定用户空间的1号进程
console : (用来指定控制台的 ttySAC0 (uart0控制器))linux 在启动过程中会输出很多得信息,那这些信息为什么没有输出到开发板和lcd屏呢 ?为什么到串口上来呢 ? 是有原因得, 那我们这里吧串口当作控制台得话, console=ttySAC0 ,这样把打印信息都输出到串口上来, 那么linux内核启动起来你会看到一个shell界面, 在那个shell界面 里敲命令得时候, 那么是从哪里接收你敲得命令呢 ?也是从这个串口去接收, 这个叫控制台 ttySAC0 代表的就是咱板子上, 在前面裸板开发课上玩的 uart0 控制器, 它那个控制器也不叫con0 con1 这con0和con1也是微软搞出来的,
(dev下得对应得分区,去rootfs 里面找,如果按windows系统 得话, kerner 分区叫C盘 那rootfs 就应该叫D盘, appfs应该叫 E盘,但是现在是 linux 有自己得命名方式, rootfs 分区叫 mmcblk0p2 )
(windows 得文件系统格式一般是NTFS )
(maxcpus=1 (假如4核处理器或8核处理器)只启动一个核 , 因为这次实验中板子上跑的内核,对多核支持的不太好 ,如果设置多核, 在启动过程中有可能死机, 启动成功后,你再打开多核)
lcd=wy070ml tp=gslx680 (lcd 屏类型 tp 触摸屏类型 ,这个东西跟linux内核关系不太大, 意思我启动之后加载什么类型的屏幕, 是大屏还是小屏 ? 所以在linux内核启动的时候你把这个参数传给 linux 内核 , 告诉它加载哪种类型的屏, 保证这个linux 内核既能启动大屏的 又能驱动小屏的 )

最后别忘了 saveenv

成功启动之后 : 用户名 root 密码 123456

有一个界面 : 为什么会有这个界面 我们 ps命令来看一下

有一个 root /usr/share/demo/qttest 这个程序 , 这个程序一启动,咱就在板子上能看到界面

现在这个板子已经是一个小型的计算机系统了
可以跟ubuntu 对比, 虽然梦远pc机的性能强 , 但是它这里面有硬件,操作系统, 应用软件, 你在 ubuntu 敲的命令在这都可以用了, 为什么能在这敲命令?
因为有个shell 会话
ps 查看 有一个进程叫 root -sh 就是shell 会话,

如果启动后 一直输出 mmc 的内容 意思是你的板子上的 mmc 模块不太稳定,

如果有这个问题的话多加一个参数进来

setenv bootargs root=/dev/mmcblk0p2 rootfstype=ext4 init=/linuxrc console=ttySAC0 maxcpus=1 lcd=wy070ml tp=gslx680 loglevel=1

再 saveenv 一下

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值