Dig in Device Mapper Framework
本文的目的由于Device Mapper框架的相关文章真的太少了,就想从项目来进行学习,深入了解DM框架的底层原理。收集了GitHub上前20页,有关Device-Mapper target的repos。从简单到复杂,依次进行深入地学习与分析。
1,device-mapper整体比较简单,基本就是最简单的device mapper壳子,dm_template遇到非零bio就原地映射,学会了一个函数和一个宏:
static inline void bio_set_dev(struct bio *bio, struct block_device *bdev)
{
bio_clear_flag(bio, BIO_REMAPPED);
if (bio->bi_bdev != bdev)
bio_clear_flag(bio, BIO_THROTTLED);
bio->bi_bdev = bdev;
bio_associate_blkg(bio);
}
<!--0-->
这个宏通常用在"\_map"函数中,mapped ...
浅尝golang
Go在vscode中的配置以及运行通过参考Go安装中(1)(2),以及注意基本能够完成配置。
go的运行可以通过go run xxx.go来简单地完成。
go run命令的相关注意:
可以在go run后面追加命令行参数,这部分参数会作为代码可以接受的命令行输入提供给程序。
该命令会编译源码,并且直接执行源码的 main() 函数,不会在当前目录留下可执行文件,可执行文件被放在临时文件中被执行。
go run不能使用go run+包的方式进行编译,如需要快速编译,可以用下面步骤来代替:
121,使用go build生成可执行文件。2,运行可执行文件。
Go语法速记基础包、变量和函数包
每个Go程序都是由包构成的。程序从main包开始运行。
能够通过import导入外部包,可以单独导入,也能以圆括号()的方式进行分组导入。按照规定,包名与导入路径的最后一个元素一致。例如,“math/rand”包中的源码均以package rand语句开始。以一个程序为例子:
12345678910111213package mainimport ( "fmt" "math/r ...
C++ primer(第五版) 要点记录
这段时间又刷了一遍C++ Primer (第五版),把之前尚未完全理解以及重要内容记录在本文中。
一些概要
C++之所以脱离C而存在,还是因为其强大的抽象能力。C++同时支持4中不同的编程风格:C风格、基于对象、面向对象和泛型。
利用无符号数来写循环,很可能不经意间就会出现死循环。
C++基础
区分初始化和赋值,尤其是用“=”号来进行初始化的情况。
初始化:
C++新标准中,用花括号的形式进行“列表初始化”得到了全面应用。但当用于内置变量时,这种初始化有一个重要特点:如果使用列表初始化,且初始值存在丢失信息的风险,则编译器将报错:
123long double ld = 3.1415926536;int a{ld}, b={ld}; // 错误:存在信息丢失的风险,double->intint c(ld), d=ld; // 正确:因为用非列表初始化的形式进行初始化
若定义变量时没有指定初值,将被默认初始化,变量被赋予“默认值”:定义于任何函数体之外的变量被初始化为0,而定义在函数体内部的内置 ...
d3.js学习内容
由于想对IMR磁道读写过程进行可视化,以丰富实验内容,最近一段时间在调研并学习d3.js来实现快速的可视化。这篇博客就记录一下学习过程中的一些重点内容,方便编码过程中的查阅以及以后有需要时可以很快捡起来。
D3:Data-Driven Documents
参考资料
https://d3js.org/ (官方网站,包括文档、样例)
https://developer.mozilla.org/zh-CN/docs/Web/SVG/Attribute (SVG属性表)
https://github.com/d3/d3/wiki/Gallery (官方样例的仓库)
https://observablehq.com/@d3/gallery (官方样例的仓库)
https://github.com/xswei/d3js_doc(d3.js资源汇总,包括示例、书籍、API文档等)
运行环境搭建简易Web开发环境,例如 python Flask + d3.js
重点内容d3.js介绍对于d3.js来说,重要的HTML标签主要有两个:
<script> : D3.js的编程主要 ...
【块设备】通用块层 struct bio 详解
BIO发展历程linux kernel 2.4 中的块层是围绕缓冲区头数据结构组织的。 然而,缓冲头的限制早已明确。 当底层缓冲区头结构强制每个 I/O 请求拆分为 512 字节的块时,很难创建真正高性能的块 I/O 子系统。 因此,linux kernel 2.5 “待办事项”列表中的第一项是创建一种方法来表示支持更高性能和更大灵活性的块 I/O 请求。 结果是 BIO 结构。
BIO基本原理bio结构体是内核中块I/O的基本容器,定义在<linux/bio.h>中。该结构将正在活动的块I/O操作表示为段列表,段是内存中连续的缓冲区块(请注意,不同段不一定是连续的),通过允许以块的形式描述缓冲区,bio 结构为内核提供了从内存中的多个位置执行单个缓冲区的块 I/O 操作的能力。
bio结构体中包含了大量棘手的细节。但是,其结构的核心并没有那么复杂,bio的核心结构如下图所示:
包含指向bio_vec结构数组的指针bi_io_vec。该数组表示构成此I/O请求的段(可能有多个)。而索引bi_idx指出了bi_io_vec数组的偏移量。
bio_vec结构体本身的定义比较 ...
小新pro14更新windows后的问题-关机后自动重启
记录一下昨晚的可怕事件。
结束了2小时的愉快学习时光后,看见任务栏提示windows有更新,于是随手点了一个重启更新,然后准备去洗澡。就在这时,电脑的风扇呼呼大作,我听着有点奇怪,就等着它更新完再去洗澡。
更新完成,正常开机了。
可是!当我把自己帅气的脸庞凑到屏幕前进行人脸解锁时,却说“当前pin不可用”,就是无法进行人脸解锁了。在网上搜索一番,轻松地解决了:先删除原来的pin,再重新设置一次。
自信关机。
然而,更可怕的事情来了,关机之后,1s左右,它又自动重启了。开始还以为自己点关机点成了重启,反复试了几次,发现确实是更新windows更出毛病来了。
现在网上查了一些方案,检查BIOS、安全模式启动、排查启动项。这些都试过了,却解决不了。有点绝望。随后找到联想人工客服,希望专业的技术人员能够帮忙解答。
排队等待了几分钟后,我将问题告诉了客服,客服首先让我重装显卡驱动,我觉得好像没什么相关性,但是试了一下,果然没用;接着,客服就直接甩来一句,”系统问题,建议重装系统“。我问了一句:”问题这么严重吗?!“,他说:”是的“。便匆匆结束了对话。
我不甘心更新一个windows就大费周章地 ...
Linux高性能服务器编程
致自己:朝着心中的目标努力奋斗!
Linux系统编程基础Linux开发环境的配置
Linux虚拟机
XShell,Xftp连接软件
VS Code远程代码连接
安装Ubuntu并安装openssh-server、net-tools:
123sudo apt install openssh-serversudo apt install net-toolsifconfig # 查看ip地址
VS Code安装插件C/C++、Remote Development,配置~/.ssh/config:
123Host Ubuntu18-webserver HostName 192.168.141.189 User zzmine
刷新一下,可以看到远程ssh连接了,在窗口中打开连接,选择Linux->continue然后输入密码就可以建立连接了。
GCC(GUN Compiler Collection)GCC是由GNU开发的编程语言编译器,GNU编译器套件包括C、C++、Java、Go等。GCC支持C的许多“方言”,也可以区别不同的C语言标准。例如,使用 ...