尧图网站设计 尧图网站设计YAOTU DESIGN
ARTICLE DETAIL

资讯详情

深耕网站设计与一线实操的经验洞察。

BSP基础知识

BSP基础知识 linux启动流程概括设备上电后SoC 片内 BootROM 从 Flash 读第一段启动代码到 片内 SRAM 执行完成 DDR 初始化和最小硬件 init然后加载 Bootloader到 DDR 。解压boot代码并把控制权交给BootoaderBootloader 从 Flash kernel 分区读出 uImage连同 bootargs、initrd/ramdisk、设备树 一起准备好按 ARM Linux 启动协议跳转到 Kernel 入口。Kernel 自身完成解压、MMU、驱动 init后挂载根文件系统启动 init再由 init/启动脚本拉起业务进程如媒体主进程。整体链路BootROM → miniboot/SPL → U-Boot → Linux Kernel → init → 业务。BootRom完成了什么任务BootRom是Rom里写死的不可改。解决的问题是“没有DDR之前怎么把能初始化DDR的代码跑起来”。主要完成的工作如下初始化最基础的始终必要pin(引脚)识别启动介质(后续从哪里读取代码)。从启动介质固定偏移读取一部分boot代码到片内Ram。第二阶段片内Ram完成了什么任务1初始化DDR配置DDR控制器、做信号校准、确认可用内存大小。、2最小硬件初始化保证读Flash正常。配置时钟、引脚和flash控制器。3将boot代码从flash拷贝到DDR。4、Bootloader主要完成了什么工作1) 自搬运避免和内核加载冲突。2) 初始化驱动3读分区表准备bootargs4) 从flash kernel分区读uImage到DDR5) 准备initrd、设备树DTB6) boot跳转kernel。Kernel会自解压5、kernel主要完成了什么工作1) 自解压2) 建页表、开MMU/Cache3) start_kernel()架构init、内存管理、调度器、驱动init4) 挂载根文件系统按 bootargs 里 root 挂 squashfs/yaffs2 等。5创建init进程(/linuxrc)6、init进程如何启动业务Init进程是busybox通用小程序他只执行/etc/inittab里面的脚本dnode脚本主要做的任务有挂载文件系统先让 mdev(busybox的小程序) 按内核已经注册好的设备把 /dev 补齐再手工补上 Flash 分区要用的 /dev/mtd/*rcS脚本启动应用程序。7、常见问题bootargs 谁传给 kernelU-Boot 把 bootargs 写进设备树的 /chosen/bootargs跳进内核时 r2 指向这块设备树。(设备树保存在flash里)ATAG方式U-Boot在临跳内核时在内存里搭一张标签链表r2指向这张表。(这张表保存在内存里)initrd 干什么Linux内核分为内核(uimage)、根文件系统、u-boot。其中内核就是负责与硬件交互、进程调度管理等工作而根文件系统就负责与用户的交互其实就是将flash的一块区域挂载在/目录下。而initrd是在内存里维护一个临时的根文件系统因为有些板子不能直接挂载真正的根文件系统需要进行处理。3.驱动什么时候起来驱动分为两批进行加载第一批在内核镜像里根分区还没有挂载上就初始化完了。第二批是ko要等/linuxrc根文件系统跑进rcS在这个脚本里面进行加载脚本。4.媒体相关内存Bootloader 通过 bootargs / 厂商 tag 把 预留物理内存告诉 kernel媒体 SDK 在用户态或内核模块里映射使用。内核的用的内存本身就有规定好的字段而媒体内存相关字段是厂商那边新加的。7、常见问题1.开MMU之前和之后CPU用的地址一样嘛答不一样开MMU之前用的是物理地址开了之后是虚拟地址。要先建好页表再开启MMU。2.DMA和Cache为什么会看到不同的数据答DMA读的都是内存里面的数据而Cache是内存和CPU之间的缓存CPU修改数据需要先修改cache再刷到内存里。所以就有可能cache的数据被修改了但是还没有刷到内存里所以DMA读到的数据就和cache里的不一样。解决方法数据是 CPU 准备好、要送给设备的先把 Cache 里的新数据写回内存再让 DMA 去读。这样 DMA 读到的才是刚写的。数据是设备经 DMA 写进内存、要给 CPU 用的等 DMA 写完把 Cache 里这块旧数据丢掉再让 CPU 去读。CPU 发现 Cache 里没有就会去内存拿设备刚写的内容。3. 预留内存、CMA 和普通内存重叠会怎样答普通内存谁都可以申请预留内存从可用内存挖走页分配器看不到CMA 是内核里一块「平时能借给别人、用时要收回来」的连续物理内存这三段必须互斥。媒体区被划进了内核可用区两边会互相改同一块物理内存现象是花屏、数据随机错、跑一会儿才崩。4. 设备树一项怎样变成一个能用的设备compatible用来和驱动匹配匹配程序执行驱动的peobe函数然后申请资源向用户态注册接口。5.probe失败一般是什么原因匹配字符串不一致模块的时钟或复位没准备好寄存器范围错误依赖的设备还没起来。6.平台设备和字符设备是什么关系平台设备表示这颗SOC上有这个硬件信息在设备树里总线不会自己发现它。字符设备时给应用open的接口。常见顺序是平台驱动 probe 成功再注册字符设备。一个讲硬件怎么被发现一个讲应用怎么打开它。7.中断为什么不能睡眠硬中断没有进程上下文。它不是一个可以挂起、再唤醒的进程所以不能睡眠。8.上半部和下半部各做什么上半部应答硬件清理设备寄存器确认中断否则同一条中断会一直进来。下半部剩下比较耗时的所有任务。9.下半部有什么方式软中断硬中断返回后尽快执行仍是中断上下文不能睡眠同一种软中断可以在多颗CPU上同时跑。tasklet建立在软中断上面但同一个tasklet不会在两颗CPU上同时跑不能睡眠。工作队列在内核线程里跑有进程上下文可以睡眠。10.时钟、复位、引脚配错分别是什么现象时钟没开读寄存器常是全0或者总线直接挂死。复位没释放模块一直停在复位里探测超时。引脚复用错该有的波形没有。11.根为什么做成只读配置另放分区根要保证下次还能启动用只读压缩文件系统运行中不往根上写。配置和日志放可写分区坏了可以恢复。12.内核和根为什么分成两个分区两者体积和更新频率不同可以只更新其中一块。内核先于根运行根损坏时只要bootloader和内核还在仍有机会恢复。13.14.BSS为什么清未初始化的全局变量放在 BSS镜像里不占空间上电后内存是随机值。启动代码要把这段清零这些变量才是 0。15. 多核时从核谁来拉起主核先准备好从核入口和参数再通过固件或 SoC 的启动寄存器释放从核。从核不能在主核的内存和锁还没准备好时进入内核。
返回列表