「SQLite」- 常用操作

基础操作
SQLite 创建表 | 菜鸟教程

$ sqlite3 new.db # 相当于创建数据库
SQLite version 3.34.0 2020-12-01 16:14:00
Enter “.help” for usage hints.
sqlite>

sqlite> CREATE TABLE COMPANY( # 创建表 COMPANY
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL
);

sqlite> CREATE TABLE DEPARTMENT( # 创建表 DEPARTMENT
ID INT PRIMARY KEY NOT NULL,
DEPT CHAR(50) NOT NULL,
EMP_ID INT NOT NULL
);

sqlite>.tables # 查看所有表
COMPANY DEPARTMENT

sqlite>.schema COMPANY # 查看表结构

专用于 SQLite 的工具
sqlitebrowser – GUI editor for SQLite databases http://sqlitebrowser.org/
sqliteman – GUI tool for SQLite3 admin and developers alike http://sqliteman.com/
wxsqlite3-3.0-dbg – Debugging symbols for wxSQLite3 3.0 http://utelle.github.io/wxsqlite3/docs/html/index.html
SQLiteSt[……]

READ MORE

「HIGH-LEVEL-PROGRAMMING-LANGUAGES」- 概念术语

编程语言简介
https://en.wikipedia.org/wiki/Programming_language
编程语言列表
编程语言分类的列表:https://en.wikipedia.org/wiki/Lists_of_programming_languages
根据「语言首字母」进行分类:https://en.wikipedia.org/wiki/List_of_programming_languages
常见编程语言
ADA Wikipedia/Ada (programming language) ADA语言基础教程
AS Using as
C++ http://www.cplusplus.com http://en.cppreference.com/w
TCL – TOOL COMMAND LANGUAGE Wikipedia/Tcl Homepage
CFLOW Homgepage
Maxima – GPL CAS based on DOE-MACSYMA https://sourceforge.net/projects/maxima/?source=typ_redirect
Gperf HASH函数生成器。Homepage
# ZIMPL – Zuse Institut Mathematical Programming Language https://zimpl.zib.de
常见概念术语
编译器
编辑器
高级语言
C, Emacs Lisp, Haskell, Shell, Python, PHP, Java
Linaro
https://www.linaro.org/
接口(Interface)
接口提供交互的功能,实现数据传输。比如人通过眼观色,通过耳听声,通过口发音,这些器官都可以理解为人和外界交互的接口。
API, Application Programming Interface
API(Application Programming Interface,应用程序接口)是一些预先定义的函数,或指软件系统不同组成部分衔接的约定。用来提供应用程序与开发人员基于某软件或硬件得以访问的一组例程,而又无需访问原码,或理解内部工作机制的细节。如电脑需要调用手机里面的信息,这时候通过一根数据线将电脑手机连接起来,电脑和手机上连接数据线的接口就是API接口。
MVC, Model View Controller
MVC(Model View Controller 模型-视图-控制器)是创建 Web 应用程序的模式,由三部分组成: 1)Controller(控制器)是应用程序中处理[……]

READ MORE

「HIGH-LEVEL-PROGRAMMING-LANGUAGES」- 编译原理

Bison(语法分析器生成器)
LFS/6.27. Bison-2.5 Bison/Homepage

# Bison-2.5
./configure –prefix=/usr
make && make install

Flex
Homepage: http://flex.sf.net
GCC(GNU Compiler Collection)
Homepage: http://gcc.gnu.org/
# /usr/bin/ld: cannot find -lmysqlclient
「bin/ld: cannot find -l<nameOfTheLibrary> install BigARTM – CentOS v7」 「GCC/3.14 Options for Linking」 「GCC how to add before the default linker search path by default? LIBRARY_PATH not working」 在CentOS上编译时,已经安装安装了MySQL应用,且libmysqlclient也是存在的,但是依旧有这个错误。执行make VERBOSE=1后,发现执行编译命令时,/usr/lib64/mysql并不在gcc的库查找路径中。
办法有一个:在编译时,增加库的搜索路径,即执行命令LIBRARY_PATH=/usr/lib64/mysql make即可。当然可能还有其他办法。
re2c(a lexer generator)
Install: http://re2c.org/install/install.html
=

.
├── bin
│   └── re2c
└── share
└── man
└── man1
└── re2c.1

4 directories, 2 files

常见问题处理

/bin/sh: rst2man.py: command not found
Makefile:1858: recipe for target ‘doc/re2c.1’ failed
make[1]: *** [doc/re2c.1] Error 127
make[1]: *** Waiting for unfinished jobs….
make[1]: Leaving directory ‘/mnt/uui/packages/re2c-0.16’
Makefile:768: recipe for target ‘all’ failed
make: *** [all] Error 2

http://st[……]

READ MORE

「GNU」- 工具链

GNU Make: 自动化工具,用于编译、构建
GNU Compiler Collection (GCC): 编译器套件,适用于若干种语言
GNU Binutils: 二进制工具,包含了链接器、汇编器及其他的工具
GNU Bison: 语法分析器生成器,经常和Flex(词法分析器生成器)一起使用
GNU m4: m4宏处理器
GNU Debugger (GDB): 代码Debug工具
GNU build system: 构建系统,包括: Autoconf, Automake, Libtool
基本流程: 创建源码文件; 执行autoscan,生成configure.scan文件; 将configure.scan复制为configure.in文件,并进行相应的修改; 执行aclocal,生成aclocal.m4文件; 执行autoconf,生成autom4te.cache和configure文件;
创建Makefile.am文件; 运行automake,会使用Makefile.am文件生成Makefile.in
最后,执行configure,生成Makefile文件。
最后就是执行及make,make install了。
参考文献
Wikipedia / GNU Toolchain: https://en.wikipedia.org/wiki/GNU_toolchain Automake, Autoconf使用详解: http://www.laruence.com/2009/11/18/1154.html[……]

READ MORE

「RESTful」- Representational State Transfer

问题描述
在 REST 出现之前,URI被随意命名,URI 不统一。
如下为没有风格约束的 URI 信息,如下示例: 1)预约会议室:/reserve/meetingroom/B25R 2)取消预约会议室:/cancel/meetingroom/B25R 3)查询会议室状态:/meetingroom/B25R?method=query
解决方案
2000 年,HTTP 的主要设计者 Roy Thomas Fielding 发布的博士论文提出 REST 风格。REST(Representational State Transfer,表述性状态转化)资源在网络中以某种表现形式进行状态转化,是一种软件架构风格。简而言之,REST是一种设计风格。
REST的全称“ Representational State Transfer ”,表现层状态转化,实际上省略了主体资源。
Roy论文《Architectural Styles and the Design of Network-based Software Architectures》摘要:”本文研究计算机科学的两大前沿-软件和网络的交叉点。长期以来,软件研究主要关注软件设计的分类、设计方法的演化,很少客观地评估不同的设计选择对系统行为的影响。而相反地,网络研究主要关注系统之间通信行为的细节、如何改进特定通信机制的表现,常常忽视了一个事实,那就是改变应用程序的互动风格比改变互动协议,对整体表现有更大的影响。我这篇文章的写作目的,就是想在符合架构原理的前提下,理解和评估以网络为基础的应用软件的架构设计,得到一个功能强、性能好、适宜通信的架构。”
URI 是统一资源标识符,它标识资源的具体位置,所以在 URI 中不应该包含动作。REST 规范 URI 命名,面向资源,一目了然。
原理简述
REST 作为客户端-服务器的交互框架,具有三个概念:资源;表现层;状态转化;

资源:URI定位资源
“资源”是一个信息实体。网络上的所有事物都可被抽象为资源,每个资源都有一个唯一的资源标识符(URI)。例如端口、网元、单板、机房等都属于资源。
REST 的核心在于资源和操作。用URI定位资源,用 HTTP 动作(GET, POST, PUT, DELETE)描述操作。
表现层:各种格式标识资源
“资源”具有多种外在表现形式,“资源”具体呈现出来的形式,叫做它的“表现层”(Representation)。
例如:文本作为资源可以用txt格式表现,也可以用HTML格式、XML格式、JSON格式表现,甚至可以采用二进制格式表现。图片作为资源可以用JPG格式表现,也可以用PNG格式表现等等。
状态转化:HTTP动作进行CRUD操[……]

READ MORE

「Linux」- 制作chroot环境(用于构建)

问题描述
简单地说chroot是一个修改当前进程及子进程运行目录的操作。通过创建一个目录并初始化,使该目录具有与操作系统相同的目录结构,应用程序将在该目录中运行,加载该目录中文件及库,与原始的操作系统目录进行隔离。
该笔记将记录:在 Linux 中,如何制作一个chroot环境,用于软件编译。
chroot ?
简单地说chroot是一个修改当前进程及子进程运行目录的操作。通过创建一个目录并初始化,使该目录具有与操作系统相同的目录结构,应用程序将在该目录中运行,加载该目录中文件及库,与原始的操作系统目录进行隔离。这一点与容器技术非常相似,但这不是容器技术。
通过chroot功能,可以进行:

重新安装bootloader以修复引导;
重新构建initramfs镜像;
修改操作系统的密码;
构建软件运行或编译环境;(这也是我创建chroot环境的目的)

还可以做很多其他的事情。
制作chroot环境的方法?
# 制作方法
编译openjdk7u6需要在ubuntu 10.10 amd64系统环境下进行。这里有两个办法:

使用虚拟机(比如VirtualBox等等)。
创建chroot环境(使用ubuntu 10.10 amd64的chroot环境);

在使用虚拟机时,物理机与本机的文件传输并不是十分方便,而且虚拟机的安装也会比较繁琐。
# 为什么非要使用ubuntu 10.10 amd64来编译openjdk7u6呢?
最主要的原因是:“本机的库版本及编译器版本”和“官方编译测试环境中的”不同,经常导致编译不通过。本质上来讲,只要你的”编译器和库的版本与官方相同“,按照文档就可以编译成功。 在编译的Android系统时候,官方文档强调了:各个版本的android系统编译时所使用的Ubuntu版本。在编译chromium浏览器时,官方文档中有一句话:“Once you have checked out the code, and assuming you’re using Ubuntu, run build/install-build-deps.sh”。所以一些相对较大的项目,文档或者手册里多半都会指明编译环境及系统信息。
本文主要介绍chroot环境的制作,而这个过程中一个主要的问题就是如何使用「系统的ISO文件」生成「已安装好的系统目录结构」。
方法一、使用虚拟机提取操作系统(过时、不推荐)
思路:使用虚拟机,将操作系统安装到「虚拟硬盘文件」中,再“解压”出「虚拟硬盘文件」中的文件系统。
第一步,在虚拟机里安装系统 这个就很简单了,不再赘述;
注意:硬盘文件[……]

READ MORE

「ANDROID」- 使用源码编译Android系统

建立构建环境
AOSP: https://source.android.com/
硬件要求:
OS:Gingerbread(2.3.x版本)以后,要求64位环境;之前版本可以使用32位编译; 硬盘空间:代码检出100G、单个编译150G、多个编译200G+;如果使用了ccache要更多的空间; 虚拟机中:最少需要16GB of RAM/swap 软件要求:
OS:主分支是在Ubuntu LTS下开发的;
GNU/Linux、Mac OS、虚拟机中的系统 Android 6.0 (Marshmallow) – AOSP master: Ubuntu 14.04 (Trusty) Android 2.3.x (Gingerbread) – Android 5.x (Lollipop): Ubuntu 12.04 (Precise) Android 1.5 (Cupcake) – Android 2.2.x (Froyo): Ubuntu 10.04 (Lucid)
JDK版本:
AOSP主分支: Ubuntu – OpenJDK 8, Mac OS – jdk 8u45 or newer Android 5.x (Lollipop) – Android 6.0 (Marshmallow): Ubuntu – OpenJDK 7, Mac OS – jdk-7u71-macosx-x64.dmg Android 2.3.x (Gingerbread) – Android 4.4.x (KitKat): Ubuntu – Java JDK 6, Mac OS – Java JDK 6 Android 1.5 (Cupcake) – Android 2.2.x (Froyo): Ubuntu – Java JDK 5
关键的软件包:
Python 2.6 — 2.7; GNU Make 3.81 — 3.82; Android 3.2.x (Honeycomb) 及以前的版本为了防止编译出错,需要3.82版本的make; Git 1.7
其他的软件包:
Ubuntu 14.04 x64: 官方推荐系统
$ sudo apt-get install git-core gnupg flex bison gperf build-essential \

zip curl zlib1g-dev gcc-multilib g++-multilib libc6-dev-i386 \
lib32ncurses5-dev x11proto-core-dev libx11-dev lib32z-dev ccache \
libgl1-mesa-dev libxml2-utils xsl[……]

READ MORE

「EMACS-LISP」- 使用正则表达式(学习笔记)

问题描述
现在的高级编程语言,多数都支持正则表达式。而且,对于字符串的复杂处理,使用正则表达式可谓相当方便(如果是简单处理,则无需使用正则表达式)。当然,对于正则表达式的学习,还是有些困难的,毕竟那些奇怪的符号,让人忘而生畏。
该笔记将记录:在 Emacs Lisp 中,使用正则表达式的方法,及学习路线(官方文档组织方式,虽然邻近但是依旧零散)。
解决方案
学习路线
最好的学习方法便是阅读官方文档(任何第三方的整理记录,都不能完全保证时效性与准确性,只能作为一种补充):
34.3 Regular Expressions
34.3.1 Syntax of Regular Expressions

34.3.1.1 Special Characters in Regular Expressions
34.3.1.2 Character Classes
34.3.1.3 Backslash Constructs in Regular Expressions

34.3.2 Complex Regexp Example
34.3.3 The rx Structured Regexp Notation
34.3.4 Regular Expression Functions

我们这里仅是罗列官方文档,让我们对要学习的内容及章节有个整理的了解(官方文档拆成子章节,看起来有些“零散”)
使用说明
# 09/22/2018 在 Emcas 中,正则表达式并不具备 PCRE、ERE 的语法,它的正则语法更像是 BRE,因此会看到大量带有反斜线的正则表达式。

operator
syntax

or
‘\|’

grouping
‘\(’ and ‘\)’

To specify a regular experession like `xxx\(foo\|bar\)` in a Lisp string, use `xxx\\(foo\\|bar\\)`
参考文献
Regexps – GNU Emacs Manual EmacsWiki: Regular Expression https://www.gnu.org/software/emacs/manual/html_node/efaq/Using-regular-expressions.html%20[……]

READ MORE

「INFLUXDB」- 用于数据分析的数据存储

问题描述
我们需要 Proxmox VE 进行监控,其 Metric Server 支持 InfluxDB 数据库,所以我们对 InfluxDB 进行学习;[……]

READ MORE

「INFLUXDB」- 学习指南

研究对象
InfluxDB
研究结果
1)理论:掌握 InfluxDB 的基本概念及术语; 2)实践:部署 InfluxDB 服务,并采集 PVE 指标;
研究工具
信息采集
官方文档: 1)InfluxDB OSS 2.6:https://docs.influxdata.com/influxdb/v2.6/
学习路线
WIP
执行路线
WIP[……]

READ MORE

「INFLUXDB」- 概念术语

初始配置
The initial setup process for an InfluxDB instance creates the following:
An organization with the name you provide.
A primary bucket with the name you provide.
An admin authorization with the following properties:

The username and password that you provide.
An API token (operator token). — 授予对 InfluxDB OSS 2.x 中所有组织和所有组织资源的完全读写访问权限;
Read-write permissions for all resources in the InfluxDB instance.

服务配置
服务访问方式
influx CLI
HTTP RESTful /api/v2
Web UI
创建初始用户
Enter a Username for your initial user. Enter a Password and Confirm Password for your user. Enter your initial Organization Name. Enter your initial Bucket Name. Click Continue.
All-Access Token
Create an API token in InfluxDB | InfluxDB OSS 2.6 Documentation
因为 Operator Token 对数据库中的所有组织具有完全的读写访问权限,所以我们建议为每个组织创建一个 All-Access Token 并使用这些令牌来管理 InfluxDB;
数据写入
数据写入方式
Influx user interface (UI) InfluxDB HTTP API influx CLI Telegraf InfluxDB client libraries
Line protocol
Line protocol 是在讲 InfluxDB 的数据格式。写入 InfluxDB 的所有数据均使用 Line protocol 写入,这是一种基于文本的格式,可让您提供必要的信息以将数据点写入 InfluxDB;

measurement: String that identifies the measurement to stor[……]

READ MORE

「INFLUXDB」- Flux

Flux 是一种函数式脚本语言,可让我们查询和处理来自 InfluxDB 的数据;
快速入门
InfluxDB OSS 2.6 Documentation/Query data/Query data with Flux

from(bucket: “get-started”)
|> range(start: 2022-01-01T08:00:00Z, stop: 2022-01-01T20:00:01Z)
|> filter(fn: (r) => r._measurement == “home”)
|> filter(fn: (r) => r._field== “co” or r._field == “hum” or r._field == “temp”)

from(), range(), filter():函数
|>:管道符号

进阶学习
Get started with Flux | Flux 0.x Documentation
浏览结构
Explore your data schema with Flux | InfluxDB Cloud Documentation
List fields in a measurement

import “influxdata/influxdb/schema”

schema.measurementFieldKeys(
bucket: “example-bucket”,
measurement: “example-measurement”,
)[……]

READ MORE

「INFLUXDB」- 环境部署

服务部署(Helm)
influxdata/influxdb: Scalable datastore for metrics, events, and real-time analytics

helm repo add influxdata https://helm.influxdata.com/
helm repo update

helm pull influxdata/influxdb2
helm show values ./influxdb2-2.1.1.tgz > influxdb2-2.1.1.helm-values.yaml

vim influxdb2-2.1.1.helm-values.yaml

helm install –namespace observing-system –create-namespace \
mon-influxdb ./influxdb2-2.1.1.tgz -f influxdb2-2.1.1.helm-values.yaml[……]

READ MORE

「Nginx」- 正向代理

配置 Nginx Http Proxy 代理服务器,与 [Squid] 功能一样,适用于正向代理 Http 网站。
正向代理配置
复杂配置

server {
resolver 8.8.8.8;
resolver_timeout 5s;

listen 0.0.0.0:8080;

access_log /home/reistlin/logs/proxy.access.log;
error_log /home/reistlin/logs/proxy.error.log;

location / {
proxy_pass $scheme://$host$request_uri;
proxy_set_header Host $http_host;

proxy_buffers 256 4k;
proxy_max_temp_file_size 0;

proxy_connect_timeout 30;

proxy_cache_valid 200 302 10m;
proxy_cache_valid 301 1h;
proxy_cache_valid any 1m;
}
}

最简配置

server {
# 监听端口号
listen 8888;

location / {
# DNS,需要解析$http_host所代表的主机(通常就是要访问的Web站点),
# 参考Nginx手册和RFC中关于HTTP PROXY的介绍,或者《HTTP权威指南》一书
resolver 8.8.8.8;
# 转发代理
proxy_pass http://$http_host$uri$is_args$args;
}
}

配置说明
下面的介绍基于复杂配置:
1,配置 DNS 解析 IP 地址,比如 Google Public DNS,以及超时时间(5秒)。

resolver 8.8.8.8;
resolver_timeout 5s;

2,配置正向代理参数,均是由 Nginx 变量组成。其中 proxy_set_header 部分的配置,是为了解决如果 URL 中带 “.”(点)后 Nginx 503 错误。

proxy_pass $scheme://$host$request_uri;
proxy_set_header Host $http_host;

3,配置缓存大小,关闭磁盘缓存读写[……]

READ MORE

「Netowork Switching」- 以太网交换安全技术(Switching Security)

问题描述
目前网络中以太网技术的应用非常广泛。然而,各种网络攻击的存在(例如针对 ARP、DHCP 等协议的攻击),不仅造成了网络合法用户无法正常访问网络资源,而且对网络信息安全构成严重威胁,因此以太网交换的安全性越来越重要。
解决方案
常见的以太网交换安全技术,包括:端口隔离、端口安全、MAC 地址漂移检测、风暴控制、端口限速、MAC 地址表安全、DHCP Snooping、IP Source Guard
端口隔离(+Port Isolation) 端口安全(Port Security) MAC 地址表安全(MAC Address Table Security) MAC 地址漂移防止与检测(MAC Address Flapping) MACsec(Media Access Control Security) 交换机流量控制(Traffic Control (Switch, L2)) IP Source Guard DHCP Snooping[……]

READ MORE

「Learning」- 电子与计算机工程

080909,Electronic and Computer Engineering,电子与计算机工程,其专业属于工学类;
计算机工程(Computer Engineering,简称 CE),是结合了工程类和部分计算机科学内容的学科,聚焦硬件领域,更具应用性;
针对该专业,不仅需要掌握编程技巧,还需对电子工程的知识有所了解,特别是电路、电子学等。需要学习微处理器,电子学原理,电子系统设计,计算机组成与结构,电路原理等课程;
CE 专业毕业生通常为各种系统开发软件 / 固件,例如嵌入式微控制器,设计 VLSI 微芯片,模拟传感器,电路板和操作系统。由于计算机工程师对数字系统,电动机和传感器的了解,它们也适用于机器人研究;
学习内容
爱问教育/电子与计算机工程主要学什么
电子与计算机工程主要学《固体物理学》、《材料机械性能》、《单片集成放大器电路设计》、《电路设计导论》、《多核计算与并行处理》、《工程概率方法》、《工程优化》、《基于微处理器的系统设计》、《控制系统分析与设计》、《数字通信信号与系统》等。
电子与计算机工程结合电气工程和计算机科学,主要研究现代电子、自动控制、电力工程以及计算机技术等方面的基本知识和技能,进行现代电子系统的开发设计、工艺控制、智能设备的软硬件开发等。例如:工业设备控制系统的研发,自动门控制系统的设计,电脑等电子产品的电路设计等。
电子与计算机工程专业可以在IT类企业从事电子系统的开发设计、智能设备的软硬件开发、技术支持、软件测试、技术管理等工作,也可以在电子类企业从事电子技术、IC设计、工艺控制、电气工程等工作,还可以在政府、事业类单位从事电子信息系统的维护管理等工作。
开设院校有浙江大学、上海交通大学、中山大学、沈阳工业大学等等。
参考文献
计算机科学 VS 计算机工程,别再傻傻分不清 Computer Science vs. Computer Engineering: Key Differences[……]

READ MORE

「Intel 8086」- 汇编语言(学习笔记)

访问内存的方法
用于寻址的寄存器
在 8086 CPU 中,寄存器只有 bx si di dp 可以用在 […] 中进行内存寻址。另外,还可以使用立即数(idata)。
使用 […] 进行内存寻址的正确格式只有以下几种:

序号
标记
格式
段地址所在寄存器
示例

1
A
[bx]
ds
ds:[bx]

2
A
[bp]
ss
 

3
A
[si]
ds
 

4
A
[di]
ds
 

5
A
[idata]
ds
 

6
B
[bx+si]
ds
 

7
B
[bx+di]
ds
 

8
B
[bx+idata]
ds
 

9
B
[bp+si]
ss
 

10
B
[bp+di]
ss
 

11
B
[bp+idata]
ss
 

12
B
[si+idata]
ds
 

13
B
[di+idata]
ds
 

14
C
[bx+di+idata]
ds
 

15
C
[bx+si+idata]
ds
 

16
C
[bp+si+idata]
ss
 

17
C
[bp+di+idata]
ss
 [……]

READ MORE

「汇编语言」- 学习笔记

关于 x86 汇编
“简直是一团糟”,这个“一团糟”主要体现在以下方面: 1)汇编器非常多(MASM, NASM, gas, as86),指令可能相同,而语法截然不同; 2)因此,需要为不同的平台(汇编器)编写不同的汇编程序; 3)平台不同,生成的对象文件也不同; 4)在使用特定类库时,需要了解某些技术细节; 5)x86 处理器分为 32 位与 64 位,这其中又有很多不同;
机器指令,助记符,诸如 MOV、PUSH、POP、SHL、SAR 等等,是处理器厂商定义的,需要参考厂商的编程手册。 AMD Developer Guides, Manuals & ISA Documents ARM Architecture Reference Manual Intel 64 and IA-32 Architectures Software Developer Manuals Introduction to Intel Advanced Vector Extensions
汇编符号、操作符、指令,诸如 OFFSET ASSUME ENDS 等等,是由汇编器实现的,需要参考汇编器手册: MASM – Microsoft Macro Assembler reference
关于我们常说的”指令组成“、”汇编指令分类“: 1)汇编指令,机器码的助记符,具有对应的机器码; => 机器指令,诸如 MOV SUB INC DEC 等等,由汇编器解析,转成对应机器码 2)伪指令,由编译器执行,计算机不执行,没有对应的机器码; => 汇编符号,诸如 OFFSET ENDS 等等,由汇编器解析,协助汇编器处理机器指令 3)其他符号,如 + – * / 等,由编译器识别,没有对应的机器码; => 操作符号,诸如 OFFSET ENDS 等等,由汇编器解析,协助汇编器处理机器指令
“我们有相当多的汇编器可用”
Any x86-64 Linux assembler? Wikipedia/Comparison of assemblers
参考文献
x86 Assembly Language Programming Microsoft Macro Assembler reference[……]

READ MORE

「汇编语言 第 3 版 王爽」- 参考答案(学习笔记)

注意事项
1)本笔记内容整理自网络,感谢网友无私分享,我们也将注明引用地址 2)由于篇幅原因,本笔记不再复述原题,请参考原书(ISBN 978-7-302-33314-2)
实验环境
使用 Windows XP 实验会遇到其他问题,最后还是选择使用 DOSBox 环境。
汇编语言答案(王爽)
检测点 1.1
1)1个CPU的寻址能力为8KB,那么它的地址总线的宽度为 13 位。
2)1KB的存储器有 1024 个存储单元,存储单元的编号从 0 到 1023 。
3)1KB的存储器可以存储 8192(2^13)个bit, 1024个Byte。
4)1GB是 1073741824(2^30)个Byte、1MB是 1048576(2^20)个Byte、1KB是 1024(2^10)个Byte。
5)8080、8088、80296、80386的地址总线宽度分别为16根、20根、24根、32根,则它们的寻址能力分别为: 64(KB)、1(MB)、16(MB)、4(GB)。
6)8080、8088、8086、80286、80386的数据总线宽度分别为8根、8根、16根、16根、32根。则它们一次可以传送的数据为: 1(B)、1(B)、2(B)、2(B)、4(B)。
7)从内存中读取1024字节的数据,8086至少要读 512 次,80386至少要读 256 次。
8)在存储器中,数据和程序以 二进制 形式存放。
解题过程:
1)1KB=1024B,8KB=1024B*8=2^N,N=13。
2)存储器的容量是以字节为最小单位来计算的,1KB=1024B。
3)8Bit=1Byte,1024Byte=1KB(1KB=1024B=1024B*8Bit)。
4)1GB=1073741824B(即2^30)1MB=1048576B(即2^20)1KB=1024B(即2^10)。
5)一个CPU有N根地址线,则可以说这个CPU的地址总线的宽度为N。这样的CPU最多可以寻找2的N次方个内存单元。(一个内存单元=1Byte)。
6)8根数据总线一次可以传送8位二进制数据(即一个字节)。
7)8086的数据总线宽度为16根(即一次传送的数据为2B)1024B/2B=512,同理1024B/4B=256。
8)在存储器中指令和数据没有任何区别,都是二进制信息。
检测点 2.1
1)写出每条汇编指令执行后相关寄存器中的值。
mov ax,62627 AX=F4A3H
mov ah,31H AX=31A3H
mov al,23H AX=3123H
add ax,ax AX=6246H[……]

READ MORE

「CPU」- Central Processing Unit

处理器结构
从逻辑上可以划分成三个模块:控制单元、运算单元、存储单元。这三部分由处理器内部总线连接起来:

控制单元,整个处理器的指挥控制中心,由指令寄存器(IR,Instruction Register)、指令译码器(ID,Instruction Decoder)、操作控制器(OC,Operation Controller)等,对协调整个电脑有序工作极为重要。它根据用户预先编好的程序,依次从存储器中取出各条指令,放在指令寄存器中,通过指令译码(分析)确定应该进行什么操作,然后通过操作控制器,按确定的时序向相应的部件发出微操作控制信号。在操作控制器中,主要包括节拍脉冲发生器、控制矩阵、时钟脉冲发生器、复位电路、启停电路等控制逻辑。

运算单元,运算器的核心。可以执行算术运算(包括加减乘数等基本运算及其附加运算)和逻辑运算(包括移位、逻辑测试或两个值比较)。相对控制单元而言,运算器接受控制单元的命令而进行动作,即运算单元所进行的全部操作都是由控制单元发出的控制信号来指挥的,所以它是执行部件。

存储单元,包括CPU片内缓存和寄存器组,是在CPU中暂时存放数据的地方,里面保存着那些等待处理的数据,或已经处理过的数据,CPU访问寄存器所用的时间要比访问内存的时间短。采用寄存器,可以减少CPU访问内存的次数,从而提高了CPU的工作速度。但因为受到芯片面积和集成度所限,寄存器组的容量不可能很大。寄存器组可分为专用寄存器和通用寄存器。专用寄存器的作用是固定的,分别寄存相应的数据。而通用寄存器用途广泛并可由程序员规定其用途,通用寄存器的数目因微处理器而异。这个是我们以后要介绍这个重点,这里先提一下。

CPU FEATURES
看KVM的文档,出现了「CPU FEATURES」这个词,它指的是「指令集」,可以使用 lscpu | grep Flags 命令查看。
内核源码中列出了所有的「CPU FEATURES」:「arch/x86/include/asm/cpufeatures.h」
CPU MODELS
指的是CPU型号
参考文献
Wikipedia/Comparison of instruction set architectures What do the flags in /proc/cpuinfo mean?[……]

READ MORE

「CPU」- 概念术语

多处理器(Multiprocessor)
拥有多个处理器的计算机;
多核处理器(Multi-core processor)
CPU 的物理核与逻辑核_fzxwl 的博客-CSDN 博客_cpu 物理核和逻辑核 英特尔超线程技术_百度百科
单个处理器,拥有多个分离的物理核心,可以并行工作。但是,单个物理核心一次只能执行一个任务;
总核数 = 物理 CPU 个数 * 每个物理 CPU 的核数
物理核(physical core/processor) 可以看的到的,真实的 cpu 核,有独立的电路元件以及 L1,L2 缓存,可以独立地执行指令;
逻辑核(logical core/processor,LCPU) 在同个物理核内,逻辑层面的核。(比喻,像动画片一样,我们看到的“动画”,其实是一帧一帧静态的画面,24 帧/s 连起来就骗过了人类的眼睛,看起来像动起来一样。逻辑核也一样,物理核通过高速运算,让应用程序以为有两个 cpu 在运算);
超线程(Hyper-threading,HT): 1)英特尔还首次推出了一种处理器技术,用于改进并行计算,称为超线程。在超线程下,单个物理核心显示为操作系统的两个逻辑核心(但实际上,只有单个物理硬件组件); 2)超线程可以在一个逻辑核等待指令执行的间隔(等待从 cache 或内存中获取下一条指令),把时间片分配到另一个逻辑核。高速在这两个逻辑核之间切换,让应用程序感知不到这个间隔,误认为自己是独占了一个核; 3)单个 CPU 可有多个物理核。如果开启超线程,单个物理核可以分成 n 个逻辑核,n 为超线程的数量。总逻辑 CPU 数 = 物理 CPU 个数 * 每个物理 CPU 的核数 * 超线程数
频率(主频)
cpu 主频指的是单核的还是总共的_百度知道
CPU 主频是指单核心的频率,主频即 CPU 的时钟频率,计算机的操作在时钟信号的控制下分步执行,每个时钟信号周期完成一步操作,时钟频率的高低在很大程度上反映了 CPU 速度的快慢;
处理器的供电:4PIN vs. 8PIN
cpu 供电 4pin 和 8pin 有什么区别_百度知道 计算机主板cpu的电源接口类型,给力:主板CPU电源的4pin和8pin有什么区别?_weixin_39631350的博客-CSDN博客
电源是计算机稳定运行的前提;
CPU 供电有 4PIN 和 8PIN 之分,8pin 供电就是由两个 4pin 组成的;
它是 8 针,4 针还是 6 针(图形卡单独供电),它只有一个用途:为设备提供 12V 电源; 1)低端主板常用的4pin cpu电源接口 2)高端主板(例如ASUS B365M-Plus,Z370-A)常用的8pin cpu电源[……]

READ MORE

「CPU」- 常见问题

处理器,性能对比,天梯图
https://www.mydrivers.com/zhuanti/tianti/cpu/index.html
处理器正常温度
Safe CPU Temps: How Hot Should My CPU Be? What Temperature Should CPU Be And What is Normal Temperature?
不同处理器,正常温度也不同。
对于 Intel 处理器(参考值): 1)40 – 45,是在空闲情况下的温度; 2)85 – 95,是在满载情况下的温度;
所以,对于我们的 Intel 处理器,温度 85 是我们的警戒线。如果长时间超过这个问题,我们会考录机器的散热是否存在问题。
MHRD
CPU 的工作原理是什么?
是 Steam 上的游戏,让我们从最基础的 NAND 门开始,用代码描述出 CPU 电路结构,以理解 CPU 原理。[……]

READ MORE

「CPU」- Home-made

Homemade 16-Bit CPU/Minicomputer from 74HC Logic – Progress Vlog – YouTube
Turing Complete – Learn CPU architecture with puzzles https://store.steampowered.com/app/1444480/Turing_Complete/
通过 FPGA 制作 CPU,然后运行自制操作系统;[……]

READ MORE

「CPU」- Intel 80×86

参考文献
List of Intel microprocessors – Wikipedia[……]

READ MORE

「CPU」- Intel,处理器,概念,术语

问题描述
该笔记将记录:与 Intel 处理有关概念、术语,以及相关其他知识。
理解 x86, x64, i386, i686 概念
What does x86 mean?
从技术角度讲 x86 是指某个处理器家族及它们都使用的指令集。而实际上,它并没有说明任何东西关于数据大小的具体信息。
x86 最初是针对 16-bit 处理器的 16-bit 指令集(8086 与 8080 处理器),然后为 32-bit 处理器被扩展到 32-bit 指令集(80386 与 80846 处理器),现在为 64-bit 处理器扩展到 64-bit 指令集。以前使用 80×86 的形式来表示芯片型号中间变化的数值,x 代表 3、6、8 等数值,但是从某个地方开始前面的 80 被去掉,只剩下 x86 后缀。
都怪奔腾和它的后代改变处理器命名和销售的方式,尽管所有使用 Intel x86 指令集的新处理器仍然称兼容 x86、i386、i686(因为它们都使用原始 x86 指令集扩展)
x64 才是最奇怪的命名,x86 指令集的 64-bit 扩展名被称为 x86-64。后来被成为 AMD64(因为原先是 AMD 提出 64-bit 扩展)。英特尔许可 64-bit 指令集,并将其版本命名为 EM64T。使用它们的指令集和处理器仍然被是为 x86。
i386 => 80386, i686 => 80686
处理器历史摘录
List of Intel processors – Wikipedia
英特尔处理器历史,仅包含我们感兴趣的部分,完整历史可以查看 List of Intel processors – Wikipedia 页面。
1978 ⇒ 8086, The first x86 CPU
仅能工作于实模式(在后来出现保护模式(Protected Mode)时,才提出实模式(Real Mode)术语)
Address bus width: 20 bits | Addressable memory: 1 megabyte
Data bus width: 16 bits
1979 ⇒ 8088
Data bus width: 16 bits
1982 ⇒ 80186
1982 ⇒ 80188
1982 ⇒ 80286(过渡)
虽然是过渡产品,但首次提出 Protected Mode,在该模式下,段寄存器则被称为段选择器。
Address bus width: 24 bits,在理论上可以访问 224 即 16M 内存,依旧采用内存分段模式;
Data bus width: 16 bits,通用寄存器是 16-bit[……]

READ MORE

「CPU」- 操作模式

Real mode (Intel 8086)
Real mode,Real address mode,是 x86 兼容的处理器的操作模式。在该模式下的地址 总是 对应内存的实际位置。Real mode 的特征是 20-bit 分段内存地址空间(字节寻址,提供恰好 1MiB 可寻址内存)以及无限制的直接软件访问所有可寻址内存、I/O 地址、外设。Real mode 不支持内存保护、多任务、代码特权级别。
在 80286 引入 Protected mode 之前,Real mode 是 x86 处理器唯一可用模式;并且为了向后兼容,当重置时,所有 x86 处理器都以 Real mode 启动,尽管在启动系统时可以在其他系统上模拟 Real mode。
历史
80286 引入 Protected mode,允许硬件级别的内存保护,但是使用该新特征要求为 Protected mode 专门设计新的操作系统。由于 x86 微处理器的主要设计规范是完全向后兼容为所有之前 x86 芯片编写的软件,因此 80286 从 Real mode 启动 —— 即在关闭新的内存保护特性的模式下,因此可以运行为 8086 与 8088 编写的操作系统。截至 2018 年,当前 x86、x86-64 处理器可以启动 Real mode 操作系统,并且可以运行多数为之前 x86 芯片编写的软件。
PC BIOS 在 Real mode 中操作,DOS(比如 MS-DOS、DR-DOS 等等),早期 Windows 也运行在 Real mode 下。后来部分操作操作系统开始在某些地方使用 Protected mode,比如 Windows/386、Windows 3.0 系统。Windows 3.1 删除对 Real mode 支持,这是首个至少需要 80286 处理器的主流操作环境。但是前面这些都不算现代操作系统,Unix、Linux、OS/2、Windows NT 3.x 才算的上是现代操作系统,它们从启动时将处理器切入 Protect mode,并且不在返回 Real mode,持续使用 Protected mode 优势。64-bit 操作系统会使用 Real mode,但是只是为了进入 Long mode。
另外,80286 的 Protected mode 比较原始,现代操作系统运行在 80386 的 Protected mode(386 Protected mode)。
寻址能力
8086、8088、80186 具有 20-bit 寻址总线,但是 Intel 为处理器采用的特殊分段寻址方案实际产生具有 21 个有效位的有效地址。
8080 emulation mode (NEC V20/V30 only)
Prot[……]

READ MORE

「Intel 80×86」- Protected Mode(学习笔记)

进入保护模式的一般步骤
1)安装 GDT 信息,并加载(lgdt) 2)打开 A10 地址线(可选步骤) 3)关闭中断 4)设置 CR0/PE 位置,以进入保护模式 5)执行 JMP 跳转,以清空流水线
加载用户程序的方法(思路)
1)引导程序开始执行,加载并初始化内核程序,跳转内核程序执行

设置 GDT 信息,进入保护模式

2)内核程序开始执行,加载并初始化用户程序,跳转用户程序执行

设置内核 GDT 信息,跳转到内核执行

3)用户程序开始执行,完成用户任务,并返回到内核程序中,由内核继续执行[……]

READ MORE

「nil」- Real mode

内容简介[……]

READ MORE

「Intel 80×86」- GDT,GDTR,LDT,LDTR,IDT,IDTR,TSS,TR(学习笔记)

问题描述
在 Real Mode 下,程序通过 Segment : Offset 方式,可以访问任意内存地址。
这种做法并不好,多个程序之间会相互干扰,带来不可预料的后果。
解决方法
引入保护模式(Protected Mode)。在 Protected Mode 下,依旧使用 Segment : Offset 来访问内存。
但是,此时的 Segment 称为段选择器(Segment Selector),而不是段地址(Segment Address)。当然,它们都是保存在段寄存器中的数值,只是数据结构与解释方法不同。
段选择器(Segment Selector)的值指向在描述符表(Descriptor Table)中的某个描述符(Segment Descriptor)。
而描述符(Segment Descriptor)定义了实际内存段的基地址、段界限(Offset 不能超过该界限)、各种访问属性及权限。
当程序指令访问内存时,比如 MOV [DS:BX], 0x0H 指令,处理器通过 Segment Selector 找到 Segment Descriptor 后,处理器通过 Segment Descriptor 的信息找到内存段,来检查程序是否能够访问该段。
段描述符(Segment Descriptor)
段描述符(Segment Descriptor)有很多种,长度为 8B(或者其他长度),描述内存段的基地址、边界(段长度)、类型权限等等其他属性。
因为类型不同,所以结构不同。
描述符表(Descriptor Table)
所有的 Segment Descriptor 放在一起,形成 描述符表(Descriptor Table)。
因为 Segment Descriptor 有很多种,所以 Descriptor Table 也有很多种
我们也不知道为什么不使用”段描述符表“,而使用”描述符表“。
描述符表寄存器(Descriptor Table Register)
处理器从程序中得到 Segment Selector 后,需要知道 Segment Descriptor,以从中找到对应的 Segment Descriptor,而 Segment Descriptor 的位置保存在 描述符表寄存器(Descriptor Table Register)中。
因为 Descriptor Table 有很多种,所以 Descriptor Table Register 也有很多种。
全局描述符表(Global Descriptor Table)
全局描述符表(Global Descriptor Table),是一种描述符表,比较重[……]

READ MORE

「Intel 8086」- 中断(学习笔记)

什么是中断?
当 CPU 收到某种特殊信息后,不再继续执行向下,而是转去处理这种特殊信息,这就是 中断(Interrupt)。
这种特殊信息称之为中断信息。
CPU 如何检测到中断?
基本上,当 CPU 执行完一条指令之后,如果检测到标志寄存器的 IF 位为 1,则将产生单步中断。
中断类型
中断可以分为 内中断 与 外终端 两种。
内中断(来自 CPU 内部)
当 CPU 内部发生以下情况时,将产生内中断: 1)除法出错,比如溢出 2)单步执行 3)执行 INTO 指令 4)执行 INT 指令
外中断(来自 CPU 外部)
中断向量表(Interrupt Vector Table)
中断向量表:所有中断程序的入口地址的列表。
CPU 通过 8-bit 的中断类型码,到中断向量表中找到中断程序的入口地址。
对于 8086PC 机器: 1)中断向量表保存在内存中,从内存地址 零 处开始; 2)0000:0000-0000:03FF,总共有 1024 个单元; 3)单个表项占两个字,共计 4 字节,高位为 段地址,低位为 偏移地址;
参考文献
《汇编语言(第三版)王爽 著》[……]

READ MORE