1、复习
遇到虚拟机异常退出,会生成配置文件,不确定文件以后是不是还要用的情况下,先改文件名,再启动虚拟机;
2、磁盘相关命令:
df(disk full):查看磁盘整体状况
-h :以更方便模式展现
Mounted on:挂载
/ : 根目录
du(disk used):查看磁盘使用情况(可以具体查看目录的使用情况)不加参数默认当前目录
查看指定目录的使用情况:
-d(depth):du -h -d 0(0表示层数,1表示下一层)
3、远程拷贝(上传,下载):scp(srcure copy)
scp:使用的是ssh协议;
scp src(本地路径) dest(远程路径);
本地路径:绝对路径()相对路径;
远程路径:用户名@IP: 路径;
在windows下创建一个scpTest.txt文件,在其目录下打开cmd输入 scp scpTest.txt leao@192.168.146.129:~ 根据提示完成对文件的上传,目标服务器leao;
查看leao根目录,完成上传;
如果是文件夹要加-r参数;
下载文件把目标文件改到远程路径即可;
从leao服务器下载work文件夹,命令结束小加点
每次上传下载都要密码,为避免麻烦可以使用另一种验证手段:
采用密钥和公钥匹配:自己保留密钥,用户用公钥获取授权;
通过ssh-keygen创建和保存密钥和用钥;(windows环境下测试)
id_rsa:密钥;
id_rsa.pub:公钥;
分发公钥给远程服务器leao:
分发成功,远程服务器获得id_rsa.pub公钥文件:
服务器会生成.ssh文件,通过ll查看:
采用追加模式把公钥文件写入.ssh/authorized_keys;
写入文件后查看公钥;
再次上传文件则不需要密码验证:
gitee的常规用法:
从远程仓库下载,在本地仓库修改,
修改本地仓库,add(将修改添加到缓存中,stage)
commit(确认修改)
把本地的修改上传到远程仓库:
git是多人合作,另外一个人也会修改:
当远程仓库发生修改,另一个人的原始版本文件修改版本与远程仓库不匹配,另一个人就不能上传,就需要把远程仓库pull下来进行同步,发现远程仓库和本地仓库不一样,发生了代码冲突,需要解决;如果只修改自己的,不修改别人的按下ctrl + x 退出即可;退出后再pull,同步成功后才能修改;
get pull 仓库路径,clone目标文件;(先在gitee上上传公钥)
4、vim
所见即所得形式:记事本,word,,markdown
命令式:vi,vim(m表示improved),emacs
VIM有三种模式:
普通模式(命令模式)
普通模式到插入模式:i,I,a,A,o,O
i:插入到光标的前面(insert) I :插入到行首
a:插入到光标的后面(append) A:插入到行尾
o:插入到下一行的开始 O:插入到前一行
短命令:
长命令: 以:开头的命令
光标移动:
h(左)j(下)k(上)l(右)
翻页操作:
CTRL + f:下一页;
ctrl + b :上一页;
ctrl + u :上半页;
ctrl + d :下半页;
H:把光标移动到页首,
L:该页最后一行的行首,
gg:文件的开始
G:文件的末尾
w:下一个单词(word)
b:上一个单词
[ n]- :往前n行
[ n]+:往后n行 (直接在键盘上输入n 和加减符,n表示数字)
[n]G / : [ n ] :去往n行(短命令数字加G,长命令冒号加行号)
在命令模式下编辑文本:
删除(剪切):
x:删除一个字符
dd:删除一行
[n]dd / d[n]d :删除n行(从光标往后n行删除)
:x,y d :删除x到y行
d^ :删除到行首
d$ / D:删除到行尾;(删除注释)
dw:删除一个单词
[n] dw / d[n]w :删除n个单词(从光标开始删除)
dt):删除到右括号 (delet to)// dt" :删除到双引号,删除字符串为空串
p:粘贴(parst)
u:撤销修改(undo)
ctrl + r:恢复修改(recover)
yy:拷贝一行(yank)
[n]yy / y[n] y:拷贝n行
:x ,y y 拷贝x到y行
yw :拷贝一个单词
[n]yw /y[n]w :拷贝n个单词
查找和替换:
查找:/regex (regex表示正则表达式,也可以直接匹配单词)
匹配f开头t 结尾的单词,[] 是一个集合 ^表示对集合取反,(不匹配所有带空格的,以此排除句子)
n :下一个匹配项
N:上一个匹配项
替换:
:s/regex/substitue/选项 (s表示替换命令,把regex该正则表达式匹配到的内容替换成substitue) 默认没有选项就只替换第一个
选项:g,替换该行的所有匹配项;
多行替换:
第一行到第十行;
全局替换匹配项 :% s/regex/substitue g;
编辑模式(插入模式,所见及所得的模式)
命令模式到插入模式的转化(i,I,a,A,o,O)
i:插入到光标的前面(insert) I :插入到行首
a:插入到光标的后面(append) A:插入到行尾
o:插入到下一行的开始 O:插入到前一行
视图模式(visual)
作用:选择范围,从命令模式到其他模式,视图模式要从命令模式转化
V :行优先----------行选模式
ctrl + V :竖优先--------列选模式
选择范围,y(拷贝),d(删除),
批量注释和批量删除注释:
(添加//,进入列选模式,ctrl + i (I)行首插入//,esc后选择的列都会被注释;)
步骤:将光标移动到要注释的第一行,ctrl + V 进入列选模式,I ,输入//,esc退出
代码对齐:gg = G(对全文代码进行对齐(没有集成开发环境精细))
对文件的操作:
:W (保存)(ctrl + s,使vim进入僵死状态,退出僵死状态ctrl + q)
:q (退出,未修改文件)
:q!(不保存修改并退出)
:wq(保存修改并退出)
多窗口:
:new filename (在新窗口中打开filename,把窗口切成两个,上下分屏)
:split
:sp
ctrl + w (可以切换光标所在的窗口,w表示window)
退出当前窗口:q;保存退出(wq);或者(q!)不保存退出;:qa(退出所有窗口)
多窗口左右分屏:
:vnew filename
:vsplit
:vsp
多标签:
:tabnew filename (打开新标签)
切换:
gt 下一个
gT 上一个
切换和上面多窗口相同;
:set nuber 设置行号每次都需要重新设置可以进入配置文件配置vim
配置vim:
~/.vimrc (rc表示runni command vim启动时会读取这个文件,并执行里面的命令)
syntax on:关键字高亮显示
hlsearch:查找内容高亮显示
tabstop:tab键默认设置成4空格(不设置是默认8个空格)
autoindent:自动缩进
vimtutor :vim练习手册
5、编译工具链:SDK(software development kit)
IDE(集成开发环境)vs,clion,eclipse,xcode
gcc(GNU开发的),clang;
gcc -v :查看版本信息
目标平台架构:(交叉编译,一般安卓架构采用ARM架构)
遵循posix标准:
预处理:执行预处理指令
#include:文件包含
#define M 5 :宏定义(简单的文本替换)
#define SIZE(a) (sizeof(a)/sizeof(a[0])) :宏函数
#if #else #endif :编译预处理(可以根据条件跳过编译某些片段,预处理后不会包含if 0部分,宏开关)
gcc -E hello.c -o hello.i (-E 预处理, -o生成)
#ifdef N #else #endif :(宏开关,定义了N,就编译;)
没有定义N,所以在.i文件中输出else;
预处理过程中去定义宏N:
gcc -E hello.c -o hello.i -D N
.i文件显示world;
#ifndef #else #endif :ifnotdefine;如果没有定义目标头文件就满足条件
#ifndef 头文件名
#define M 100
#endif
gcc -E hello.c -o hello.i
以上条件编译方法可以为不同的目标平台生成不同的目标代码;
宏开关会用作防御式声明(避免重复包含多个头文件)
#ifndef _ _foo_h_
#define xxx
#endif
编译:将c语言代码编译成汇编代码;
有两种风格的汇编代码(AT&T 汇编,x86/x86_ _64)两种风格汇编代码目标寄存器,源寄存器位置相反;
可以根据预处理指令获得汇编代码:
gcc -E hello.c -o hello.i
gcc -S hello.i -o hello.s
也可以一步到位:
gcc -S hello.c -o hello.s
对照源文件看汇编代码(实例代码为x86/x86_ _64架构的汇编代码):
x86架构兼容8086架构 (8086 数据总线:16bit 地址总线:20bits)
一个字长:word 16bits (汇编字长因为8086架构所以为16bits)
L :long word(长字)32bits(用L表示长字,长字是32bits)
q :quadra word 64bits (q表示四个字)
double (2) triple(3)quadra (4) penta(5)
push(入栈) (pushq q表示字长)
pop(出栈)
mov移动(复制)
lea(load effective address)加载有效地址 (leaq q表示字长)
call (函数调用)
ret (函数返回)
%rbp(以%开头的是寄存器,bp表示base pointer(栈帧基址寄存器,存放上一个栈帧的地址))
%rsp(stack pointer(栈顶寄存器)) bp和sp组成栈帧的大小
%eax(存放返回值)
------------------------------------------------------
pushq %rbp(将%rbp寄存器的值保存在栈帧中)
movq %rsp %rbp (把rsp的值放入rbp) rbp -rsp = 0 栈帧大小为0
leaq .LCO(%rip),%rdi (.LCO把字符串地址赋值给%rdi(rdi存放第一个参数的位置),%rip里存的是helloworld的地址)
call puts@PLT (编译器对printf进行优化,改成puts)
movl $0,%eax(把返回值0放入eax寄存器)
popq %rbp(出栈后,恢复%rbp的值)
ret (函数调用结束)
--------------
godbolt.org (在线编译平台),学习汇编基础;