目录
处理器
常用处理器架构、指令集
国产处理器
字长和处理器类型的关系
不同处理器的大小端
查看处理器类型
核与线程之间的关系
如何绑定处理器
基本的汇编原子操作
加减
比较后交换
交换
操作系统
操作系统接口标准,名称,厂商
有哪些国产操作系统
哪些是实时、哪些是非实时操作系统
设置时间、时区
设置用户、密码和文件读、写、运行权限
查找文件、字符串及管道操作
远程连接
ssh
vnc,winscp
命令行,查看内存、磁盘、进程、线程资源使用情况
查看操作系统、Glibc、GCC版本
如何杀死进程
如何查看系统日志
编写批处理和Shell脚本
Tty切换
输出stdout\stderror的意义,会重定向
编译器
编译器选项,头文件包含方式、库连接方式、优化选项
常用编译选项
头文件包含和库链接
优化选项
类型未定义、缺少引用解决办法
优化级别设置
编码方式配置
并行编译选项
VS
Windows 、Linux、下查看符号表,dumpbin、readelf、objdump用法
用denpends和ldd查看依赖关系
如何设置导出调试信息
调试器
设置调试断点
使用快捷键操作
查看内存信息
远程调试
附加部分代码调试
调试时更改内存值
设置调试断点条件
使用GDB调试基本程序
查看和调试软件锁死原因
语言和工具
SVN基本操作,checkin \check out\ update\add
与SVN特定版本比较,revert到某一个版本
内存对齐
不同语言的接口实现
C++插入C代码
不同语言版本的主要差异
C++11 && C++98
c98 && c99
网络
网络地址、MAC地址查看、配置
Route路由查看
TCP基本原理
TCP头
三次握手
四次挥手
UDP基本原理
UDP头
设置不同防火墙
常用软件默认端口
Wireshark查看过滤网络包
netstat查看应用绑定的端口
iperf3测试不同协议下的网络可用带宽
调整操作系统和网卡的工作模式、缓冲区大小
不同协议包头大小
后续补充
CISC:x86、x86_64-litte
RISC:Arm、MIPS(龙芯)、PowerPC-big
mips阵营:龙芯
arm阵营: 飞腾,海思麒麟
IBM powerpc阵营:
宏芯x86:兆芯,申威
计算机字长(机器字长)取决于数据总线的宽度,通常就是CPU一次能处理的数据的位数(CPU位数)。
Big Endian:低字节存储在高地址
eg:PowerPC、IBM、Sun
Little Endian:低字节存放在低地址
eg:x86、DEC.
uname -m
总的逻辑 cpu 数 = 物理 cpu 数 * 每颗物理 cpu 的核心数 * 每个核心的超线程数
cat /proc/cpuinfo|grep "physical id"|sort -u|wc -l
查看物理CPU个数
cat /proc/cpuinfo|grep "cpu cores"|uniq
查看每个物理CPU中core的个数(即核数)
cat /proc/cpuinfo|grep "processor"|wc -l
查看逻辑CPU的个数
cat /proc/cpuinfo|grep "name"|cut -f2 -d:|uniq
查看CPU的名称型号
ps -eo pid,args,psr
查看进程运行的逻辑CPU
taskset -c [CPU NUMBER] -p PID
指定cpu
mov ecx, Addend;
mov eax, 0FFFFFFFFh;//-1 (mov eax, 1;)//+1
lock xadd [ecx], eax; //加-1
dec eax;
mov ecx, Destination;
mov edx, Exchange;
mov eax, Comperand;
lock cmpxchg [ecx], edx;
mov ecx, Target;
mov edx, Value;
label:
lock cmpxchg [ecx], edx;//加
jnz short label;
操作系统 提供了3类型的接口供用户使用:
名称 | 厂商 |
posix | IEEE |
中标麒麟(NeoKylin) | 银河麒麟操作系统 | inux(Deepin) | 普华操作系统 | 中科方德操作系统 |
中兴新支点操作系统 | 一铭操作系统 | 优麒麟(UbuntuKylin) | 湖南麒麟 Kylinsec | startOS(起点操作系统) |
共创Linux桌面操作系统 | 威科乐恩Linux(WIOS) | 恩普操作系统 | UOS 统一操作系统 | 红旗Linux |
实时操作系统的实时性是第一要求,需要调度一切可利用的资源完成实时任务。根据响应时间在微秒、毫秒和秒级的不同,可分为强实时、准实时和弱实时三种。强实时系统必须是对即时的事件作出反应,绝对不能错过事件处理时限。
实时操作系统:VxWorks、mC/OS-II、RT-Linux、QNX
非实时操作系统:Linux/Windows
查看时间:date
设置时间(年月日):date -s 3/29/2021 (其中-s 指的是set)
设置时间(时分秒):date -s 15:52:36
设置时间(年月日时分秒) :date -s "2022-3-29 18:44:02"
查看时区: date -R
关闭网络时间协议同步时间:sudo timedatectl set-ntp false
修改时区:timedatectl set-timezone “Asia/Shanghai”
修改时区:timedatectl set-time '16:10:40 2015-11-20'
# useradd 用户名称 // 添加用户
# passwd 用户名称 // 修改用户密码
# chmod [who] [+ | - | =] [mode] 文件名
将当前目录及其子目录下所有文件后缀为 .c 的文件列出来:
find . -name "*.c"
将当前目录及其子目录中的所有文件列出:
find . -type f
将当前目录及其子目录下所有最近 20 天内更新过的文件列出:
find . -ctime 20
ssh user@remote -p port
// 保证对端机器打开sshd服务,使用 systemctl status sshd.service 查看
桌面工具,粘贴两个链接
VNC的安装与使用(Windows环境下使用VNC进行远程桌面控制) - 简书
WinSCP安装教程 - 简书
不过使用vnc client要注意,一定不能让目标主机磁盘占用过大,不然会导致 vnc server服务无法启动从而连接失败
磁盘:df -h
内存:sar -r
进程:ps -elf
线程:ps -T -p 20756、top -H -p 20756或者 top 一键搞定
uname -r // 操作系统
ldd --version // glibc
gcc --version // gcc
// 跨平台交叉编译时需要
kill -9 PID
Windows:
程序-查看事件日志
Linux:
/var/log/message 系统启动后的信息和错误日志,是Red Hat Linux中最常用的日志之一
/var/log/secure 与安全相关的日志信息
/var/log/cron 与定时任务相关的日志信息
/var/log/spooler 与UUCP和news设备相关的日志信息
/var/log/boot.log 守护进程启动和停止相关的日志消息
/var/log/wtmp 该日志文件永久记录每个用户登录、注销及系统的启动、停机的事件
程序必须以下面的行开始(必须方在文件的第一行):
#!/bin/sh
符号#!用来告诉系统它后面的参数是用来执行该文件的程序。在这个例子中我们使用/bin/sh来执行程序。 (能写一些shell普通命令,命令用分号隔开)
#!bin/sh
echo "==============================================="
echo "================启动 ***==================="
echo "==============================================="
start-all.sh;
chvt N
cout的输出可以重定向到一个文件中,而cerr必须输出在显示器上。cerr不经过缓冲区,直接向显示器输出信息,而clog中的信息存放在缓冲区,缓冲区满或者遇到endl 时才输出。缓冲区的的,就是减少访问文件的次数。
-nostdinc 使编译器不再系统默认的头文件目录里面找头文件, 一般和 -I 联合使用,明确限定头文件的位置。
-llibrary 制定编译的时候使用的库
-O0 、-O1 、-O2 、-O3
编译器的优化选项的 4 个级别,-O0 表示没有优化, -O1 为默认值,-O3 优化级别最高。
gcc中指定优化级别的参数有:-O0、-O1、-O2、-O3、-Og、-Os、-Ofast。
gcc -Q --help=optimizers -O3
查寻O3参数具体做了哪些优化
以gcc为例:
-finput-charset 设置输入字符集,用于从输入的字符集转换,默认为utf8。
-fexec-charset=charset 设置执行字符集。决定了字符串常量在内存中的编码。默认为utf8。
输入字符集决定了源码到内部字符集的转换方式。源码存储方式如果为gbk,且编译器指定的输入字符集为gbk。在将c语言编译为汇编时,会将源码字符集转换为内部utf-8。
执行字符集决定了由内部字符集到执行字符集的转换方式。如果设置为gbk,在将汇编语言翻译成机器语言时,会将字符串常量从内部字符集utf-8向gbk转换。
如果二者都为utf-8,由于gcc内部字符集也为utf-8,不会发生转换。内存中的字符串常量的编码直接取决于源码的编码。
dumpbin
dumpbin.exe /SYMBOLS
readelf
readelf -s
objdump
objdmp -t
nm
nm -D // 查村符号并支持反译为函数名
ldd // linux
denpends 软件打开可执行文件或者动态库查看依赖 // windows
# gdb // 进入到gdb命令行中
# set logging file // 设置输出文件
# set logging on // 开始拷贝
# thread apply all bt // 查看所有线程堆栈并输出到文件中
# set logging off // 停止拷贝
GDB
break | b | 添加断点
tbreak | tb | 添加临时断点
delete | d | 删除断点
enable | enable | 启用某个断点
disable | disable | 禁用某个断点
GDB
run | r | 运行一个待调试的程序
continue | c | 让暂停的程序继续运行
next | n | 运行到下一行
step | s | 单步执行,遇到函数会进入
until | u | 运行到指定行停下来
finish | fi | 结束当前调用函数,回到上一层调用函数处
return | return | 结束当前调用函数并返回指定值,到上一层函数调用处
jump | j | 将当前程序执行流跳转到指定行或地址
print | p | 打印变量或寄存器值
backtrace | bt | 查看当前线程的调用堆栈
frame | f | 切换到当前调用线程的指定堆栈
thread | thread | 切换到指定线程
break | b | 添加断点
tbreak | tb | 添加临时断点
delete | d | 删除断点
enable | enable | 启用某个断点
disable | disable | 禁用某个断点
watch | watch | 监视某一个变量或内存地址的值是否发生变化
list | l | 显示源码
info | i | 查看断点 / 线程等信息
ptype | ptype | 查看变量类型
disassemble | dis | 查看汇编代码
set args | set args | 设置程序启动命令行参数
show args | show args | 查看设置的命令行参数
GDB
print | p | 打印变量或寄存器值
backtrace | bt | 查看当前线程的调用堆栈
watch | watch | 监视某一个变量或内存地址的值是否发生变化
gdbserver、VsCode、qtcreator、VS2010、VisualGDB
qtcreator
直接将想要调试的文件拖进qt中,但必须保证代码版本一致(带界面)
GDB
(gdb) whatis tmp
type = double
(gdb) p tmp
$4 = 13
(gdb) set var tmp=47
不能直接使用set tmp=47,因为set的子命令可能跟变量名冲突导致运行错误
set {int}0x83040 = 4
GDB
(gdb) b N if i == 8
GDB调试主要有三种方式
方法1:
方法2:
方法3:
拉取代码:
svn checkout svn://192.168.0.1/runoob01 --username=user01
提交代码:cat readme // 在库本版中需要增加一个readme的说明文件。
svn status // 查看工作副本中的状态,此时 readme的状态为?,说明它还未加到版本
控制中。
svn add readme // 将文件readme加到版本控制,等待提交到版本库。
svn status // 查看工作副本中的状态,此时 readme的状态为A,它意味着这个文件已经被成功地添加到了版本控制中。
svn commit -m "SVN readme" // 为了把 readme 存储到版本库中,使用 commit -m加上注释信息来提交。
如果你忽略了 -m 选项, SVN会打开一个可以输入
多行的文本编辑器来让你输入提交信息。
更新代码:
svn update
# svn revert readme // 文件 readme 回归到未修改状态
# svn revert -R trunk // 目录 trunk 回归到未修改状态
# svn merge -r 22:21 readme // 恢复一个已经提交的版本:现版本22,旧版本21。
默认对齐数可以通过预编译命令#pragma pack(n),n = 1,2,4,8,16来改变。
详聊内存对齐(Memory alignment)-技术圈
#pragma pack(4)
#pragma pack(1)
#pragma pack(2)
需要特别注意的有几点
- 对齐数时变化的
- 不同的处理器默认对齐数不同,跨平台通信要特别注意
- 对其原则是在当前对齐数倍数的空间内是否能放下我下一个类型,可以直接放,不可以进行填充对齐
- 结构体中有其他结构体,各自计算然后相加
extern "C" {
void funcA(int x);
}
查看IP/MAC
$ ifconfig
设置IP和掩码
# ifconfig eth0 192.168.5.40 netmask 255.255.255.0
设置网关
# route add default gw 192.168.5.1
centos7
$ route / $netstat -rn
Ubuntu20.04
$ route / $netstat -rn
Destination | 目标网络/主机 |
Gateway | 网关地址,*表示目标和本机在同一网络,不需要路由 |
Genmask | 网络掩码 |
Flags | 路由项标志,常见标志有如下 U 该路由项是活动的 |
Metric | 路由距离,即到达指定网络所需的中转数 Ref 路由项被引用的次数(Linux未使用) |
Use | 该路由项被使用的次数 |
Iface | 该路由项对应的输出网卡接口 |
centos7
启动防火墙:# systemctl start firewalld
查看防火墙状态:# systemctl status firewalld
停止防火墙:# systemctl disable firewalld
禁用防火墙:# systemctl stop firewalld
Ubuntu20.04
开启/关闭防火墙:$ sudo ufw enable|disable
允许 53 端口
$ sudo ufw allow 53
禁用 53 端口
$ sudo ufw delete allow 53
允许 80 端口
$ sudo ufw allow 80/tcp
禁用 80 端口
$ sudo ufw delete allow 80/tcp
允许 smtp 端口
$ sudo ufw allow smtp
删除 smtp 端口的许可
$ sudo ufw delete allow smtp
允许某特定 IP
$ sudo ufw allow from 192.168.254.254
删除上面的规则
$ sudo ufw delete allow from 192.168.254.254
HTTP:80/8080/3128/8081/9080
HTTP:443
FTP(文件传输):21
Telnet(远程登录):23
ssh(VNC 安全登录):22
DNS:53
过滤源ip、目的ip:
端口过滤:
协议过滤:
http模式过滤:
连接符and
windows
netstat -ano
Linux
TCP:netstat -ntlp
UDP:netstat -nulp
服务端
iperf3 -s -i 1 -p 5201
客户端
TCP
iperf3 -c 192.168.1.120 -i 1 -t 60 -p 5201
UDP
iperf3 -u -c 192.168.1.120 -b 1000m -t 60 -p 5201
工作模式
查看:mii-tool -v ens33
调整:mii-tool -F 10baseT-HD ens33
恢复自适应:mii-tool -r ens33
// HD:半双工 FD:全双工
缓冲区大小
查看:ethtool -g ens33
调整:ethtool -G ens33 rx 4096 tx 4096
以太头 14 尾 4
IP头 20
TCP头 20
UDP头 8
这篇文章呢主要是搜索和整理,欢迎大家留言补充和纠正。后面关于网络和 rtps 我会单独开一两篇去详讲我碰到的一些问题和查看处理办法。共勉。