嵌入式学习-----Linux常用知识/命令
本文总结了Linux系统的核心知识点, 重点涵盖了Linux系统管理、开发调试和网络配置等实用技能,适合作为Linux学习和开发
知识点大纲
部分基础Linux指令已经在前面C语言总结中介绍过了,现介绍其他需要知道的知识点或常用指令
Linux:软件安装、进程管理、硬链接和软连接、解压和压缩、make工具
嵌入式系统(把软件嵌入到硬件里面)
嵌入式系统是以应用为中心,以计算机技术为基础,并且软硬件可裁剪,适用于对功能、可靠性、成本、体积、功耗有严格要求的专用计算机系统。
UNIX和Linux的区别:
1)Linux是开发源代码的自由软件.而UNIX是对源代码实行知识产权保护的传统商业软件。
2)UNIX系统大多是与硬件配套的,而Linux则可运行在多种硬件平台上.
1. linux内核系统架构
应用层:app shell命令
|C库 | shell解析器
|
|
-------------------系统调用-----------------------
内核层
功能:内存管理 文件管理 网络管理 设备管理 进程管理
----------------------------------------------------
硬件层:鼠标、键盘、lcd(屏幕)
1.1. shell解析器的分类:
sh:Unix的第一个Shell程序,为工业标准。
csh:Shell脚本的编程风格类似于C语言
ksh:解决了Bourne Shell的用户交互问题,并克服了C Shell的脚本编程怪癖的缺点。Korn Shell的缺点是需要许可证
bash:最流行的Shell。特点:能够提供环境变量以配置用户Shell环境,支持历史记录,内置算术功能,支持通配符表达式,将常用命令内置
用户、shell、内核、硬件之间的关系:
用户在命令行提示符下键入命令文本,开始与Shell进行交互。
接着,Shell将用户的命令或按键转化成内核所能够理解的指令
控制操作系统做出响应,直到控制相关硬件设备。
然后,Shell将输出结果通过Shell提交给用户。

2. 虚拟机的网络类型
1) 桥接模式:主机和虚拟机分别拥有不同的ip地址,可以实现和外界设备通信
2) NAT模式:也可以联网,但是和主机共用同一个ip地址,外界无法识别虚拟机和主机发送的信息
3) 仅主机模式:不能联网,只能和主机通信
查看网络连接是否畅通
ping 一个网址(也可以查看连接速度)
配置和显示网络接口信息的命令
ifconfig
3. 部分Linux命令/shell命令
shell命令格式:
通常一条命令包含三个要素:命令名称、选项、参数。
命令名称是必须的,选项和参数根据实际情况进行填写
格式:命令名称 -命令选项 参数 参数 参数...
3.1. 查看内核版本
查看操作系统版本:
lsb_release -a或者 -r
cat /etc/issue cat的作用:查看相关文件中的内容
查看内核版本:
uname -a 或者 -r
cat /proc/version 文件中查看
3.2. 关机和重启
关机:
sudo shutdown -h now (立即关机)
sudo shutdown -h +5 (定时关机 min为单位)
sudo shutdown -h 20:13
重启:
sudo shutdown -r now:立即重启
sudo shutdown -r +时间:定时重启 min为单位
sudo shutdown -r 时间
sudo reboot now:立即重启
3.3. 软件安装
安装包类型
两种软件包:deb软件包 rpm软件包
deb软件包分为:二进制软件包(deb): ( .deb -- 安装软件的软件包)
源码包(deb-src):.dec

两种方式:
(1) 离线安装:dpkg
特点:安装时需要软件包存在,不需要从镜像站点获取软件包。
不需要网络,不能检查软件的依赖关系
sudo dpkg-i 软件包的完整名称:安装软件 //只需输入前面几个字母,其余用tab补齐
sudo dpkg-r 软件名:卸载软件
sudo dpkg-s 软件名:查看软件的安装状态
sudo dpkg -P 软件名:完全卸载
sudo dpkg -L 软件名:列出软件目录信息
(2) 在线安装:apt-get
特点:安装时不需要软件包存在,需要从镜像站点获取软件包
需要网络,能检查软件之间的依赖关系
apt-get:
sudo apt-get install 软件名:下载并安装软件
sudo apt-get remove 软件名:卸载软件
sudo apt-get remove --purge 软件名 :完全卸载
/var/cache/apt/archives --> 软件包默认存放的路径
sudo apt-get clean:清除下载的软件包
sudo apt-get download 软件名:下载软件包,但是不安装·//会显示没有安装权限:即不能安装
sudo apt-get upgrade 软件名:更新软件
3.4. 给命令起别名:alias
alias 新命令名称 = '原命令'
unalias 新名字 (取消别名)
3.5. 历史记录查询:history
直接执行:history (显示HISTSIZE条历史命令)(默认1000条)
history 10 (只显示10条历史记录)
echo $HISTSIZE (在终端显示环境变量HISTSIZE的值)
历史记录保存在家目录隐藏文件.bash_history下,默认保存HISTFILESIZE条命令(2000条)
终端关闭后,在终端上执行过的命令才会刷新到文件中
更改环境变量的值:
(1)临时修改:export HISTSIZE=10 只在当前终端有效
(2)从家目录中用vi编辑器永久修改:vi .bashrc中修改,在新打开的终端中生效

4. shell中的特殊字符
4.1. 通配符
当用户需要用命令处理一组文件,例如 file1.txt、file2.txt、file3.txt、file4.txt ……,用户不必输入所有文件名。可以使用shell通配符。
|
通配符 |
含义 |
实例 |
|
* |
匹配任意长度的字符 |
a*b a与b之间可以有任意长度的任意字符, 也可以一个也没有, 如aabcb, axyzb, a012b, ab。 |
|
? |
匹配任意一个字符 |
a?b a与b之间必须也只能有一个字符, 可以是任意字符, 如aab, abb, acb, a0b。 |
|
[...] |
匹配其中指定的任意一个字符 |
a[xyz]b a与b之间必须也只能有一个字符, 但只能是 x 或 y 或 z, 如: axb, ayb, azb。 |
|
[ - ] |
匹配指定一个字符范围 |
a[0-9]b 0与9之间必须也只能有一个字符 如a0b, a1b... a9b。 |
|
[^...] |
除了指定的某一个字符都可以 |
a[^xyz]b a与b之间是x或y或z某一个字符的时候不行。 |
|
[[:lower:]] |
匹配所有小写字母 |
|
|
[[:upper:]] |
匹配所有大写字母 |
4.2. 管道 |
将前一个命令作为后一个命令的输入
cat main.c | wc -l
//查看内容 | 输出有几行
4.3. 输入输出重定向
4.3.1. 输出重定向:
命令>file:将file作为输出源,file文件不存在创建
命令>>file:如果文件中存在内容则会追加,文件不存在则创建
命令&> file或者命令2>file:将由命令产生的错误结果输出到file文件
&> :如果是正确的结果会重定向到文件中 2> :如果是正确的结果会输出到终端
4.3.2. 输入重定向:
< <<
4.4. 命令置换符 ` `(反引号) 或者 $( )
将一个命令的输出作为另一个命令的参数
在一个命令的参数中使用另一个命令的输出
echo hello world `hostname`
![]()
5. 系统维护命令
1.man man(查看man手册) man 3 printf(查看第三章的printf)
2.su (用户切换,不输入默认切换到root:超管)
exit(退出用户切换)
3.date(查看当前系统时间)
4.df -Th(查看磁盘空间)
6. 磁盘相关操作
主要使用U盘完成
6.1. U盘链接到虚拟机
方式一:通过弹窗

方式二:虚拟机设置--->可移动设备--->U盘名

6.2. 查看U盘是否链接成功
ls/dev/sd* (sda开头的是ubuntu镜像自己的空间)
如果终端显示包含除了sda以外的其他内容,说明U盘连接并识别

6.3. 挂载
因为Linux下,万物皆文件,U盘连接进Linux后被识别为一个块设备文件,无法像wins下一样打开并写入内容,需要将U盘挂载在具体的目录下,后续对于目录的操作,即为对于U盘的操作
挂载设备:sudo mount -t 设备类型 设备名称 挂载点

卸载设备:sudo umount 挂载点
注意:不能在挂载点卸载设备
补充:支持exFAT文件格式u盘的读写
sudo apt-get install exfat-fuse exfat-utils
7. 进程管理命令
进程:是程序运行一次的过程,动态的
程序:存放在磁盘空间上的可执行文件,是静态
7.1. 静态查看进程的状态:ps
ps -aux 显示当前系统中正在运行的进程
USER(用户) PID(进程id) TTY(终端 ?:不依赖终端) STAT(状态)
PID:是唯一标识进程id号
ps-ef 查看父进程 id (即PPID)
ps-ajx 查看PPID PID PGID(组id) SID(会话id)
manps 查看关于进程状态的信息
进程状态:
D uninterruptible sleep (usually IO) 不可中断睡眠态
R running or runnable (on run queue) 运行态
S interruptible sleep (waiting for an event to complete)可中断睡眠态
T stopped by job control signal 停止态
t stopped by debugger during the tracing 调试器打断
X dead (should never be seen) 死亡态
Z defunct ("zombie") process, terminated but not reaped by its parent 僵尸态
< high-priority (not nice to other users) 高优先级
N low-priority (nice to other users) 低优先级
L has pages locked into memory (for real-time and custom I 锁定到内存中
s is a session leader 会话组组长
l is multi-threaded (using CLONE_THREAD, like NPTL pthread do) 线程
+ is in the foreground process group 前台进程
./a.out& 把a.out在后台运行 R
fg编号 把后台运行的进程拉到前台运行 R+
ctrlz 把前台运行的进程暂停,同时放在后台 T
bg编号 把后台暂停的进程在后台运行起来
jobs 在当前终端查看前后台状态
7.2. 动态显示进程状态:top

在进程管理中,NI通常表示进程的Nice值(Nice Value)。Nice值是用来调整进程优先级的参数,它可以影响进程在系统中的调度顺序
Nice值通常是一个整数,在大多数操作系统中,它的范围通常是-20到+19。较小的Nice值表示进程的优先级较高,而较大的Nice值表示进程的优先级较低
NI:优先级 +19 ~ -20 值越小,优先级越高
PR:20 + NI
在进程管理中,PR通常表示进程的优先级(Priority)。进程优先级是操作系统用来管理和调度进程的一种机制。每个进程都有一个与之相关联的优先级,用于确定进程在系统中的调度顺序。
renice:修改正在运行的进程的优先级
sudo renice -n num PID
num:要修改的nice的值
PID:要修改的进程优先级

![]()
nice定制运行的优先级
sudo nice-n num./可执行文件
num:要修改进程的nice值

![]()
kill发送一个信号
kill-l:查看Linux下的信号
2) SIGINT ctrl+c 结束进程
3) SIGQUIT 程序正常退出
4) SIGILL 结束进程
9) SIGKILL 强制杀死进程 不可忽略信号 无条件终止指定进程
10) SIGUSR1 未定义功能
12) SIGUSR2 未定义功能
13) SIGPIPE 管道破裂信号
14) SIGALRM 时钟信号
15) SIGTERM 结束进程
17) SIGCHLD 子进程状态发生改变会给父进程发送
19) SIGSTOP 停止 不可忽略信号
kill num PID:给指定的进程发送num信号
kill PID:默认发送15
8. 文件系统管理命令
8.1. 文件系统类型
磁盘文件系统:指本地主机中实际可以访问到的文件系统,包括硬盘、CD-ROM、DVD、USB存储器、磁盘阵列等。常见文件系统格式有:Ext2
网络文件系统:是可以远程访问的文件系统,这种文件系统在服务器端仍是本地的磁盘文件系统,客户机通过网络远程访问数据。常见文件系统格式有:NFS(Network File System,网络文件系统)、Samba(SMB/CIFS)
专有/虚拟文件系统:不驻留在磁盘上的文件系统。常见格式有:TMPFS(临时文件系统)
8.2. 常用Linux文件
/bin:存放系统中最常用的可执行文件
/dev:存放所有设备文件,包括硬盘、分区、键盘、鼠标、USB、tty等
/home:用户主目录的默认位置
/mnt:该目录通常用于作为被挂载的文件系统的挂载点
/usr:用于存放与系统用户直接有关的文件和目录,例如应用程序及支持它们的库文件
/usr/lib: 库文件,系统默认搜索的库路径
/usr/include: 头文件,系统默认搜索的头文件路径
8.3. 文件操作相关命令
- file 文件名(查看文件信息)
- rm -f 文件名(强制删除,文件存不存在都会删除/不报错)
rm -rf 文件夹(强制删除文件夹,文件夹存不存在都会删除/不报错)
- cat 文件名 (将文件内容输出到终端)
cat -n 文件名(将文件内容及其行号一并输出到终端)
- find 路径 -name “文件名”:在此路径里查找指定文件
- grep “字符串”文件名:在一个文件中查找该字符串所在位置
grep “字符串”路径 -nR :从这个路径开始往后查找,找到所有用到了这个字符串的文件
- head 文件名:默认输出文件内容前十行
head -num 文件名:自定义输出文件内容前num行
- tail 文件名:默认输出文件内容后十行
tail -num 文件名:自定义输出文件内容后num行
9. 硬链接 和 软连接/符号链接
9.1. 硬链接
理解为文件的副本
ln根据Linux系统给文件inode号进行建立硬链接
命令格式:ln 被链接文件 生成的链接文件
源文件 目标文件
硬链接文件特点:
1.源文件和连接文件拥有相同的inode号
2.硬链接相当于生成了副本,起别名
3.修改其中一个文件的内容,另一个文件会一起更改
4.源文件删除,链接文件仍存在
5.删除源文件后,即便再去创建一个同名文件,和硬链接文件之间不存在链接关系
9.2. 软连接(符号链接)
命令格式:ln -s 被链接的文件 生成的链接文件
(利用文件的路径来建立,最好是从绝对路径开始)
1. 软连接文件属性:l
2. 源文件和链接文件拥有不同的inode号
3. 修改其中一个文件的内容,另一个会一起修改
4. 源文件删除,链接文件会存在
5. 删除源文件后,再去创建一个同名文件,会重新和软连接建立连接
6. 软连接可以链接目录
7. 拷贝目录的软连接可以直接拷贝,如果需要拷贝普通文件的软连接文件,需要加上-d保证参数可以存在链接属性(直接拷贝软连接的话)
10. 解压和压缩(5种)
10.1. gzip 和 gunzip .gz
压缩:gzip 文件名 (默认生成:文件名.gz 压缩文件)
解压:gunzip 压缩完整文件名 (默认解压为:文件名的完整名称 )
10.2. bzip2 和 bunzip2 .bz2
压缩:bzip2 文件名 (默认生成:文件名.bz2 压缩文件)
解压:bunzip2 压缩完整文件名(默认解压为:文件名的完整名称)
10.3. xz 和unxz .xz
压缩:xz 文件名 (默认生成:文件名.xz 压缩文件)
解压:unxz 压缩完整文件名 (默认解压为:文件名的完整名称)
特点:
1. 只能对单个文件进行压缩或解压
2. 不能进行归档,压缩或解压之后源文件不存在
10.4. zip和unzip .zip
压缩:zip 压缩文件名.zip 需要压缩的文件名列表
解压:unzip 压缩文件名.zip
注意:
1. 具有归档功能,并进行压缩
2. 可以压缩文件夹,后缀.zip,压缩文件夹需加-r
3. 压缩或者解压后源文件依然存在
10.5. tar
选项:
-c:创建一个新的归档文件
-v:显示归档和释放的过程信息
-x:释放归档文件
-f:用户指定归档文件的文件名
-t:列出tar归档文件中包含的文件或目录
-j:由tar生成归档,然后由bzip2压缩 .bz2
-z:由tar生成归档,然后由gzip压缩 .gz
-J: 由tar生成归档,然后由xz压缩 .xz
压缩:tar 选项 压缩文件名.tar.压缩格式 要压缩的文件列表
压缩选项组合:
tar -cvzf file.tar.gz *
tar -cvjf file.tar.bz2*
ta -cvJf file.tar.xz *
解压:tar -xvf 压缩包名.tar.压缩格式
查看压缩包中存在的文件:tar -tf xxx.tar.压缩格式
归档文件列表:tar -cvf xxx.tar (只归档不压缩)
11. 分文件编程
一个工程分为:main.c XXX.c XXX.h 等多个文件
.h头文件包含:
1. 其他的头文件 2. 函数声明 3. 构造数据类型 4. 宏定义 5. 重定义的名字 6. 全局变量
include引用时" " 和 < >的区别
#include<stdio.h>:系统定义的头文件,去系统目录里查找头文件
#include"add.h":自定义头文件,先从当前目录下查找,如果当前目录下没有,再去系统目录下查找
12. gdb调试
作用:用于调试代码中的逻辑错误,而非语法错误
12.1. gdb调试流程
1. 生成可以使用gdb调试的可执行文件
gcc -g xxx.c (生成的文件可以使用gdb调试)
2. 进入gdb调试工具
gdb 可执行文件名 (使用gdb工具开始调试可执行文件)
gdb调试命令---直接输入
r:运行代码
l:显示当前行下面的10行代码
b 函数名或者行数:添加断点
info b:查看断点信息
d num:删除断点
n:单步调试程序,如果是函数整体执行,不会进入函数内部 //往下走一步吗,不进入函数
s:单步调试程序,如果是函数会进入 //往下走一步,但会进入函数
p:查看变量的值
12.2. 补充*
调试core文件
core何时生成:当程序出现重大错误时,会生成一个临时的镜像文件,保存程序状态(段错误)
由于系统的权限问题,不是每一次段错误都会生成core文件
需要 ulimit -a 查看文件权限
core file size 如果为0该文件不会生成
ulimit -c unlimited :使用命令取消限制
如果使用ulimit -c unlimited后,还不能在当前目录生成core文件
在终端执行以下命令
sudo bash -c "echo core > /proc/sys/kernel/core_pattern"
需要同时gdb 可执行文件和core文件
gdb a.out core
13. valgrind工具
valgrind可以说是嵌入式开发调试的一款神器,不管是在虚拟机里开发还是在设备上开发,都可以使用,用于内存调试、内存泄漏检测以及性能分析的软件开发工具。
13.1. 安装
解压
![]()
进入解压目录,执行配置文件
cd varlgrind-3.13.0
./configure
配置成功后,执行make编译
make
安装
sudo make install
13.2. 应用
13.2.1. 内存泄漏检测

这是一段申请内存但是没有释放的程序,首先编译一下
gcc xxx.c -g -o xxx
使用valgrind工具检测
valgrind --tool=memcheck --leak-check=full ./xxx
从HEAP SUMMARY下面可以清楚看到提示在mall.c文件的第5行,main函数中有100个字节的空间申请但是未释放。

13.2.2. 使用未初始化变量检测

编译:
gcc xxx.c -g -o xxx
检测:
valgrind ./xxx

13.2.3. 内存访问越界检测

程序中分别存在栈越界和堆越界,很遗憾的是我们运行程序一切正常,只有极少数情况下是直接运行出内存错误的,这非常危险,但是有概率性
可以看到检测到了10-11行的堆越界访问问题, 但是遗憾的是并未检测到6-7行的栈越界问题,所以valgrind是不能检测到静态内存问题的

openvela 操作系统专为 AIoT 领域量身定制,以轻量化、标准兼容、安全性和高度可扩展性为核心特点。openvela 以其卓越的技术优势,已成为众多物联网设备和 AI 硬件的技术首选,涵盖了智能手表、运动手环、智能音箱、耳机、智能家居设备以及机器人等多个领域。
更多推荐




所有评论(0)