基于龙芯 2K1000 的嵌入式 Linux 系统移植和驱动程序设计(二)

news2025/7/4 10:01:54
3 嵌入式软件系统移植
本课题中嵌入式系统正常工作的前提是嵌入式软件系统完整且能正常工作,
以便为之后的软件开发提供一个能够正常工作的平台。引导程序 PMON 需要完成
内核引导,嵌入式 Linux 内核需要具有完备的功能且能够正常使用,根文件系统要
完成启动过程中初始化工作。
3.1 PMON 启动流程与编译
3.1.1 PMON 目录结构及主要命令
PMON 目录结构如表 3-1 所示, PMON 目录下包含处理器相关代码和一些基
本的设备驱动, Targets 目录下有针对不同板卡详细的配置文件 [39]
PMON 主要命令包括常用指令和对设备的操作指令,例如设置网络设备 IP
命令 ifaddr ,网络连接命令 ping 和查看设备命令 devls 等。
3.1.2 PMON 启动流程分析
龙芯 2K1000 处理器通过 SPI 总线接口连接 NOR Flash PMON 镜像文件存储
NOR Flash 中, NOR Flash 的物理地址起始地址为 0x1fc00000 ,该地址为处理器
SPI 总线控制器。但是程序主要在内存中运行,因此需要的改地址映射的虚拟地
址起始地址为 0xbfc00000 。处理器上电后,直接从 0xbfc00000 开始运行 PMON
代码。
PMON 有两部分代码, PMON 镜像文件开头部分为第一部分汇编代码,这部
分代码上电后直接运行,因此没有压缩,执行完毕会执行第二部分经过压缩的 C
码。 PMON 分为两部分代码的原因在于系统初始阶段并没有准备好 C 语言运行的
环境,因此需要汇编代码来完成一些处理器和内存等设备的初始化,完成准备工作
[40]
PMON 启动流程如图 3-1 所示,准备工作完成后, start.s 将第二部分压缩的 C
代码解压,之后 C 代码就在内存中运行。 start.s PMON 镜像文件的开头,因此
这部分代码存放在虚拟地址 0xbfc00000 ,这段代码初始化寄存器、内存、串口、网
口之后,将 PMON 代码搬运到内存中运行,之后开始执行 initmips 函数。 initmips
函数在 Targets\LS2K\ls2k\tgt_machdep.c 文件中,该函数首先执行 tgt_cpufreq 函数
来探测 CPU 频率,之后执行 dbginit 函数对命令、文件系统、可执行文件和环境变
量进行初始化,初始化 PCI 总线和设备,加载串口、网络接口、视频接口和 USB
接口等设备的驱动,构建一个可以进行人机交互的命令行。
3.1.3 PMON 编译
1 )下载 PMON 源代码,并解压。
2 )获取编译 PMON gcc 编译器
3 )安装编译 PMON 必要的依赖工具
#sudo apt-get install xutils-dev
#sudo apt-get install bison flex build-essential patch
#cd /home/troy/pmon-loongson3-20200728/tools/pmoncfg
#make pmoncfg
#cp pmoncfg /usr/bin
4 )在 PMON 源码存放目录下,更改相关文件配置编译所需环境变量
#vi .bashrc
在文件末尾增加三行 pmon 交叉编译工具链和编译器的路径信息
export LD_LIBRARY_PATH=/home/troy/pmongcc/opt/gcc-4.4-gnu/lib:
exportCROSS_COMPILE=/home/troy/pmongcc/opt/gcc-4.4-gnu/bin/mipsel-linux
export PATH=/home/troy/pmongcc/opt/gcc-4.4-gnu/bin/:$PATH
#source .bashrc 使设置的环境变量生效
5 )进入 pmon 源码目录进行编译
#cd /home/troy/pmon-loongson3-20200728/zloader.ls2k
#make cfg
#make all tgt=rom
#make dtb
如图 3-2 所示编译完成后在 pmon 源码目录下的 zloader.ls2k/ 目录下生成
gzrom.bin gzrom-dtb.bin
如果更改了 Targets/LS2K/conf/ls2k 目录下的文件源代码或者参数 , 则在编译
前要执行 make cfg ,使得更改生效,如果普通编译没有更改配置,则每次无需都执
make cfg 命令。执行 make dtb 可以将设备树 dtb gzrom.bin 结合生成 gzrom
dtb.bin ,此命令可以在上面编译完成后执行。

3.2 嵌入式 Linux 内核移植

3.2.1 Linux 内核简介
本课题中应用程序、 Linux 内核、驱动程序、硬件关系如图 3-3 所示, Linux
核是应用程序和硬件设备之间的媒介,内核将应用程序的请求和命令通过底层程
序传递给硬件设备实现对硬件的操作。 Linux 内核根据功能分为五个内核子系统,
分别为进程调度、内存管理、文件系统、进程通信和网络。进程调度是内核的核心
功能,多个进程需要使用 CPU 有限的资源,但是 CPU 一次只能处理一个进程,进
程调度会通过合理切换多进程让宏观上多进程并行,无论何时都有进程运行,使
CPU 资源得到最有效利用。内存管理使用一块内存区域给多个进程使用,节省内
存资源。虚拟文件系统屏蔽了不同文件的细节,让用户可以使用一种方式通过例如
read write 等统一接口实现对不同类型文件的访问,如果没有虚拟文件系统,用
户访问文件只能直接访问存储设备上文件存放的位置,这显然对于用户访问文件
非常不方便。进程通信是指内核支持多进程之间通过信号量、共享内存等方式,实
现互斥利用资源以及进程间消息传递,随着软件功能越来越复杂,目前几乎没有单
进程的软件,因此进程调度属于内核中非常重要的功能。网络子系统包含各种网络
协议以及对网络设备的驱动程序,可以让系统实现网络传输功能 [41]

3.2.2 Linux 内核的配置与编译
对于龙芯 2K1000 处理器,考虑到软件的可互换性和可移植性,本课题选择龙
芯官方获得支持 MIPS 架构的嵌入式 Linux 源代码,在 ubuntu 虚拟机中对 Linux
核进行裁剪和交叉编译。主要工作流程如下:
1 )获取 Linux 源码
从龙芯官方 ftp 下载内核源码压缩包并解压,生成对应的内核源码目录。
2 )配置环境变量
#vi .bashrc
在文件最后一行增加交叉编译工具链的绝对路径
#export PATH=/home/troy/opt/gcc-4.9.3-64-gnu/bin:$PATH
#source .bashrc 使配置的环境变量生效
3 )内核裁剪配置
Linux 内核代码中提供使用图形化界面进行内核裁剪的工具,本课题不直接修
Linux 的编译文件代码,而是使用图形界面工具进行内核裁剪,命令如下:
#make ARCH=mips CROSS_COMPILE=mips64el-linux- menuconfig
运行该命令之后会弹出如图 3-4 所示的内核配置界面。

由于本课题使用龙芯官方维护 Linux 内核,需要根据龙芯 2K1000 处理器实际
情况对内核进行一些裁剪:
1 )增加帧缓冲区驱动
Device Driver >
Graphics support >
Support for frame buffer devices >
Loongson Frame Buffer Support
(2)增加龙芯 2K1000 处理器 SPI 总线控制驱动
Device Driver >
SPI support >
<*>Loongson SPI Controller Support
(3)增加龙芯 2K1000 处理器 VGA 驱动
Device Driver >
Graphics support >
<*>Loongson VGA DRM
[ ] use platform device
(4)将自己开发的网络驱动等编译进内核
(5)删除如邮箱、无线网络等不需要使用的驱动程序和功能
4 )编译内核
#make ARCH=mips CROSS_COMPILE=mips64el-linux- ,对内核进行编译。如
3-5 所示编译完毕之后在内核目录下生成 vmlinux 为可移植的 Linux 内核镜像,
vmlinuz 为可移植的 Linux 内核压缩镜像。由于嵌入式系统一般资源有限,所以使
vmlinuz 作为系统内核镜像。

 

3.3 根文件系统制作
3.3.1 Linux 根文件系统
内核启动后首先挂载根文件系统,根文件系统除了有文件系统存储和管理数
据的功能,也有普通文件系统没有的功能。根文件系统中一般在 /etc 目录下存放着
许多初始化脚本和配置文件,负责系统启动过程中的初始化功能。根文件系统在内
核启动最后阶段被挂载到根目录 / ,其他目录再挂载到根目录 [42]
虽然根文件系统负责 Linux 内核启动过程中的初始化工作,但在嵌入式系统
中它与内核一般是分开的,这是由于内核负责一些进程调度等操作系统的基本工
作,这些基本工作在所有处理器平台下基本相同。但是根文件系统负责配置工作,
不同的处理器配置方法和具体内容不同,因此根文件系统和内核分离,可以让嵌入
式软件系统的可移植性更好。
3.3.2 根文件系统制作
制作根文件系统常用工具是 BusyBox Buildroot [43] ,由于 BusyBox 使用较为
繁琐,因此本课题使用 Buildroot 工具来制作根文件系统。 Buildroot 包含了 Makefile
Kconfig ,可以用来构建内核、引导程序和根文件系统,在嵌入式开发中主要用
来构建根文件系统。使用 Buildroot 制作根文件系统镜像步骤如下:
1 )下载并配置 Buildroot
下载并解压 Buildroot 之后,使用龙芯 2k1000 对应的 config 文件替换之前默
config 文件,具体命令如下:
#wget http://ftp.loongnix.org/embedd/ls2h/Buildroot/
#sudo tar -zxvf Buildroot.tar.gz
#cp ls2k_docker-systemd-gcc-4.9.3.config .config
2 )创建自动编译脚本
通过使用可执行脚本,将编译根文件系统步骤放在一个脚本文件中,减少操作
复杂度,具体命令如下:
#touch cmd.sh
#vi cmd.sh
脚本内容如下:
#! /bin/bash
export LANG=C
export PATH=/home/troy/opt/gcc-4.9.3-64-gnu/bin/:$PATH
make ARCH=mips CROSS_COMPILE=mips64el-linux- -j2
#chmod 777 cmd.sh
3 )使用图形化界面对 Buildroot 进行配置
#make menuconfig
Buildroot 图形化配置界面如图 3-6 所示,具体配置步骤如下:
1 Target options >
根据龙芯 2K1000 处理器实际参数配置 CPU 参数为小端 MIPS64
(2) Toolchain >
设置工具链 gcc-4.9.3-64-gun 的路径,根据虚拟机中工具链实际的目录来填写
(3) System configuration >
包含了开机之后系统的欢迎语和用户名及其密码
(4) Run a getty (login prompt) after boot >
配置串口的波特率,由于本课题中不使用串口而是直接外接屏幕来显示,因此
该项可以不进行设置。
(5) Kernel >
由于制作不附带内核的根文件系统,该项为空
(6) Target packages >
根据实际需求选择附带的嵌入式软件,本课题中只需要构建一个最基本的根
文件系统,因此不需要进行选择。
4 )开始编译 buildroot
buildroot 的顶层目录下执行如下命令:
#./cmd.sh
执行自动编译脚本进行编译。
编译成功后,如图 3-7 所示 /buildroot/output/images/ 目录下会生成 cpio
cpio.gz
ubi ubifs 以及 yaffs2 五种类型的根文件系统镜像。由于系统使用 SSD 卡作为存储
介质,因此选择除 ubifs 之外格式的文件系统。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/361947.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2023年 Android Studio Unable to find bundled Java version 解决方法

学习flutter过程中发现 Unable to find bundled Java version 错误搜索网上的解决方案都不对最后在 b站 https://www.bilibili.com/video/BV1S4411E7LY?p17&vd_sourced7cf0e2cd70b3cc57314d2efcb598c3d 教程的课件中找到了解决方哦 我的flutter版本 C:\Users\Ken>flu…

MQTT传输JSON数据实例

想跑一个用MQTT传输JSON的实例&#xff0c;上网找了一下开源代码&#xff0c;找到一个比较合适的&#xff1a;https://blog.csdn.net/ktigerhero3/article/details/107178252&#xff0c;程序源码直接用这个就可以&#xff0c;然后过程中需要进行一下环境的配置&#xff0c;本篇…

本地事务详解

1、事务的基本性质 数据库事务的几个特性&#xff1a;原子性(Atomicity )、一致性( Consistency )、隔离性或独立性( Isolation) 和持久性(Durabilily)&#xff0c;简称就是 ACID&#xff1b;  原子性&#xff1a;一系列的操作整体不可拆分&#xff0c;要么同时成功&#x…

【Optional】告别丑陋判空,使用Optional类

一、概述 当项目中充斥着大量的、丑陋的判空语句&#xff0c;如下&#xff1a; if (user ! null) {Address address user.getAddress();if (address ! null) {Country country address.getCountry();if (country ! null) {String isocode country.getIsocode();if (isocod…

ksycopg2连接人大金仓数据库报错ksycopg2._ksycopg问题解决

一句话解决 ksycopg2目前仅支持python2.7/3.5&#xff0c;若版本不同&#xff0c;则会发生报错&#xff1a; 替换ksycopg2为psycopg2即可&#xff1a; pip install psycopg2 测试&#xff1a; import psycopg2conn psycopg2.connect(host"xxx.xxx.xxx.xxx", por…

average_precision_score()函数----计算过程与原理详解

最近在复现论文时发现作者使用了 sklearn.metrics 库中的 average_precision_score() 函数用来对分类模型进行评价。 看了很多博文都未明白其原理与作用&#xff0c;看了sklean官方文档也未明白&#xff0c;直至在google上找到这篇文章Evaluating Object Detection Models Usi…

【SpringBoot 自动配置】-EnableAutoConfiguration 注解

【SpringBoot 自动配置】-EnableAutoConfiguration 注解 续接上回 【Spring Boot 原理分析】- 自动配置 与【SpringBoot 自动配置】- Enable*注解 ,在前面笔者分析了在 SpringBoot 自动装配中的最重要的两个注解类&#xff0c; Condition 与 EnableAutoConfiguration 哎~说到…

从0到1搭建大数据平台之监控

大家好&#xff0c;我是脚丫先生 (o^^o) 大数据平台设计中&#xff0c;监控系统尤为重要。 它时刻关乎大数据开发人员的幸福感。 试想如果半夜三更&#xff0c;被电话吵醒解决集群故障问题&#xff0c;那是多么的痛苦&#xff01;&#xff01;&#xff01; 但是不加班是不可…

shiro总结

0x00 前言 此篇作为shiro总结篇&#xff0c;用于查漏补缺。 利用工具推荐&#xff1a;https://github.com/j1anFen/shiro_attack 0x01 反序列化 1.shiro 124 shiro 124&#xff0c;因为AES加密秘钥硬编码导致反序列化漏洞&#xff0c;124修复 Java 代码审计——shiro 1.2…

React 虚拟DOM的前世今生

引文 通过本文你将了解到 什么是虚拟DOM&#xff1f;虚拟DOM有什么优势&#xff1f;React的虚拟Dom是如何实现的&#xff1f;React是如何将虚拟Dom转变为真实Dom&#xff1f; 一、前言 要了解虚拟DOM&#xff0c;我们先明确一下DOM的概念。 根据MDN的说法&#xff1a; 文档…

Win10关闭自动更新

Win10关闭自动更新第一步&#xff1a;修改电脑系统时间第二步&#xff0c;设置自动更新时间第三步&#xff1a;再次修改系统时间为正确时间因为国内使用的操作系统&#xff0c;很多‍是非正版的系统&#xff0c;如果更新了系统&#xff0c;很容易造成电脑蓝屏&#xff0c;系统运…

90%的合同麻烦都源于签约“漏洞”,君子签电子签章闭坑指南来了!

业务签约中&#xff0c;有哪些合同麻烦呢&#xff1f;文字套路、印章造假、假冒代签、乱签漏签、信息泄露…事实上&#xff0c;这些签约“漏洞”都是源于签约风险排查不到位&#xff0c;管控不力而导致的&#xff0c;以至于后期履约中纠纷也不断。 君子签针对业务签约中的各类…

小黑子的python入门到入土:第二章

python零基础入门到入土2.0python系列第二章1. 三目运算符2. 运算符优先级3. if 语句3.1 简单的if语句3.2 if-else 语句3.3 if-elif-else 语句3.4 if 语句注意点4. pass 关键字5. 猜拳游戏案例6. while 循环语句7. while 练习8. range9. for...in 循环的使用10. break 和contin…

小林coding

一、图解网络 问大家&#xff0c;为什么要有TCP/Ip网络模型&#xff1f; 对于同一台设备上的进程通信&#xff0c;有很多种方式&#xff0c;比如有管道、消息队列、共享内存、信号等方式&#xff0c;对于不同设备上的进程通信&#xff0c;就需要有网络通信&#xff0c;而设备是…

约束优化:PHR-ALM 增广拉格朗日函数法

文章目录约束优化&#xff1a;PHR-ALM 增广拉格朗日函数法等式约束非凸优化问题的PHR-ALM不等式约束非凸优化问题的PHR-ALM对于一般非凸优化问题的PHR-ALM参考文献约束优化&#xff1a;PHR-ALM 增广拉格朗日函数法 基础预备&#xff1a; 约束优化&#xff1a;约束优化的三种序…

【MyBatis】逆向工程与分页插件

11、MyBatis的逆向工程 11.1、创建逆向工程的步骤 正向工程&#xff1a;先创建Java实体类&#xff0c;由框架负责根据实体类生成数据库表。 Hibernate是支持正向工程的。 逆向工程&#xff1a;先创建数据库表&#xff0c;由框架负责根据数据库表&#xff0c;反向生成如下资源…

公司技术团队为什么选择使用 YApi 作为 Api 管理平台?

在 2021 年 12 月份的时候我就推荐过一款软件程序员软件推荐&#xff1a;Apifox&#xff0c;当时体验了一下里面的功能确实很实用&#xff0c;但是当时公司有一套自己的 API 管理方案&#xff0c;所有 Apifox 暂时就没在内部使用。 直到最近要使用其他的 API 管理方案的时候才…

SAP ERP系统PP模块MRP运行参数说明

SAP/PP模块运行MRP(MD01/MD02)的界面有很多参数&#xff0c;这些参数的设置上线前由PP业务顾问根据实际业务需求定义好的&#xff0c;上线后一般不会轻易去调整&#xff0c;对于一般操作用户&#xff0c;按手册操作就行&#xff0c;不需要深入了解这些参数&#xff0c;但作为负…

收藏这几个开源管理系统做项目,领导看了直呼牛X!

项目SCUI Admin 中后台前端解决方案Vue .NetCore 前后端分离的快速发开框架next-admin 适配移动端、pc的后台模板django-vue-admin-pro 快速开发平台Admin.NET 通用管理平台RuoYi 若依权限管理系统Vue3.2 Element-Plus 后台管理框架Pig RABC权限管理系统zheng 分布式敏捷开发…

Redis的下载与安装

为便于大多数读者学习本套教程&#xff0c;教程中采用 Windows 系统对 Redis 数据库进行讲解。虽然 Redis 官方网站没有提供 Windows 版的安装包&#xff0c;但可以通过 GitHub 来下载 Windows 版 Redis 安装包&#xff0c;下载地址&#xff1a;点击前往。 注意&#xff1a;Win…