1.模拟信号的数字化方法PCM

1.1 PCM的定义

最基本的概念:模拟信号是指随时间连续变化的物理量,将声音在磁带上记录成磁场强度的变化或在黑胶唱片上记录成沟槽大小的变化就是以模拟方式进行存储。数字信号则是离散的,计算机中的数据都是以数字方式存储的。模拟信号和数字信号可以相互转换,这里我们讨论的就是把模拟信号转换成数字信号。

脉冲编码调制(Pulse Code Modulation, PCM)是一种模拟信号的数字化方法。它是最常用、最简单的波形编码方式,但是也存在其它方法,比如脉冲密度调制(Pulse Density Modulation, PDM)。

阅读全文 »

readelf、nm 和 objdump 的作用与区别

1. readelf
  • 作用
    用于解析和显示 ELF 格式文件(如可执行文件、动态库、core dump)的详细结构信息,包括:
    • ELF Header(文件类型、入口地址、节头表偏移等)。
    • Program Headers(内存段类型、权限、文件偏移等)。
    • Section Headers(节名称、类型、大小等)。
    • 符号表(.symtab)、重定位表(.rel.*)等调试信息。
  • 示例命令
    1
    2
    3
    readelf -a a.out          # 显示所有信息
    readelf -S a.out # 仅显示节头表
    readelf -l a.out # 仅显示程序头表
  • 优点
    • 输出信息全面,适合分析 ELF 文件的底层结构。
    • 支持直接解析二进制文件,无需依赖其他工具。
  • 缺点
    • 输出内容较为原始,需手动筛选关键信息。
    • 不支持反汇编代码段内容。
      2. nm
  • 作用
    显示 ELF 文件中的符号表信息,包括:
    • 符号名称、地址、类型(如函数、全局变量、未初始化变量等)。
    • 符号的可见性(如全局符号 T、本地符号 t)。
  • 示例命令
    1
    2
    nm a.out                  # 显示所有符号
    nm -D /lib64/ld-linux-x86-64.so.2 # 显示动态库符号
  • 优点
    • 快速定位符号地址和类型,适合调试符号冲突或未定义引用问题。
    • 输出简洁,适合脚本化处理。
  • 缺点
    • 仅显示符号表,无法查看内存布局或节信息。
    • 不支持反汇编或动态链接信息分析。
      3. objdump
  • 作用
    提供更全面的 ELF 文件分析功能,包括:
    • 反汇编代码段(.text 节)。
    • 显示节头表、程序头表、动态段(.dynamic)等。
    • 解析重定位信息(.rel.* 节)。
  • 示例命令
    1
    2
    3
    objdump -d a.out          # 反汇编代码段
    objdump -x a.out # 显示所有头信息和节内容
    objdump -R a.out # 显示动态重定位信息
  • 优点
    • 支持反汇编,适合分析代码逻辑或机器指令。
    • 输出格式灵活,可结合 -S 选项混合显示汇编和源码(需调试信息)。
  • 缺点
    • 反汇编可能因优化选项(如 -O2)导致代码难以阅读。
    • 输出信息量大,需结合过滤条件(如 -j .text)缩小范围。

      三者对比总结

      工具 核心功能 适用场景 优势 局限性
      readelf 解析 ELF 结构信息 分析文件头、节头、程序头 信息全面,直接解析二进制 输出原始,需手动筛选
      nm 显示符号表 调试符号冲突、未定义引用 快速定位符号地址和类型 仅限符号表,无代码分析能力
      objdump 反汇编、节内容解析 代码逻辑分析、动态链接调试 支持反汇编和混合源码显示 输出信息量大,需过滤条件

      选择建议

  • 分析 ELF 文件结构 → 使用 readelf
  • 调试符号问题 → 使用 nm
  • 反汇编或动态链接分析 → 使用 objdump
  • 综合调试 → 结合三者(如 readelf 查看结构,nm 定位符号,objdump 反汇编)。

菜鸟教程 https://www.runoob.com/w3cnote/linux-shell-brackets-features.html

$()和 ``

1
2
3
4
5
6
7
8
9
在 bash shell 中,$( ) 与` ` (反引号) 都是用来做命令替换用(commandsubstitution)的。

例如 version=$(uname -r)和version=`uname -r`都可以是version得到内核的版本号

各自的优缺点:

1. ` ` 基本上可用在全部的 unix shell 中使用,若写成 shell script ,其移植性比较高。但反单引号容易打错或看错。

2. $()并不是所有shell都支持。

${ }

1
2
3
4
5
6
7
8
9
10
11
${ }用于变量替换。一般情况下,$var 与${var} 并没有啥不一样。但是用 ${ } 会比较精确的界定变量名称的范围。比如

$ A=B
$ echo $AB
原本是打算先将 $A 的结果替换出来,然后再补一个 B 字母于其后,
但在命令行上,真正的结果却是只会提换变量名称为 AB 的值出来…
若使用 ${ } 就没问题了:
$ echo ${A}B
BB

${ }的功能远不止于此.
阅读全文 »

牛客网练习

查看可用的shell

1
cat /etc/shells

shebang

1
#!/bin/sh

字符串

1
2
3
4
5
str="hello world!"

echo "定义字符串 ${str}"
echo "字符串的长度为 ${#str}"
echo "截取索引从1开始,长度为4的子串 ${str:1:4}"

数组

1
2
3
4
5
a=(234 2 3 4 5 6)

echo "定义数组 a=(${a[*]})"
echo "数组的长度为 ${#a[*]}"
echo "数组第一个元素的长度${#a[0]}"
阅读全文 »

基础语法

语法
变量
参数传递
数组使用
运算符
echo命令
流程控制
函数
输入输出重定向
文件包含

语法练习

牛客网

查看可用的shell

1
cat /etc/shells

查看当前正在使用的shell

1
2
#注意SHELL一定要是大写。可以看到,我目前使用的shell是/bin/bash
echo $SHELL

修改我的 shell 为zsh

1
chsh -s /bin/zsh

shebang

1
#!/bin/sh

字符串处理

1
2
3
4
5
6
7
8
9
str="hello world!"

echo "定义字符串 ${str}"
#计算字符串长度
echo "字符串的长度为 ${#str}"
#截取字符串
echo "截取索引从1开始,长度为4的子串 ${str:start:length}"
#字符串替换
echo "把老的字符串替换为新的字符串 ${str//${oldstr}/${newstr}}"
阅读全文 »

作用

  • source命令也称为点命令,也就是一个点符号.bash的内部命令。 功能:使 shell 读入指定的shell程序文件并依次执行文件中的所有语句。 使用范例:source $filename
  • 为什么在修改了环境变量后执行source命令? 例如当我修改了/etc/profile文件,我想让它立刻生效,而不用重新登录;这时就想到用 source 命令,如 source /etc/profile。这样就重新执行刚修改的初始化文件,使之立即生效。
阅读全文 »
0%