06 开机自启动
Linux初始化系统 想要设置开发板的某程序开机时自启动,有多种方式,本质上是使用了Linux的初始化系统。在linux内核启动后期会尝试加载用户空间的init程序,init程序是由内核启动的第一个用户空间程序(PID为1),该程序负责启动用户空间的服务和程序 init程序由初始化系统提供,可以通过以下方法查看系统的init进程到底是谁: 法1: 法2:pstree -p BusyboxBusyBox 是一个高度集成的嵌入式Linux工具集,它既是一个轻量级初始化系统,也是一个精简版的Unix命令集合。它的核心设计目标是用最小的空间提供完整的Linux系统功能 BusyBox 提供了一个简化的init程序,用于替代传统的 SysVinit或 systemd,它的init程序有2种实现形式: (1) 传统 SysVinit 风格 配置文件:/etc/inittab 启动流程: 内核启动后执行 /sbin/init(通常是 BusyBox 的符号链接) BusyBox 读取 /etc/inittab,定义运行级别和启动脚本 执行 /etc/init.d/中的脚本(如...
00 常用路径总结
常用路径总结在Linux中,我们如果用apt之类的包管理工具安装些第三方库,他们放置的位置都出奇的一致,下面来总结一下 头文件编译时默认头文件查找目录 /usr/include /usr/include/x86_64-linux-gnu(架构相关的子目录) /usr/local/include(大部分发行版是默认的,但也有的不是) 搜索规则 编译器只维护一组搜索根目录列表 不会递归扫描子目录 会将#include中写出的相对路径与搜索根目录拼接后匹配 例如:#include <foo/bar.h> 会依次尝试: 123/usr/include/foo/bar.h/usr/include/x86_64-linux-gnu/foo/bar.h/usr/local/include/foo/bar.h(如果该路径在默认列表中) 第三方库头文件的组织方式 第三方库通常在搜索根目录下创建以库名命名的子目录 12/usr/include/x86_64-linux-gnu/opencv4/usr/local/include/mylib 使用方式为:#include...
11 查看配置信息
查看配置信息 有的时候,我们在使用其它人编译的内核的时候,可能希望知道某些配置项的设置,可以通过下面的方法进行查看 uboot启动参数1cat /proc/cmdline 内核编译配置1zcat /proc/config.gz 这个命令会显示当前正在运行的内核配置,所有的配置项(例如启用的驱动程序、内核功能等)都将以 CONFIG_* 形式列出。通过这些配置项,可以了解到该内核的编译参数。 内核版本可以通过以下命令查看当前系统的内核版本和其他相关信息: 1uname -r 或者详细一点: 1uname -a 这将输出内核版本、系统架构、主机名等信息。 磁盘分区信息查看磁盘和分区信息: 1lsblk 或者: 1fdisk -l 这将列出所有磁盘和分区的详细信息
04 内核移植及分析
...
01 驱动开发概述
Linux驱动开发概述简介Linux驱动开发是设备驱动模型、驱动子系统、内核基础设施三者的深度整合: 设备驱动模型提供通用框架,实现驱动与设备的匹配 各个子系统实现垂直领域优化(如输入、存储、网络) 内核设施与硬件操作解决并发、内存、中断等底层问题 驱动开发子系统定义 子系统是指针对特定功能领域或硬件类型设计的软件框架。其核心目标是解耦硬件差异,提供统一的API,使得驱动开发者无需直接操作底层寄存器或硬件细节,而是通过标准化API完成功能开发 所有的驱动子系统的实现均遵循分层架构原则 用户接口层:通过sysfs或/dev节点提供控制接口 核心层:实现事件队列、资源分配等通用逻辑 硬件驱动层:厂商实现具体寄存器操作 123456789 用户空间 │ ▼ 用户口层(如VFS、sysfs) │ ▼ 子系统核心层(标准API) ↗ ↖ ↖设备驱动层A 驱动层B ...
08 进不去系统
进不去系统 在做BSP开发时,难免会因为设置了什么东西,导致启动参数之类的错误,而无法正常进入系统了,这个文档记录一下自己遇到的问题和解决方法 extlinux.conf错误这个问题出现在调试地平线板子的时候,因为修改错误了/boot/extlinux/extlinux.conf,导致开发板在uboot引导kernel的时候错误,只能进入initramfs 解决思路其实很简单,就是再启动内核前把/boot/extlinux/extlinux.conf改回去。但是这其实还是比较困难的,因为在uboot或者initramfs中是没有直接挂载Linux的/boot目录的,所以没法直接访问 解决办法: 首先得知道/boot在哪个分区 12345678910111213141516171819202122sunrise@ubuntu:/media$ lsblkNAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINTSmmcblk0 179:0 0 59.6G 0 disk├─mmcblk0p1 179:1 0 1M...
24 网卡驱动移植
网卡驱动移植型号确认及模式设置在移植网卡驱动前,首先得知道它的型号。如果是USB网卡的话,可以通过lsusb命令查看 12345lsusb ...Bus 001 Device 003: ID 0bda:1a2b Realtek Semiconductor Corp. RTL8188GU 802.11n WLAN Adapter (Driver CDROM Mode... 很多网卡在未使用时,可能被初始化成U盘的模式,这时还需要我们将其转成网卡模式 这里RTL8188GU并不是真正的型号,因为它此时不是真正的网卡模式,RTL8188GU是Realtek常用“老型号马甲” 可以通过以下的指令,将USB网卡切换到真正的网卡模式 12345sudo apt install usb-modeswitch usb-modeswitch-datasudo usb_modeswitch \ -v 0bda -p 1a2b \ -M...
04 SoC与系统架构
SoC与系统架构SoC/MCU/MPU/CPU的区别 SoC是将一个完整的系统整合到单一芯片上的集成电路,包括 CPU、GPU、存储控制器、外设接口、专用加速器(GPU/NPU/VOP)等 SoC 不一定有片上 RAM(有些会集成 LPDDR),但一定有外部内存接口 MCU是一种集成了CPU、内存(如闪存、RAM)、以及多种外设(如ADC、DAC、串行通信接口、定时器等)于一体的芯片,可以看成简易版的SoC。与SoC的核心区别: MCU通常不跑复杂OS(最多RTOS),但是SoC一般跑Linux/Android之类的 MCU的片上RAM/ROM都比较小,功耗比较低 MPU:不带片上...
01 CMake的基本用法
CMake基本用法1.CmakeListsCmakeLists.txt是 cmake 的构建定义文件,如果工程存在多个目录,需要确保每个要管理的目录都存在一个CMakeLists.txt 2.CMake的语法 现代CMake和之前CMake的区别: 现代CMake是面向Tartget的,什么添加头文件、库的路径都是针对某个Target添加而不是对整个目录都添加进去。 cmake_minimum_required() 添加CMake编译的最低版本 project() 命名该CMake工程 add_executable(<name> [source1] [source2 ...]) 指定该工程编译将生成.exe的可执行文件 add_library(<name> [STATIC|SHARED|MODULE] [source1] [source2 ...]) 指定该工程编译生成静态/动态库 aux_source_directory(dir...








