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 内核移植及分析
...
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...
08 pkg config
pkg-configpkg-config是一个命令行工具,使用它可以快速查看当前环境中安装了哪些第三方库,方便在一个库没提供.cmake文件时链接该库 核心用法12345678910pkg-config --list-all # 列出所有库pkg-config --modversion 库名 # 查看版本pkg-config --cflags 库名 # 查看编译标志pkg-config --libs 库名 # 查看链接标志pkg-config --variable=libdir 库名 # 库文件目录pkg-config --variable=includedir 库名 # 头文件目录pkg-config --variable pc_path pkg-config 注意事项 不是所有库都注册了 pkg-config 信息,有些库可能没有 .pc 文件,但是使用apt安装的带-dev的包一般都带.pc文件 如果找不到某个库,可能是因为: 库确实没有安装 库没有提供 .pc 文件 .pc 文件不在 pkg-config...
10 包管理工具
包管理工具在Linux系统中,包管理工具是软件安装、升级、卸载和维护的核心组成部分,它们极大地简化了软件管理过程。不同的Linux发行版采用了不同的包管理体系,比如Debian系用的是apt、RetHat系用的是yun… dpkg dpkg是Debian系列发行版中最底层的包管理工具,它直接面向本地.deb格式的软件包 dpkg的主要职责是对单个软件包进行操作,例如安装、卸载、查看包信息等 它本身并不具备自动解决依赖关系的能力,因此在使用dpkg安装软件时,如果该软件依赖的其他库或组件尚未安装,dpkg只会报错并终止操作,需要用户手动处理依赖问题 123456789101112131415161718192021222324# 安装本地的.deb软件包,如果依赖缺失会报错但不会自动解决dpkg -i package.deb# 卸载已安装的软件包(但不删除/etc下的配置文件,适合以后重新安装)dpkg -r package_name# 完全卸载软件包(同时删除配置文件)dpkg -P package_name#...
02 Linux设备驱动模型
Linux设备驱动模型简介Linux设备驱动模型是内核中用于统一管理硬件设备、驱动程序和总线关系的核心框架。它通过一系列抽象结构(如struct device、struct device_driver、struct class、struct bus_type等)构建了一个层次化的设备拓扑,使内核能够动态管理设备的生命周期(如热插拔、电源管理),并为用户空间(通过 /sys)提供标准化的设备信息接口。 设备驱动框架和设备驱动模型不是一个东西,前者指的是GPIO、Input、Pinctl等子系统,而后者主要是Linux内核对于驱动开发中的一种设计模式 Linux设备驱动模型的核心思想是把我们编写的驱动代码进行分层解耦: 设备:提供硬件资源 驱动:使用设备提供的硬件资源进行初始化等操作 总线:将设备和驱动匹配起来 任何设备都挂在在某个总线上,即使物理上没有总线,也要虚拟出来个总线(platform) 核心目标 统一管理硬件:无论设备是 PCI、USB、I2C...
22 HDMI
HDMI定义HDMI(高清晰度多媒体接口)主要用来传输视频、音频信号,它有type-a/b/c 3种形式的物理接口,最常用的是type-a的,包含19个引脚 引脚号 信号名称 功能描述 1 TMDS Data2+ 视频/音频数据通道2(差分对正极) 2 TMDS Data2- 视频/音频数据通道2(差分对负极) 3 TMDS Data1+ 视频/音频数据通道1(差分对正极) 4 TMDS Data1- 视频/音频数据通道1(差分对负极) 5 TMDS Data0+ 视频/音频数据通道0(差分对正极) 6 TMDS Data0- 视频/音频数据通道0(差分对负极) 7 TMDS Clock+ 像素时钟信号(差分对正极) 8 TMDS Clock- 像素时钟信号(差分对负极) 9 CEC 消费电子控制信号(设备联动控制) 10 HPD (Hot...
001 安卓概述
安卓概述系统架构安卓是基于Linux内核的一种在移动设备中非常常用的操作系统,从整体来看它分为以下几层: Linux内核层 提供硬件驱动(显示、摄像头、蓝牙等)和OS的基本功能(进程调度、内存管理、电源管理、安全、网络协议栈…等) 基于开源Linux内核,在此基础上添加了部分安卓专用的驱动 安卓对于Linux内核的改动1.出于效率,安卓没有使用glibc,而是采用了google开发的Bionic Libc 2.没有完全照搬Linux内核,除了修正一些Bug外,还加了不少内容,比如补充了一些文件系统 3.没有本地基于X服务的窗口系统 4.对Linux的驱动框架进行了增强,比如Binder、电源管理、USB… 硬件抽象层(HAL)作用:标准化硬件接口(如相机、传感器),允许厂商定制驱动而不影响上层框架。保护了硬件厂商的知识产权,隐藏特定平台的硬件接口细节 实现形式: 传统 HAL(Android 8 之前):直接通过 动态库(.so) 调用驱动 现代 HAL(Android 8+):通过...






