1.通过网线直连的两台终端设备
# 连接它们
连接两台终端设备最简单的方式是什么?其一当然是直接通过一条网线来连接。
假设我们准备了两台 PC,并用铜交叉线连接了它们:
仅是如此还是不够的,我们还需要为他们配置一下 IP 地址:
# Ping
相信你应该对 Ping 这个命令有所耳闻,其作用是探测本机与网络中另一主机之间是否可达 (大白话就是连接正不正常),基于 ICMP 协议 (现在不清楚这些协议也没关系,后面会讲)。
如果配置正确,我们的两台设备应该是能够 Ping 通的。
配置完 IP 地址之后,我们尝试一下用 192.168.1.10 这台设备去 Ping 192.168.1.11 。
可以看到它们之间是连通的!
在此之上我们就可以使用耳熟能详的 UDP、TCP 协议去交换数据了。
# MAC
设备之间不是通过 IP 去识别设备身份的,而是使用一个叫 MAC 地址的东西:
MAC 地址(英语:Media Access Control Address),直译为媒体访问控制地址,也称为局域网地址(LAN Address),以太网地址(Ethernet Address)或物理地址( ...
1.VsCode环境配置
# Visual Studio Code 安装
这一块应该没什么好细说的,到官网上下载就可以了。
# 虚拟机 安装
我个人的开发环境是,物理机 Windows + 虚拟机 Ubuntu ,因此需要安装一个虚拟机应用。
可以看你个人选择自己喜好的虚拟机应用,例如 VMWare Workstation 或 VirtualBox 。
这里我使用的是 VMWare Workstation 。
# Ubuntu 安装
虚拟机上安装 Ubuntu 的话,网上的教程也很多,也不赘述了,我这里装的是桌面版的。
# 配置 VsCode 的远程开发
我们需要在 Windows 上进行 Linux 下的开发, VsCode 给我们提供了一个很好的方案,使用 SSH 进行远程开发。
# VsCode 扩展
这是 VsCode 中,微软提供的一个扩展。
首先启动 VsCode ,选择 Extensions(Ctrl+Shift+X) 选项卡,搜索 Remote 。
安装 Remote - SSH 扩展:
Remote - SSH
Remote Explorer
会被自动安装
Remo ...
0.前言
好久没写博客了…
嗯… 因为某些原因,打算转 Linux 下做 C++ 开发,Windows 的东西就当成业余的兴趣去研究吧。
这个系列的文章就记录一下我在学习过程中的一些思考,想法,以及备忘吧,就这样吧。
【保护模式】2.基于段的保护
# 段寄存器的扩展
我们需要划分权限,让操作系统和应用处在不同的权限中,以保证系统安全;
并且决定基于段机制进行延展。
相较于实模式的 1MB 寻址 (220),保护模式下的寻址范围已经达到了 4GB (232),在汇编指令上可以直接书写 4 字节的内存地址。
此时,段寄存器的 16 位宽度已经显得有些相形见绌了。
为了扩展,段寄存器在保护模式下,不再直接存放段的基址,而是存放了索引。
# 全局描述符表 (Global Descriptor Table)
具体是索引什么呢?
这里引入了一张表,叫做全局描述符表,其实就是在内存中存放的数组。
其元素叫做段描述符,在内存中顺序组织起来,也就是一张表。
简称 GDT
# 段选择子
段寄存器由于有了新的用途,因此也有了新的名字,叫做段选择子。
大概是意为用于选择段的寄存器吧
# 段描述符
那么说回段描述符,它究竟有什么作用呢?为什么会有这么一个东西呢?
段描述符是 GDT 或 LDT (暂时忽略) 中的元素;
它为处理器提供诸如段基址,段大小,访问权限及状态等信息。
先来看英特尔白皮书上对段描述符的图示
每个段描述符 ...
【保护模式】1.初探保护模式与分段机制
# 保护模式
保护模式是在硬件层面提供的 CPU 运行机制,是现代操作系统的根本。
没有保护模式,操作系统是没有安全性可言的。
# 何为保护
指令是存放在内存中的
假定你的程序试图对操作系统的关键代码进行破坏:
mov byte ptr ds:[kernel], 0x90
操作系统应该如何制止?
也许这个时候有同学发炎了:
“也许操作系统它能监控呢?”
答案是,监控你程序的并不是操作系统,这种工作必须在硬件层完成
很简单的道理,实际上运行指令的是 CPU,只有 CPU 知道当前 CPU 正在做什么事,操作系统是不可能知道的
操作系统也是由 CPU 运行的指令序列。
除非 CPU 提供了一种回调机制,运行任何指令都先运行操作系统的指令,但这是不现实的,对性能影响过于严重
实现一套虚拟机也可以保证安全性,但是依旧存在性能问题,也不在本文讨论范围之内。
# 模式之分
我们得到了结论,保证 操作系统的安全性 这种机制,必须是硬件提供的。
在早期,CPU 并未提供这种保护模式,为此才划分出了 “实模式” 与 “保护模式”
在保护模式出现 ...
【Git】远程仓库登录
# Github 身份验证
Github 通过 SSH 登录,通过提前在 Github 上设置公钥,以及本地存储的私钥,使得 Github 能够验证身份的合法性。
# 配置用户名和邮箱
git config --global user.name "<用户名>"
git config --global user.email "<邮箱地址>"
# 查看配置
git config --list
# 密钥
生成密钥对:
ssh-keygen -t rsa -C "<邮箱地址|用户名|...>"
放置在~/.ssh 目录中
config 文件指定有效的密钥文件
Windows 下可以在 Git Bash 中查看路径
默认公钥文件
id_rsa.pub
默认私钥文件
id_rsa
打开公钥文件,将其复制。
# 设置公钥
打开 Github
在个人设置 -> SSH and GPG keys -> SSH keys 中,添加刚刚复制的公钥。
# 验证登录
ssh ...
【密码学】PKI体系:谁来保证我的通信安全?
PKI概述Public Key Infrastructure,即公钥基础设施。
以下摘自百度百科:
公钥基础设施是一个包括硬件、软件、人员、策略和规程的集合,用来实现基于公钥密码体制的密钥和证书的产生、管理、存储、分发和撤销等功能。PKI体系是计算机软硬件、权威机构及应用系统的结合。它为实施电子商务、电子政务、办公自动化等提供了基本的安全服务,从而使那些彼此不认识或距离很远的用户能通过信任链安全地交流。
当然,要是光看定义能看懂的话,想必各位也不会见到这一篇文章了,贴出定义只是个人习惯,咱们往下看。
明文与密文首先咱们要知道,咱们能够阅读理解的东西是明文,比如远在天边的网友给你发的一条qq消息,你看到的时候它就是明文,这样你才能看得懂你的网友想和你说些什么。
当然,你看得懂,别人也看得懂,中文嘛,大家都学过。你想着,我要是不想赤裸裸的让别人窥探我的聊天内容是吧,咱们多少还是希望能有些隐私的。
加密自然而然的出现了。
我们通过某种方法对明文原本的信息进行可逆的改变,别人只要不知道我们是如何改变的,就无法还原,只有我们才能够还原为明文。加密后无法直接理解的信息,我们就叫做密文。
前置知 ...
【动手写ToyLang】6-虚拟机设计
# 所谓 "解释器"
我们除了能对遵循 ToyLang 语法的源文件编译之外,还要能够执行编译的结果。
若编译结果需要由其他程序负责执行,该程序便可称之为解释器。
如先前提及的 AST 解释器。
百度百科上对解释器的定义也较为模糊:
解释器(英语:Interpreter),又译为直译器,是一种电脑程序,能够把高级编程语言一行一行直接转译运行。解释器不会一次把整个程序转译出来,只像一位 “中间人”,每次运行程序时都要先转成另一种语言再作运行,因此解释器的程序运行速度比较缓慢。它每转译一行程序叙述就立刻运行,然后再转译下一行,再运行,如此不停地进行下去。
按照百度百科的定义,一行一行动态执行高级编程语言的程序,才能算解释器。
但是以现在常见的编程语言,如 Python、Java 等也在某些情况下会被定义为解释型语言来看,已经与 "解释器" 的定义相违背了。
因为 Python 和 Java 并不是逐行解释源代码的,实际上得以 "解释" 的是字节码,而执行字节码的程序又被称为 "虚拟机"。
我的个人理解是 ...