Linux的基本知识(1)

1、各寄存器的简介

AX:累加器
BX:基址寄存器(存放存储器地址)
CX:计数器
DX:数据寄存器(存放数据)
SI:源变址寄存器(常保存存储单元地址)
DI:目的变址寄存器(常保存存储单元地址)
BP:基址指针寄存器(Base Pointer),表示堆栈区域中的基地址
SP:堆栈指针寄存器(Stack Pointer),指示堆栈区域的栈顶地址
IP:指令指针寄存器(Instruction Pointer),指示要执行指令所在存储单元的地址。IP寄存器是一个专用寄存器。
EAX:累加器,它是很多加法乘法指令的缺省寄存器。
EBX:基址寄存器,在内存寻址时存放基地址。
ECX:计数器,是重复(REP)前缀指令和LOOP指令的内定计数器。
EDX:数据寄存器,用来放整数除法产生的余数。
ESI/EDI:源/目标索引寄存器,因为在很多字符串操作指令中, DS:ESI指向源串,而ES:EDI指向目标串.
EBP:基址指针,被用作高级语言函数调用的”框架指针”(frame pointer).
ESP:堆栈指针,被形象地称为栈顶指针,堆栈的顶部是地址小的区域,压入堆栈的数据越多,ESP也就越来越小。在32位平台上,ESP每次减少4字节。
EIP:寄存器存放下一个CPU指令存放的内存地址,当CPU执行完当前的指令后,从EIP寄存器中读取下一条指令的内存地址,然后继续执行。
EAX、ECX、EDX、EBX:是AX、BX、CX、DX的延伸,各32位。
ESI、EDI、ESP、EBP、EIP:是SI、DI、SP、BP、IP的延伸,各32位。
EAX、ECX、EDX、EBX、 ESI、EDI、ESP、EBP、EIP等都是X86 汇编语言中CPU上的通用寄存器的名称,是32位的寄存器。如果用C语言来解释,可以把这些寄存器当作变量看待。

2、sort命令

sort将文件的每一行作为一个单位,相互比较,比较原则是从首字符向后,依次按ASCII码值进行比较,最后将他们按升序输出。下面是sort的常用选项:
(1)sort –u 作用:输出行中去除重复行。
(2)sort –r 作用:默认的排序是升序的,如果想改成降序,加上-r就可以。
(3)sort –n 作用:sort是以字符进行排序的,当排列数字的时候可以加上-n。
(4)sort –k 列数 –t 分隔符 作用:当需要指定以某一列的值来作为标准排序的时候,可以使用-k,-t后面加上各列之间的分隔符。
(5)sort –f 作用:忽略大小写。

3、uniq命令

(1)uniq命令不加任何参数,仅显示连续重复的行一次。
(2)uniq –c 作用:显示文件中每行连续出现的次数。

4、wc命令

Linux系统中的wc(Word Count)命令的功能为统计指定文件中的字节数、字数、行数,并将统计结果显示输出。下面是wc的常用选项:
(1)wc -c 统计字节数。
(2)wc -l 统计行数。
(3)wc -m 统计字符数。这个标志不能与 -c 标志一起使用。
(4)wc -w 统计字数。一个字被定义为由空白、跳格或换行字符分隔的字符串。
(5)wc -L 打印最长行的长度。
(6)wc -help 显示帮助信息
(7)wc –version 显示版本信息

5、vim保存退出命令

(1):w 保存文件但不退出vim
(2):w! 强制保存,不退出vim
(3):wq 保存文件并退出vim
(4):wq! 强制保存文件,并退出vim
(5)q: 不保存文件,退出vim
(6):q! 不保存文件,强制退出vim
(7):e! 放弃所有修改,从上次保存文件开始再编辑
(8):w file 将修改另外保存到file中,不退出vim

6、字符截取命令

(1)cut命令
grep提取的是符合条件的行,而cut是提取符合条件的列。
cut -d 【用什么进行分割,默认的是tab键】 -f 【选择第几个字段】 文件名
例一:提取/etc/passwd中的所有的用户名

cat /etc/passwd | grep bin/bash | grep -v root | cut -d ":" -f 1

例二:df -h 查看硬盘的使用状况

df -h | grep "sda5" | cut -d " " -f 5

在使用上面的命令的时候会报错,因为如果分隔符是多个空格,使用cut命令会比较麻烦,应该使用awk命令。
awk 以空格为分割域时,是以单个或多个连续的空格为分隔符的,而cut则是以单个空格作为分隔符。

(2)printf命令
printf命令主要用于awk中,因为awk不能调用系统命令。
printf的格式控制的完整格式:
% - 0 m.n l或h 格式字符
下面对组成格式说明的各项加以说明:
<1>%:表示格式说明的起始符号,不可缺少。
<2>-:有-表示左对齐输出,如省略表示右对齐输出。
<3>0:有0表示指定空位填0,如省略表示指定空位不填。
<4>m.n:m指域宽,即对应的输出项在输出设备上所占的字符数。n指精度。用于说明输出的实型数的小数位数。为指定n时,隐含的精度为n=6位。
<5>l或h:l对整型指long型,对实型指double型。h用于将整型的格式字符修正为short型。
例一:printf '%s %s %s\n' 1 2 3
%ns:输出字符串
%ni:输出整数
%m.n:输出浮点数,共m位,小数部分共n位
例二:printf '%s\t %s\t %s\t %s\t\n' $(cat test.txt)

姓名 性别 科目 分数
小红 数学 90
小明 语文 67

print输出指定内容后换行,printf只输出指定内容后不换行。

(3)awk命令
awk默认的分隔符是空格和tab,但是也可以指定特定的分隔符,比如冒号,百分号等。
awk的基本格式:awk ‘条件一{动作一}条件二{动作二}’文件名
例一:

学号 姓名 性别 成绩
1 小红 89
2 小兰 78
3 小明 68

例一:打印出姓名和成绩。

awk 'BEGIN{print "game start"} {print $2 "\t" $4} END{print "game over"}' test.txt

例二:打印出成绩大于等于78的学生姓名。

cat test.txt | grep -v 姓名 | awk '$4>=78{print $2}’

例三:查看硬盘的使用状况

df -h | grep sda1 | awk '{print $5}' | cut -d "%" -f 1

例四:FS指定特定的分隔符

cat /etc/passwd | awk 'BEGIN{FS=":"}{print $1 "\t" $3}'

FS指定内置函数,在使用这个命令的时候,通常要使用BEGIN。

(4)sed命令
sed是一种几乎包括在所有UNIX平台的轻量级流编辑器。sed主要是用来将数据进行选取、替换、删除、新增的命令。
sed的基本格式:sed 【选项】‘【动作】’文件名
下面是sed的常用选项:
<1>-n:只将处理过的数据输出
<2>-e:多条命令同时进行
<3>-i:将原文件修改
下面是sed的常用动作:
<1>a:追加【sed ‘2a hello’test.txt】【第二行之后加hello】【当输入是多行的时候,在每一行后面加上\】
<2>c:替换【sed ‘2c hello’test.txt】【将第二行替换为hello】
<3>i:插入【sed ‘2i hello’test.txt】【第二行之前加hello】
<4>d:删除【sed‘2,4d’test.txt】【删除从第二行到第四行】
<5>p:打印【sed -n‘2p’test.txt】【输出文件的第二行】
<6>s:子串替换。【sed '3s/74/99/g'test.txt】【将第三行中的74分替换为99】【s/旧子串/新子串/g】

7、与CPU相关的几条命令

(1)查看cpu的详细信息:cat /proc/cpuinfo
(2)读取物理cpu的个数:cat /proc/cpuinfo | grep "physical id" | sort | uniq | wc –l
(3)查看逻辑cpu的个数:(线程数)cat /proc/cpuinfo | grep "processor" | wc -l
(4)查看cpu是几核:cat /proc/cpuinfo | grep "cores" | uniq

cat /proc/cpuinfo | grep "core id" | sort -u | wc –l

【这两条命令的作用一致,第二条可以看见core的id】
(5)查看cpu的主频:cat /proc/cpuinfo | grep MHz | uniq
(6)查看当前操作系统的内核信息:uname –a
(7)查看cpu的位数:getconf LONG_BIT
(8)查看cpu的类型:arch 或者 uname –m
(9)查看cpu的型号:cat /proc/cpuinfo | grep name | cut –f 2 -d : | uniq –c
(10)查看硬盘和分区:df –h
注意:物理的cpu个数指的是真实存在的cpu的个数。cpu的核数指的是一个物理cpu上有多少个core。逻辑cpu也可以看做是线程数,一个核心就是一个物理线程,英特尔有个超线程技术可以把一个物理线程模拟出两个线程来用,充分发挥CPU性能,意思是一个核心可以有多个线程。

8、读取CPU的温度值

(1)MSR(model specific register)模块指定寄存器,为了设置CPU 的工作环境和标示CPU 的工作状态,包括温度控制,性能监控等,具体来说,分为以下几项:
1.Thermal;2. Frequency;3. C State;4. Microcode;5. EIST;6. TM;7. Key Features Of CPU;8. Voltage;9. Cache Control;10. MTRR;11. DCA(Direct Cache Access);12. Machine Check;13. 硬件联机控制;14.other。 
(2)MSR 是CPU 的一组64 位寄存器,可以分别通过RDMSR 和WRMSR 两条指令进行读和写的操作,前提要在ECX 中写入MSR 的地址。MSR 的指令必须执行在level 0 或实模式下。
(3)RDMSR 读模式定义寄存器。对于RDMSR 指令,将会返回相应的MSR 中64bit 信息到(EDX:EAX)寄存器中。
(4)WRMSR 写模式定义寄存器。对于WRMSR 指令,把要写入的信息存入(EDX:EAX)中,执行写指令后,即可将相应的信息存入ECX 指定的MSR 中。
(5)TCaseMax:这个值表示能使CPU 100%稳定运行时在核心表面正中或者是IHS (就是cpu的金属顶盖)正中的最高温度。Tjunction(or TjunctionMax):这个值表示在核心和核心所在PCB板之间所容许的最大温度,通常这个值要远高于TCaseMax.当DTS(数字温度传感器)报告一个比TCaseMax还要高的温度时并不意味着CPU处于危险状态。因为TCaseMax是CPU所能忍受的最高外部温度。使用DTS的话,需要读取MSR( for Intel ) 或者 NB 寄存( for AMD ), 简单的计算一下就成了,下面是公式:
AMD_CoreTemp = DTS_Value – 49
Intel_CoreTemp = Tjunction – DTS_Value

上面都是一些基本的知识点,在我读取cpu的温度的时候采用了两种方式,而且两种方式的温度值相差不大。

第一种:
(1)安装lm-sensors

sudo apt-get install lm-sensors

(2)设定监控选项

sensors-detect

一路回答yes就可以。
(3)然后再输入sensors就可以出现cpu的温度信息。
结果:
Linux的基本知识(1)_第1张图片

第二种:
(1)读取Tjunction的值。

sudo modprobe msr
sudo rdmsr -p0 0x1A2

首次安装需要第一条命令,之后只用第二条就可以。p0指的是读取逻辑核0的温度值。我的cpu的类型是24 Intel(R) Xeon(R) CPU E5-2620 0 @ 2.00GHz,在这里我读出的结果是5b0a00,也就是91摄氏度。
(2)读取0x19c的值。

sudo rdmsr -p0 0x19c

读出的结果是:88380000,可以使用两种方法来计算这个值。
<1>用 88380000&007f0000 >> 16,然后转换为十进制是56,所以最终的温度值根据公式:Intel_CoreTemp = Tjunction – DTS_Value
得:91-56=35,所以逻辑核0的温度值是35摄氏度。
<2>91-(3*16+8)=35,这里的3和8指的是读取的值88380000得第三位数和第四位数。其本质和第一种是类似的。
下面的图是我的机器跑出的部分结果
Linux的基本知识(1)_第2张图片
其中core0模拟出的逻辑核是0和12。依次轮推可以得到其他core对应的逻辑核,也可以是对应的线程。

你可能感兴趣的:(Linux)