处理器,操作系统,编译器,调试器,语言和工具,网络


8848
8848 2022-09-29 09:56:56 64430
分类专栏: 资讯

目录

处理器

常用处理器架构、指令集

国产处理器

字长和处理器类型的关系

不同处理器的大小端

查看处理器类型

核与线程之间的关系

如何绑定处理器

基本的汇编原子操作

加减

比较后交换

交换

操作系统

操作系统接口标准,名称,厂商

有哪些国产操作系统

哪些是实时、哪些是非实时操作系统

设置时间、时区

设置用户、密码和文件读、写、运行权限

查找文件、字符串及管道操作

远程连接

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

基本的汇编原子操作

加减

  1. mov     ecx, Addend;
  2. mov     eax, 0FFFFFFFFh;//-1 (mov      eax, 1;)//+1
  3. lock xadd [ecx], eax; //加-1
  4. dec     eax;


比较后交换

  1. mov     ecx, Destination;
  2. mov     edx, Exchange;
  3. mov     eax, Comperand;
  4. lock cmpxchg [ecx], edx;

交换

  1.       -selector-tag">mov      -selector-tag">ecx, -selector-tag">Target;
  2.       -selector-tag">mov      -selector-tag">edx, -selector-tag">Value;
  3. -selector-tag">label:
  4.       -selector-tag">lock -selector-tag">cmpxchg [ecx], -selector-tag">edx;//加
  5.       -selector-tag">jnz      -selector-tag">short -selector-tag">label;

操作系统

操作系统接口标准,名称,厂商

操作系统 提供了3类型的接口供用户使用:

  1. 命令接口. 提供一组命令供用户直接或间接操作。. 根据作业的方式不同,命令接口又分为联机命令接口和脱机命令接口。
  2. 程序接口. 程序接口 由一组系统调用命令组成,提供一组系统调用命令供 用户程序 使用。
  3. 图形界面接口.
名称厂商
posixIEEE

有哪些国产操作系统

国产操作系统
中标麒麟(NeoKylin)银河麒麟操作系统inux(Deepin)普华操作系统中科方德操作系统
中兴新支点操作系统一铭操作系统优麒麟(UbuntuKylin)湖南麒麟 KylinsecstartOS(起点操作系统)
共创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'

设置用户、密码和文件读、写、运行权限

  1. useradd 用户名称 // 添加用户
  2. passwd 用户名称 // 修改用户密码
  3. chmod [who] [+ | - | =] [mode] 文件名

查找文件、字符串及管道操作

将当前目录及其子目录下所有文件后缀为 .c 的文件列出来:

find . -name "*.c"

将当前目录及其子目录中的所有文件列出:

find . -type f

将当前目录及其子目录下所有最近 20 天内更新过的文件列出:

find . -ctime  20

远程连接

ssh

ssh user@remote -p port 

// 保证对端机器打开sshd服务,使用 systemctl status sshd.service 查看

vnc,winscp

桌面工具,粘贴两个链接

VNC的安装与使用(Windows环境下使用VNC进行远程桌面控制) - 简书

WinSCP安装教程 - 简书

不过使用vnc client要注意,一定不能让目标主机磁盘占用过大,不然会导致 vnc server服务无法启动从而连接失败

命令行,查看内存、磁盘、进程、线程资源使用情况

磁盘:df -h
内存:sar -r
进程:ps -elf
线程:ps -T -p 20756、top -H -p 20756

或者 top 一键搞定

查看操作系统、Glibc、GCC版本

  1. uname -r // 操作系统
  2. ldd --version // glibc
  3. gcc --version // gcc
  4. // 跨平台交叉编译时需要

如何杀死进程

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 该日志文件永久记录每个用户登录、注销及系统的启动、停机的事件

编写批处理和Shell脚本

程序必须以下面的行开始(必须方在文件的第一行): 

  !/bin/sh 

符号!用来告诉系统它后面的参数是用来执行该文件的程序。在这个例子中我们使用/bin/sh来执行程序。 (能写一些shell普通命令,命令用分号隔开)

  1. !bin/sh
  2. echo "==============================================="
  3. echo "================启动 ***==================="
  4. echo "==============================================="
  5. start-all.sh;

Tty切换

chvt N

输出stdout\stderror的意义,会重定向

        cout的输出可以重定向到一个文件中,而cerr必须输出在显示器上。cerr不经过缓冲区,直接向显示器输出信息,而clog中的信息存放在缓冲区,缓冲区满或者遇到endl 时才输出。缓冲区的的,就是减少访问文件的次数。


编译器

编译器选项,头文件包含方式、库连接方式、优化选项

常用编译选项

  • -E 预处理,生成.i的文件[预处理器cpp]
  • -S 将预处理后的文件不转换成汇编语言,生成文件.s[编译器egcs]
  • -s 有汇编变为目标代码(机器代码)生成.o的文件[汇编器as]
  • -l 连接目标代码,生成可执行程序[链接器ld]

头文件包含和库链接

-nostdinc 使编译器不再系统默认的头文件目录里面找头文件, 一般和 -I 联合使用,明确限定头文件的位置。

-llibrary   制定编译的时候使用的库

优化选项

-O0 、-O1 、-O2 、-O3

编译器的优化选项的 4 个级别,-O0 表示没有优化, -O1 为默认值,-O3 优化级别最高。

类型未定义、缺少引用解决办法

  • 检查头文件包含
  • 库文件符号表
  • 头文件包含覆盖

优化级别设置

gcc中指定优化级别的参数有:-O0、-O1、-O2、-O3、-Og、-Os、-Ofast。

  1. 在编译时,如果没有指定上面的任何优化参数,则默认为 -O0,即没有优化。
  2. 参数 -O1、-O2、-O3 中,随着数字变大,代码的优化程度也越高,不过这在某种意义上来说,也是以牺牲程序的可调试性为代价的。
  3. 参数 -Og 是在 -O1 的基础上,去掉了那些影响调试的优化,所以如果最终是为了调试程序,可以使用这个参数。不过光有这个参数也是不行的,这个参数只是告诉编译器,编译后的代码不要影响调试,但调试信息的生成还是靠 -g 参数的。
  4. 参数 -Os 是在 -O2 的基础上,去掉了那些会导致最终可执行程序增大的优化,如果想要更小的可执行程序,可选择这个参数。
  5.  参数 -Ofast 是在 -O3 的基础上,添加了一些非常规优化,这些优化是通过打破一些国际标准(比如一些数学函数的实现标准)来实现的,所以一般不推荐使用该参数。

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,不会发生转换。内存中的字符串常量的编码直接取决于源码的编码。

并行编译选项

VS

  1. 选取某项目的“Properties(属性)
  2. 在打开的对话框中,左侧选择 “C/C++”->“General(常规)”中将“ Multi-processor Compilation(多处理器编译)”打开
  3. “C/C++”->“Code Generation(代码生成)”中将“Enable Minimal Rebuild(启用最小重新生成)”关闭
  4. 在“Debug(调试)”中选取项目的“Options and Settings (选项和设置)”->“Projects and Solutions (项目和解决方案)”->“ Build and Run (编译与运行)”中设置“ maximum number of parallel project builds(最大并发C++编译数)”(即开发项目机器本身的CPU所包含的核数)

Windows 、Linux、下查看符号表,dumpbin、readelf、objdump用法

dumpbin

dumpbin.exe /SYMBOLS <file(.lib)>

readelf

readelf -s <file>

objdump

objdmp -t <file(.so)>

nm

nm -D <file>    // 查村符号并支持反译为函数名

用denpends和ldd查看依赖关系

  1. ldd <filename> // linux
  2. denpends 软件打开可执行文件或者动态库查看依赖 // windows

如何设置导出调试信息

  1. -meta"> gdb <file> // 进入到gdb命令行中
  2. -meta"> set logging file <filename> // 设置输出文件
  3. -meta"> set logging on // 开始拷贝
  4. -meta"> thread apply all bt // 查看所有线程堆栈并输出到文件中
  5. -meta"> set logging off // 停止拷贝

调试器

设置调试断点

GDB

  1. break | b | 添加断点
  2. tbreak | tb | 添加临时断点
  3. delete | d | 删除断点
  4. enable | enable | 启用某个断点
  5. disable | disable | 禁用某个断点

使用快捷键操作

GDB

  1. run | r | 运行一个待调试的程序
  2. continue | c | 让暂停的程序继续运行
  3. next | n | 运行到下一行
  4. step | s | 单步执行,遇到函数会进入
  5. until | u | 运行到指定行停下来
  6. finish | fi | 结束当前调用函数,回到上一层调用函数处
  7. return | return | 结束当前调用函数并返回指定值,到上一层函数调用处
  8. jump | j | 将当前程序执行流跳转到指定行或地址
  9. print | p | 打印变量或寄存器值
  10. backtrace | bt | 查看当前线程的调用堆栈
  11. frame | f | 切换到当前调用线程的指定堆栈
  12. thread | thread | 切换到指定线程
  13. break | b | 添加断点
  14. tbreak | tb | 添加临时断点
  15. delete | d | 删除断点
  16. enable | enable | 启用某个断点
  17. disable | disable | 禁用某个断点
  18. watch | watch | 监视某一个变量或内存地址的值是否发生变化
  19. list | l | 显示源码
  20. info | i | 查看断点 / 线程等信息
  21. ptype | ptype | 查看变量类型
  22. disassemble | dis | 查看汇编代码
  23. set args | set args | 设置程序启动命令行参数
  24. show args | show args | 查看设置的命令行参数

查看内存信息

GDB

  1. print | p | 打印变量或寄存器值
  2. backtrace | bt | 查看当前线程的调用堆栈
  3. watch | watch | 监视某一个变量或内存地址的值是否发生变化

远程调试

gdbserver、VsCode、qtcreator、VS2010、VisualGDB

附加部分代码调试

qtcreator
直接将想要调试的文件拖进qt中,但必须保证代码版本一致(带界面)

调试时更改内存值

GDB

  1. (gdb) whatis tmp
  2. -variable">type -operator">= double
  3. (gdb) p tmp
  4. -variable">$4 -operator">= 13
  5. (gdb) set var tmp=47

不能直接使用set tmp=47,因为set的子命令可能跟变量名冲突导致运行错误

set {-bu

网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。

本文链接:https://www.xckfsq.com/news/show.html?id=10957
赞同 0
评论 0 条
8848L0
粉丝 0 发表 10 + 关注 私信
上周热门
Kingbase用户权限管理  1999
信刻全自动光盘摆渡系统  1728
信刻国产化智能光盘柜管理系统  1400
银河麒麟添加网络打印机时,出现“client-error-not-possible”错误提示  987
银河麒麟打印带有图像的文档时出错  888
银河麒麟添加打印机时,出现“server-error-internal-error”  682
麒麟系统也能完整体验微信啦!  637
统信桌面专业版【如何查询系统安装时间】  600
统信操作系统各版本介绍  598
统信桌面专业版【全盘安装UOS系统】介绍  570
本周热议
我的信创开放社区兼职赚钱历程 40
今天你签到了吗? 27
信创开放社区邀请他人注册的具体步骤如下 15
如何玩转信创开放社区—从小白进阶到专家 15
方德桌面操作系统 14
我有15积分有什么用? 13
用抖音玩法闯信创开放社区——用平台宣传企业产品服务 13
如何让你先人一步获得悬赏问题信息?(创作者必看) 12
2024中国信创产业发展大会暨中国信息科技创新与应用博览会 9
中央国家机关政府采购中心:应当将CPU、操作系统符合安全可靠测评要求纳入采购需求 8

添加我为好友,拉您入交流群!

请使用微信扫一扫!