【linux】正点原子linux教程学习

2023-05-16

  最近看了正点原子的linux教学视频,感觉讲的挺不错,简单来整理一下,对此有个印象。

一、裸机代码

  视频教程中讲了nxp的imx6ull的soc(原来的freescale下面的产品,后来被nxp收购了,该soc使用的时arm内核,arm v7架构,最高主频800mhz,目前公司使用的nova的cpu也是完全相同的架构,最高主频900mhz,感觉相差不多)。
  这个系列的视频教程讲的比较详细,讲了芯片如何跑起来的很多相关的知识:

  • 链接地址:gcc链接时可以选择链接地址,链接地址可以在gcc的命令中给出,也可以在链接脚本.lds文件中给出。这样就可以在编译时设置,入口代码的地址。这让我会想起以前看编译原理的.o文件时可重定向的文件(应该就是地址无关代码),而链接好之后就是地址有关的代码了,应该必须放在链接时规定好的地址区域才能运行。正点原子在imx6ull裸机中设置的代码入口地址是0x87800000,说是因为u-boot的链接起始地址也是这个。
  • c语言环境的配置:使用c语言函数时,需要使用堆栈,使用cpu的sp寄存器。所以在执行c语言函数时,是需要设置sp寄存器(堆栈指针)的值,这样也就设置了栈底的地址,就可以使用c的堆栈了。因为c语言跑起来需要sp寄存器被设置。所以cpu跑的第一段代码肯定是汇编写的。所以上面的代码入口地址的代码时汇编代码。
  • bootrom:soc开发商有时候没有内部flash,不像stm32那样,从内部flash启动代码。这个imx6ull就是最先得启动nxp厂商在内部rom放置得代码,这块rom区域用户无法使用。rom中得代码就做了一些初始化得工作,比如:初始化ddr(这些soc的代码在ddr中运行,而不是像stm32那样)。(原子教程说不是所有得soc厂商都会在bootrom里面初始化ddr,如果厂商没有在bootrom中做初始化,就需要自己在汇编代码中做相关得初始化工作)
  • 选择启动设备: imx6ull可以设置从什么地方启动,可以让用户选择 从哪个设备启动:sd卡,emmc,nand等,这个好像stm32也可以设置。这里首先设置从内部rom启动,这也就是执行bootrom里面的代码,然后bootrom会从sd卡,emmc等设备获取头部信息,做一些初始化工作:初始化ddr等,并将bin文件拷贝到指定的地方:链接起始地址。
  • 汇编代码: 汇编代码就是从bootrom里面跑完的第一段代码,正点原子的是放置在0x87800000。里面主要定义了中断向量表中断处理函数等。这里面的内容跟stm32项目里面的汇编启动代码是很像的。只不过stm32的是soc厂商st帮着写了启动汇编文件,imx6ull的需要自己写启动汇编文件(bootrom里面并没有写中断向量表相关的内容)。中断向量表的第一个中断向量是reset复位中断,执行到这个就会转到复位中断处理函数,复位中断处理函数也在启动汇编文件中实现,里面会做一些初始化配置工作,可能还会调用类似c函数systeminit函数去做一些系统配置工作,最后该函数会调用主函数main。但是这里在主函数中才调用一些函数做中断相关的配置:使能中断,配置中断优先级等。这里就是在配置中断之前就已经使用了复位中断的函数,这里感觉是因为复位中断向量放在向量表的第一个,所以会最先走到这块,然后会跳转到复位中断处理函数。(处理器里面有硬件逻辑会使发生中断后跳转的对应的中断表,然后跳转到对应的中断处理函数,这就需要看cortex架构相关东西了),在Ubuntu下编译arm的工程,要使用交叉编译器。
      小结: 看了这系列的裸机视频之后,更理解cpu的运行流程了,感觉stm32的启动汇编代码也不是完全看不懂了。尤其是看了imx6ull的复杂,感觉stm32真是相对简单许多,即使使用寄存器函数,不使用库函数也行了。

二、嵌入式linux

linux移植三大部分

  • uboot
  • linux内核(包含设备树)
  • 根文件系统

u-boot

  • 要熟悉整个u-boot的工程目录,怎么编译,配置, 查看顶层的Makefile,但是这好像非常复杂,所以怎么配置,编译,移植u-boot也是比较有难度。
  • u-boot是开源的,可以从官网获得最原始的u-boot,但是一般soc厂家会对最原始的u-boot进行修改以适配自己的芯片和板子,然后使用soc的开发板厂商会进一步进行修改以适配自己的外设。所以是:原始u-boot–》soc厂商的u-boot–》板子厂商的u-boot。
  • 用于启动linux,可以烧写在板子上直接跑起来。相当于一个大型的裸机程序。
  • 里面驱动什么也都很全,网络驱动等都有,u-boot的命令非常多,且很全面,各种内存操作,网络操作,启动内核操作等都有,据说掌握u-boot的命令对linux的开发非常重要。
  • 正点原子通常利用u-boot的网络功能:nfs功能(网络文件系统),将系统镜像zImge什么的从利用u-boot的网络功能拷贝到内存中启动。

linux内核

  • 要熟悉整个linux内核的工程目录,怎么编译,配置, 查看顶层的Makefile,但是这好像更加复杂(据说u-boot的工程项目很多都参考了linux的项目,所以两者的的makefile,配置什么的都很相似),所以怎么配置,编译,移植linux内核也是比较有难度。
  • 设备树:貌似是为了方便驱动开发而整出来的东西,也需要编译设备树什么的,现在不太懂。
  • 只有linux内核,系统跑不起来,需要根文件系统。通常系统的内核并不大,zImage,或者uImage也就几M,根文件系统就大得多。
    在这里插入图片描述
  • 上图中的nove的项目中的linux内核镜像uImage就只有11M,而根文件系统rootfs.img 就有80M。
  • 并且内核的大半还都是驱动。

根文件系统

  • 根文件系统就是linux里面根目录里面的那些文件,那些文件在移植linux系统的时候也要配置移植的,包含各种bin文件(编译好的软件),库文件,配置文件等等。是linux运行的基础。
  • 配置根文件系统也有很多种工具,用于生产那些可用的bin文件:ls,cat等常用的命令的实现文件等。
  • 由于根文件系统比较大,也可以利用Ubuntu做nfs服务器,将板子的根文件系统不放在板子中,直接放在ubuntu下,免得调试的时候老要反复烧写,方便开发。
  • busybox,用于编译生成根文件系统,

BusyBox 是一个集成了三百多个最常用Linux命令和工具的软件。BusyBox
包含了一些简单的工具,例如ls、cat和echo等等,还包含了一些更大、更复杂的工具,例grep、find、mount以及telnet。有些人将
BusyBox 称为 Linux 工具里的瑞士军刀。简单的说BusyBox就好像是个大工具箱,它集成压缩了 Linux
的许多工具和命令,也包含了 Android 系统的自带的shell。

根据以上百度内容可以知道,busybox应该是拥有许多linux小程序源码的工程,可以编译成linux所需的小工具的可执行文件,根据正点原子的后面还有添加库文件的操作,busybox应该不包括linux系统里面的库文件。

三、linux驱动开发

  • Linux驱动分三类:字符设备,块设备,网络设备。

  • linux的用户空间(用户态)和内核空间(内核态)
    kernel和驱动程序再内核空间跑,应用程序在用户空间跑。为了安全性的设置,用户空间程序会受限,暂时不去深究,要了解详细的内容可以百度去看。
    应用程序要访问内核资源怎么办?三种方法:系统调用,异常(中断)和陷入。
    系统调用:
    应用程序不直接调用系统调用,而是通过库API函数来间接调用系统调用,比如POSIX,API和c库,printf就是c库里面的函数,它里面实现的细节就调用了系统调用。

  • linux驱动可以编译到内核中,zImage;也可以编译成模块,.ko文件。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【linux】正点原子linux教程学习 的相关文章

  • 没有可用的符号表信息

    我正在测试第三方的库 它崩溃了 当我想查看崩溃的原因时 我的 gdb 告诉我没有可用的调试符号 Program received signal SIGSEGV Segmentation fault Switching to Thread 0
  • PHP 致命错误:未找到“MongoClient”类

    我有一个使用 Apache 的网站 代码如下 当我尝试访问它时 我在 error log 中收到错误 PHP Fatal Error Class MongoClient not found 以下是可能错误的设置 但我认为没有错误 php i
  • 如何制作和应用SVN补丁?

    我想制作一个SVN类型的补丁文件httpd conf这样我就可以轻松地将其应用到其他主机上 If I do cd root diff Naur etc httpd conf httpd conf original etc httpd con
  • 并行运行 make 时出错

    考虑以下制作 all a b a echo a exit 1 b echo b start sleep 1 echo b end 当运行它时make j2我收到以下输出 echo a echo b start a exit 1 b star
  • 如何模拟ARM处理器运行环境并加载Linux内核模块?

    我尝试加载我的vmlinux into gdb并使用 ARM 内核模拟器 但我不明白为什么我会得到Undefined target command sim 这是外壳输出 arm eabi gdb vmlinux GNU gdb GDB 7
  • 在 Linux 中禁用历史记录 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 要在 Linux 环境中禁用历史记录 我执行了以下命令 export HISTFILESIZE 0 export HISTSIZE 0 u
  • bluetoothctl 到 hcitool 等效命令

    在 Linux 中 我曾经使用 hidd connect mmac 来连接 BT 设备 但自 Bluez5 以来 这种情况已经消失了 我可以使用 bluetoothctl 手动建立连接 但我需要从我的应用程序使用这些命令 并且使用 blue
  • 为什么我收到“无法进行二进制日志记录”的信息。在我的 MySQL 服务器上?

    当我今天启动 MySQL 服务器并尝试使用以下命令进行一些更改时用于 MySQL 的 Toad http www quest com toad for mysql 我收到此消息 MySQL 数据库错误 无法进行二进制日志记录 消息 交易级别
  • 无法加载 JavaHL 库。- linux/eclipse

    在尝试安装 Subversion 插件时 当 Eclipse 启动时出现此错误 Failed to load JavaHL Library These are the errors that were encountered no libs
  • 强制卸载 NFS 安装目录 [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 Locked 这个问题及其答案是locked help locked posts因为这个问题是题外话 但却具有历史意义 目前不接受新的答案
  • Linux 中的无缓冲 I/O

    我正在写入大量的数据 这些数据数周内都不会再次读取 由于我的程序运行 机器上的可用内存量 显示为 空闲 或 顶部 很快下降 我的内存量应用程序使用量不会增加 其他进程使用的内存量也不会增加 这让我相信内存正在被文件系统缓存消耗 因为我不打算
  • 如何在 Linux 中编写文本模式 GUI? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 当我编写脚本 程序时 我经常想弹出一个简单的文本 gui 来提示输入 我该怎么做 例如 来自 Shel
  • 如何在bash中使用jq从变量中包含的json中提取值

    我正在编写一个 bash 脚本 其中存储了一个 json 值 现在我想使用 Jq 提取该 json 中的值 使用的代码是 json val code lyz1To6ZTWClDHSiaeXyxg redirect to http examp
  • 为什么内核需要虚拟寻址?

    在Linux中 每个进程都有其虚拟地址空间 例如 32位系统为4GB 其中3GB为进程保留 1GB为内核保留 这种虚拟寻址机制有助于隔离每个进程的地址空间 对于流程来说这是可以理解的 因为有很多流程 但既然我们只有 1 个内核 那么为什么我
  • 无法从 jenkins 作为后台进程运行 nohup 命令

    更新 根据下面的讨论 我编辑了我的答案以获得更准确的描述 我正在尝试从詹金斯运行 nohup 命令 完整的命令是 nohup java jar home jar server process 0 35 jar prod gt gt var
  • Linux中的定时器类

    我需要一个计时器来以相对较低的分辨率执行回调 在 Linux 中实现此类 C 计时器类的最佳方法是什么 有我可以使用的库吗 如果您在框架 Glib Qt Wx 内编写 那么您已经拥有一个具有定时回调功能的事件循环 我认为情况并非如此 如果您
  • chown:不允许操作

    我有问题 我需要通过 php 脚本为系统中的不同用户设置文件所有者权限 所以我通过以下命令执行此操作 其中 1002 是系统的用户 ID file put contents filename content system chown 100
  • sendfile64 只复制约2GB

    我需要使用 sendfile64 复制大约 16GB 的文件 到目前为止我所取得的成就是 include
  • 如何在数组中存储包含双引号的命令参数?

    我有一个 Bash 脚本 它生成 存储和修改数组中的值 这些值稍后用作命令的参数 对于 MCVE 我想到了任意命令bash c echo 0 0 echo 1 1 这解释了我的问题 我将用两个参数调用我的命令 option1 without
  • arm64和armhf有什么区别?

    Raspberry Pi Type 3 具有 64 位 CPU 但其架构不是arm64 but armhf 有什么区别arm64 and armhf armhf代表 arm hard float 是给定的名称Debian 端口 https

随机推荐

  • vue实现表格的更多查询功能

    场景一 xff1a 一行足够显示完所有的查询条件 场景二 xff1a 需要多行才能显示完所有的查询条件 1 首先创建一个按钮组件SearchButton lt template gt lt el form inline class 61 3
  • FreeROTS原理学习笔记

    前言 xff1a 这仅是一篇学习笔记记录 xff0c 无指导意义 想详细了解的人 可看CSDN博主 zhzht19861011 的原创文章 FreeROTS系统 xff1a 使用习惯 xff1a 1 一般来说 xff0c 都是利用下载好的例
  • RuntimeError: dataset.make_initializable_iterator is not supported when eager execution is enabled.

    这是由于代码的接口更改 xff0c 无法正常连接数据集 xff0c 即新版本接口变了 需要按照第4章的数据集部分 xff0c 改一下数据集接口
  • 基于Android 的串口工具类

    欢迎使用串口通讯 xff0c 首先说明下我这里使用的是RS485通讯 xff0c 采用的是半双工通讯 xff0c 所以收和发不能同时操作需要发送等待一段时间来接收完数据在发送其他指令了 xff0c 这里顺便在说下RS232 xff0c 它采
  • ROS安装步骤

    ROS xff08 Robot Operating System xff09 起源于2007年斯坦福大学人工智能实验室与WillowGarage公司的个人机器人项目 xff0c 其后被Willow Garage公司开源和发展 xff0c 目
  • ros对应不同的ubuntu版本

    ros对应不同的ubuntu版本有不同的版本名字 xff1a ubuntu16 04对应ros kinetic xff1b ubuntu18 04对应ros melodic xff1b ubuntu20 04对应ros noetic 在Ub
  • ubuntu20.04安装 gym-gazebo

    官网流程安装 xff1a https github com erlerobot gym gazebo 一 环境与依赖 1 基本环境 xff1a ROS NoeticGazebo11 11 0 2 ROS相关依赖 xff1a sudo apt
  • 【无标题】Realsense ROS驱动安装以及报错处理

    参考官网 xff1a https github com IntelRealSense realsense ros 1 命令行安装 xff1a 这种方式比较简单 xff0c 没有报错 需要注意的是安装位置需要自己找 xff0c 后续修改lau
  • FAQ问答项目代码细节————BM25+BERT句子相似度

    一 建立FAQ库 一个问题三个形式 xff0c 数据增强之后问题和答案一一对应 xff0c 19MB的ask txt xff0c 答案保存在answer0 424中 xff0c 每个文件1000个回答 节省处理时间 二 BM25初始化 目的
  • 摄星智能电话面试题

    1 NER中的维度变换 xff0c BiLSTM中的层之间变换 43 CRF的输入输出原理 xff0c 维特比解码 xff1b https zhuanlan zhihu com p 97676647 https blog csdn net
  • 七月在线NLP笔试面试题知识点记录

    1 Levenshtein https www jb51 net article 98449 htm 2 LDA主题模型 https blog csdn net v july v article details 41209515 3 Les
  • python3代码加密

    Python代码加密步骤 1 准备文件 main py为要加密的主脚本 test py为测试脚本 运行测试脚本测试 encryption py为加密脚本 运行加密脚本 运行结果如下 xff1a 其中红框部分为加密文件 更换主脚本 将main
  • 文件打开方式关联错误解决方法

    1 首先更改默认打开方式 xff0c 有如下方法 xff1a 开始 gt 控制面板 gt 程序 gt 默认程序 gt 将文件类型或协议与程序关联 gt 找到相应文件扩展名 gt 点击更改程序 gt 浏览 gt 找到相应程序的安装位置 gt
  • kenLM 在windows上的Cygwin64模拟linux安装详解

    欲买桂花同载酒 前前后后搞了将近三天 xff0c 就为了使用kenlm训练一个n gram语言模型做纠错用 xff0c 一直在安装kenlm xff0c 终于安装成功了 xff0c 真是刺激 xff01 xff01 xff01 没有用公司的
  • SVN+IEDA实战

    工作要接触JAVA项目 xff0c 看来是时候增加一门语言能力了 xff0c 在以前的多轮对话项目上做二次开发 xff0c 公司希望用python实现全部过程 xff0c 原项目使用java和scala开发 公司用SVN xff0c 以前用
  • MySQL学习总结(全)

    一 数据库操作 1 连接数据库 xff1a mysql u root p 2 查看已经有的数据库 xff1a show databases 3 新建数据库 xff1a create database database name 4 删除数据
  • Anomaly Detection(异常检测)的原理及最新的技术应用(李宏毅视频课整理和总结)

    文章目录 0 前言1 Introduction1 1 Problem Formulation1 2 Base Idea 2 With Classifier2 1 Base Method2 2 Evaluation2 3 More2 3 1
  • NoVNC—以Web方式交付VNC远程连接

    文章目录 一 noVNC是什么二 CentOS 7 安装novnc1 环境2 安装配置3 一键安装脚本 三 Windows 安装novnc1 环境2 安装utralNVC server3 安装Node js4 安装noVNC和websock
  • ALTERA系列的FPGA通过RS232串口在线升级

    ARM系列的芯片 xff08 例如STM32系列 xff09 可以通过YMODEM协议实现在线升级 xff0c 在芯片中写入BOOT程序 APP程序就可以实现 那FPGA可以这样做吗 xff0c 答案是可以的 要想搞清楚流程就必须了解FPG
  • 【linux】正点原子linux教程学习

    最近看了正点原子的linux教学视频 xff0c 感觉讲的挺不错 xff0c 简单来整理一下 xff0c 对此有个印象 一 裸机代码 视频教程中讲了nxp的imx6ull的soc xff08 原来的freescale下面的产品 xff0c