自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(177)
  • 收藏
  • 关注

原创 两行代码告诉我今天是周几??

我现在想要输入一个日期,然后返回对应的日期是周几,如果是你,你会怎么解决,当然这应该难不倒你,但是如果限制了代码只能有两行,阁下又该如何应对?今天我们学习一个非常优雅的星期几计算算法,大名叫做:Tomohiko Sakamoto 算法直接上代码,看得懂的同学就不需要继续往下看了:intdow(inty,intm, int d){ y -= m<3; return(y +...

2024-05-07 15:30:24 300

原创 论文分享 | FAST'23 阿里云提出的针对SMR优化的存储引擎SMRSTORE

今天分享的一篇最近阅读的论文是FAST'23的SMRstore: A Storage Engine for Cloud Object Storage on HM-SMR Drives。https://www.usenix.org/conference/fast23/presentation/zhou这篇文章是由阿里巴巴公司完成的,在这篇文章中,团队针对SMR的特性提出了一种新的存储引擎SMRSTO...

2024-04-10 17:47:37 1075

原创 什么是SMR硬盘?

知识铺垫:SMR与CMR该部分主要参考知乎https://zhuanlan.zhihu.com/p/393369645SMR与CMR都属于HDD,即机械硬盘,机械硬盘之所以叫机械硬盘,就是因为它内部完全由机械结构制成。一块机械硬盘由磁盘面、马达和磁头构成,通常情况下这些结构都被密封在一个铁盒子里,防止其内部结构与外界接触。磁盘面上有很多小格,在机械硬盘工作时,磁头会悬浮在磁盘面上对磁盘中的小格中...

2024-04-10 17:47:37 795

原创 C++异常处理机制 try-catch-throw

我们所设计的函数在运行过程中出现异常是一件十分正常的事,有些异常是我们在设计时可以预见并且是可以进行恢复的,由于异常的发生往往比较底层,异常通常不能在当前层次的函数调用中就地恢复,而是需要上报到之前的函数调用中处理,为了实现这个目的,我们在C语言的实践中,往往可以设计一个错误码,将错误码层层上报,直到某层可以处理错误码。在C++中,语言特性为我们设计了一个新的实现路径,那就是C++的异常处理机制。...

2024-02-25 20:06:01 916

原创 C++高级特性 | Lambda表达式与智能指针

今天我们来学习两个C++中的高级特性,匿名函数Lambda表达式和便于对象生命周期管理的智能指针。Lambda表达式C++ 中的 Lambda 表达式是一种函数对象的匿名函数,它可以在需要函数的任何地方定义和使用,而无需显式地声明一个函数。Lambda 表达式的语法简洁灵活,使得代码更加清晰和易读。Lambda表达式的基本语法:[capture](parameters) -> return_...

2024-02-22 20:36:29 988

原创 数据结构 | 手写堆

今天我们来实现一个简单好用的数据结构,堆。要实现一个手写堆,需要实现它的三个功能,我们需要能初始化一个堆,能取出堆顶元素和将一个元素插入堆。在开始实现之前,我们先回顾一下堆的初始化、插入和删除过程。堆的定义① 堆中的每个结点最多有两个子节点。②结点的排列顺序垂直从上到下,水平从左到右。③子节点key必须大于父母结点。堆的数据结构根据堆的定义,堆是一棵完全二叉树,既然是一棵完全二叉树,就可以采用...

2023-12-18 19:38:55 139 1

原创 数据结构 | Log-Structured Merge Tree (LSM Tree)

今天介绍LSM Tree这个数据结构,严格意义上来说,他并不像他的名字一样是一棵树型的数据结构,而更多是一种设计思想。LSM Tree最先在1996年被提出,后来被广泛运用于现代NoSQL(非关系型数据库)系统中,包括BigTable, Dynamo, HBase, Cassandra, LevelDB, RocksDB, and AsterixDB.LSM Tree主要是瞄准了IO操作中,顺序写...

2023-12-14 01:12:52 251

原创 kernel | 不想老是编译内核?sysfs和debugfs了解一下

编译内核是一件让大家都抗拒的事情,因为编译一次内核需要的时间成本比较漫长,而且如果每次代码的微小改动或者想要额外调用某一个函数执行某一个动作就要不断的编译内核的话,就相当于CPU大量的时间都用在了idle,开发效率将会是相当的低。我们总是希望自己能够掌握自己想要调试的程序的一些状态从而来判断程序有没有正常的工作。在简单的场景下,我们仅需要使用printf大法,就可以打印出程序的轨迹,但是在复杂场景...

2023-11-29 22:15:31 455

原创 C语言一个奇奇怪怪的小细节(定制初始化中的一个坑)

在今天写C代码的过程中,发现了一个奇怪的现象:假设我们有如下数据结构:struct AddressMapping{ u64 lba; union{ u64 addr; u64 addrPage; struct ScatterIter sgiter; }; u64 size;}__attribute__ ((__p...

2023-11-16 17:55:34 136

原创 C/C++语言中的restrict关键字

在C语言中,restrict关键字用于修饰指针(C99标准)。通过加上restrict关键字,编程者可提示编译器:在该指针的生命周期内,其指向的对象不会被别的指针所引用。使用此关键字,将允许编译器预知多个指针之间的相互独立性,从而允许编译器做更加激进的优化。例如[1]:intadd(int*a,int*b){*a = 10;*b = 12;return *a + *b;...

2023-11-08 15:16:38 415

原创 论文分享 | 现代数据中心场景下的分离式RAID

今天分享的这篇文章发表于ASPLOS 2023,标题是Disaggregated RAID Storage in Modern Datacenters,完成单位是北京大学。https://doi.org/10.1145/3582016.3582027 (文末阅读原文可以跳转)摘要RAID(独立磁盘的冗余阵列)几十年来已被广泛采用,因为它提供了超出了单个磁盘可以提供的吞吐量和冗余。今天,由快速数据中...

2023-10-26 17:01:41 157

原创 内核IO栈 | 反弹缓冲区、bio切分、完整性保护和蓄流

line17 ※1 反弹缓冲区blk_queue_bounce函数的作用是,尝试创建一个反弹缓冲区,通常是在bio给定的内存区域在外围设备不可达(例如高端内存上执行DMA)的地址时才需要去创建这么一个特殊的区域,以确保内存区域是外围设备可达的,这是bio能够完成的必要条件。static inline void blk_queue_bounce(struct request_queue *q, st...

2023-10-17 16:20:11 468

原创 内核IO栈 | IO缓冲区的向下传递过程

最近遇到个这么一个事,查阅SCSI手册,对于READ(10)命令,似乎在采用DMA的情况下,下发的SCSI命令中,并没有内存空间的地址和长度:也就是说,单纯从这一个命令中,我们并不知道将数据从硬盘的LBA+size传输到内存的哪个位置。这似乎和我一开始对整个IO栈的理解是不一样的,这一部分内容的缺省直觉告诉我,SCSI层的底层驱动下发到设备的并不仅仅是一个简单的标准SCSI命令,而是另有其他的东西...

2023-10-17 16:20:11 426

原创 数据结构 | Radix Tree 树

什么是基数树?基数树是一种多叉搜索树,数据位于叶子节点上,每一个节点有固定的2^n个子节点(n为划分的基大小,当n为1时,为二叉树)。什么为划分的基?以一个64位的长整型为例,我们可以将64位的长整数切分为8位一组、4位一组、2位一组甚至1位一组等:基数树的搜索方法是?基数树的搜索方法是将索引的数据切片为若干小段(基),然后一小段一小段地向下查找,在有限的树高度内,一定能完成查找。以上图数据按照8...

2023-07-30 12:26:03 439

原创 C语言中的宏

宏定义又称为宏替换,简称“宏”,在C语言预处理阶段被处理,编译器会根据宏定义进行文本替换。这样做的好处有许多,它可以为程序员在编程时提供方便,并能在一定程度上提高程序的运行效率。本文将通过一部分场景,来学习一些和宏相关的知识。#define采用宏定义一些常用常量,避免在代码中出现magic number:#define PI 3.1415926#define ERROR -1#define N...

2023-07-11 21:22:56 226

原创 数据结构 | 红黑树

在学习红黑树之前,大伙先问问自己,B树、平衡二叉查找树AVL和二叉排序树是啥还记得么记不得的朋友可以跳转此处,先复习一下B树、二叉排序树和平衡二叉查找树是啥。今天我们将用一种我自己研究的新鲜方法,学习红黑树。好,看到这里,我们假设我们心里已经“有B树”,知道了B树、二叉排序树和AVL是啥。那么,有没有一种杂糅的办法,将一棵B树改造成一棵二叉排序树呢?可以采用分裂的办法:于是,依葫芦画瓢,我们将一棵...

2023-04-13 22:35:11 61

原创 文件系统 | 以F2FS为具体操作系统的数据写流程

在前面的学习中,我们已经知道了一个文件的打开和读写时的系统调用过程,但是它们都在VFS层及之前,今天我们尝试以F2FS为具体操作系统,观察它的写入过程并着重观察F2FS冷热分流在其中的作用。这篇文章会比较长。数据写流程整体概览:首先我们要明确的是,在调用了write接口后,write的内容并不会一下子啪的一下就到磁盘上,而是通过操作系统中熟悉的脏页回写机制冲刷到磁盘上(见附推分享),所以,在wri...

2023-04-12 18:48:11 1128

原创 文件系统 | 系统调用之读写文件

打开文件的最基本的目的是为了对文件进行访问,而访问中最基本的操作是读和写。文件的内容被保存在磁盘块,但是这些磁盘块极有可能是不连续的而且往往是动态变化的。而访问文件时我们往往又需要将文件看作一个连续的字节流,要解决这样的矛盾,核心在于地址空间(Address Space)的引入。地址空间的目的就是将其属主对象在磁盘或其他介质中的(可能不连续的)数据以页面为单位连续地呈现出来。根据需要,这些页面可以...

2023-04-10 21:08:35 529

原创 TALK | 将博客搬至CSDN

在我几乎对公众号没有进行宣传的情况下,随着文章逐渐增多以及比较长的曝光时间,公众号还是在各位口口相传之下,达到了540位关注,目前的关注增长速度已达到每两个月100人,原创文章数目达到144篇,公众号内容成为了对我而言十分宝贵的一种知识财富。但随之带来了几个问题,首先,鸡蛋不能放在一个篮子里,由于文章越来越多,账号也越来越珍贵,倘若某一天,微信公众号没了(啪的一下就没了),那我这几年的心血直接白给...

2023-04-09 18:28:26 39

原创 文件系统 | 系统调用之打开文件

我至今都忘不了,曾经有一次,我在打开一个文件时,最终得到的是一个int类型的数字,一个小小的int类型,竟然能描述一个文件?这让我感到十分奇怪。直到对计算机存储的不断了解,我才知道返回的int类型是一个文件句柄。总结(太长不看)打开文件操作的关键在于,分配一个文件描述符file,正确设置f_mapping文件地址空间和f_op文件操作表,在打开文件操作表中找到一个存放它的文件句柄。这样,以后对文件...

2023-04-09 18:28:26 520

原创 C语言__attribute__的运用

在阅读内核源码时,常常可以看到类似于这样子的写法:static char envval[256] __attribute__((aligned(8)));即,在某一个结构体完成定义后,跟上一个__attribute__(xxx),这是GNU C的一个特色机制,使用__attribute__可以用来设置函数属性、变量属性和类型属性。__attribute__的书写特征是在attribute前后都有两...

2023-04-07 15:43:17 1179

原创 Linux | SCSI子系统概述和UFS在其中的位置

SCSI分层Linux SCSI子系统和其他子系统一样,也是一种分层的架构。共分为三层,最底下是低层,代表适用于SCSI的物理接口的实际驱动器,例如各个厂商为设备特定的主机适配器(也被称为主机总线适配器,Host Bus Adapter HBA)开发的驱动。低层驱动主要作用是发现连接到主线适配器上的SCSI设备,在内存中为它们建立好数据结构,并提供消息传递接口,将SCSI命令的接收与发送解释为主机...

2023-03-23 11:50:42 1451

原创 Linux | 一些和内存管理有关的小知识

GFP Flags进行内核编程时,往往会时不时看到 “GFP_KERNEL” 这样的东西,这些东西是什么呢,一起来了解一下。它们实际上被叫做 GFP flags,GFP其实是GetFreePage的缩写,被广泛应用在整个linux系统中,用来指出内存页应该怎样被分配,并不是所有的GFP flag都被所有的内存分配函数所支持,多数用户通常会直接使用GFP_KERNEL,因此很多时候我们往往看到的是...

2023-03-22 15:15:55 384

原创 文件系统 | 虚拟文件系统VFS

概述在文件系统之下,我们看到的磁盘设备是一组线性排列的磁盘块,可以访问其中的任意磁盘块,可以独立地读写磁盘块,如果在磁盘块中写入数据,将被记录下来,并在读操作中返回。文件系统是存储和组织文件(即一系列相关的数据),以便可以方便地进行查找和访问的一种机制,我们要能优雅地访问磁盘上的数据就得用到文件系统。不同的文件系统有不同的文件存储和组织方式。Linux设计人员很早就注意到了如何使Linux支持不同...

2023-03-13 14:15:59 354

原创 论文精读 | ZNS+:支持存储器内区块压缩的高级ZNS接口

论文标题:Advanced Zoned Namespace Interface for Supporting In-Storage ZoneCompaction论文地址:http://nyx.skku.ac.kr/?page_id=2808本系列是对论文的要点笔记。这篇文章针对当前日志文件系统LFS在段压缩方面的高消耗问题,提出了ZNS+以及其对应的文件系统技术,主机可以将数据的复制行为下放到S...

2023-02-22 01:06:17 415

原创 Linux kernel | scsi层是如何处理zone相关request的

上文中,我们将提交了submit_bio后的流程进行了分析,经过梳理之后,一个submit_bio在经过层层转化,最后进入到硬件派发队列hctx时,会调用硬件绑定的驱动所提供的queue_rq函数,这个函数是每一个硬件派发队列对应驱动都必须提供的。我们之前所研究的virtio部分是挂在pci总线上面的,然而在多数情况下,硬盘是通过scsi子系统被发现并管理的,磁盘驱动为scsi子系统中的一种高级驱...

2023-02-11 16:37:26 379

原创 Linux kernel | 块IO子系统请求处理过程、multi-queue框架、请求合并处理blk_plug

Linux 通用块层提供给上层的接口函数是submit_bio。上层在构造好bio请求之后,调用该接口提交给Linux通用块层处理。上层向块io子系统提交请求我们首先从submit_bio函数入手://common/block/blk-core.c:10blk_qc_t submit_bio(struct bio *bio){ if (blkcg_punt_bio_submit(bio))...

2023-02-07 17:50:29 1082 2

转载 【红包封面】祝大家新年快乐!

The sound of firecrackers isdispelled in one year,and the springbreeze warms Tusu新年快楽2022文章统计今年一共完成了49篇文章的发表文字总量超过20万粉丝总量达到了430人感谢每一位关注由于比较懒现在才设计出来今年的红包封面一共有500个~祝大家兔年快乐BUG退散新年快乐设计寓意:一只由z-coding和二进制...

2023-01-26 15:51:04 46

转载 翻译 | Zoned Storage Devices

本文是此网页的翻译加理解,为了理解和分享Zoned存储设备的设计原则:Zoned Storage Devices Overview | Zoned Storagehttps://zonedstorage.io/docs/introduction/zoned-storage本文中对于zoned storage我译作区块存储,也可以译作分区存储。如有翻译错误欢迎私信联系。Zoned 存储设备zoned...

2022-12-15 19:46:42 200

原创 实现一个简单的邮箱密码登录账号体系

眼瞅着为大家完成“自动化”功能的华为云服务器还有50天就要过期了,这一个成功运行了400多天的项目也就有要升级的必要了,当然,既然叫升级,那肯定不是简简单单的迁移代码那么简单,而是要对功能进行一个比较全面的升级。结合自己2个月在字节跳动里实习学到的一些东西,本次升级的目标是:提供用户功能。用户可以使用邮箱+密码注册,可以使用邮箱找回,登录后继续使用其他服务,使用cookie实现一个简单的登录态。后...

2022-12-13 00:57:50 166

原创 Linux Kernel | Device Mapper 模块(2)数据结构

书接上回,本篇来分析Device Mapper的各个数据结构以及它们之间的关系。首先给出一图:这个图便较为详尽地描述了dm各个数据结构间的联系,我们可以发现与dm相关的数据结构有dm_table,dm_target,dm_dev。再介绍它们之前,我们再回看一下gendisk结构:///common/include/linux/genhd.h:121struct gendisk { /* ma...

2022-12-04 18:57:00 338

原创 Linux Kernel | Device Mapper 模块(1)

块IO子系统整体有下图所示的架构,文件系统层向block层下发bio后,最终会转换为块设备驱动层的request执行,因此,要搞清楚设备是如何最终被操作的,就需要去弄清楚块设备驱动层的一些东西,咱们使用的Android虚拟机正好就使用了device mapper这一个块设备驱动,因此为了Android项目继续推进的需要,需要来学习一下这一部分的知识。同Mult-Disk模块一样,Device Ma...

2022-12-01 23:53:51 347

原创 Github 不小心上传敏感信息的后果......

今天有同学给我反映自动化注册的验证码收不到了,于是我就打开电脑准备去de这个bug,已知在昨天还是可以发验证码邮件的,今天咋就不行了嘞。于是我登上了发信邮箱,发现了如此震撼的一幕:再看看发件箱:发现在昨天两个小时内这个邮箱像是抽风了似的发了近1000封邮件,且地址几乎都是境外地址。发信内容是广告:这啥文我也看不懂,翻译过来就是:那么差不多就可以定性了,我的邮箱账号和SMTP的密码泄露了,QQ邮箱为...

2022-11-25 18:33:34 116

原创 Android Kernel | virtio_blk 驱动分析

想要写出一个驱动,最好的办法是先从一个已经可以正常运行的驱动看看别人是怎么写的,所以这篇文章记录以下Android内核里目前挂载data分区的设备驱动,virtio_blk驱动究竟是怎样运作起来的。若无特殊标注,代码可能位于:common/drivers/block/virtio_blk.c如果不在此路径,请搜索。首先找到驱动的入口函数,也就是__init标记的初始化函数:static int _...

2022-11-11 20:19:13 208

原创 Android kernel | PCI总线的冰山一角

在完成上一篇data分区的来龙去脉之后,我准备尝试将data分区对应的块设备重新初始化为zoned设备,这件事情听起来是一件事,做起来却是许许多多件事,难免让刚刚接触的我一头雾水。从上一篇文章中我们知道,在virtio_bus这个总线类型上,当设备和驱动通过id_table完成匹配之后,会去执行相应的初始化函数,也就是这个函数:static int virtio_dev_probe(struct ...

2022-11-04 03:03:32 216

原创 Android | 打开内核的ZONED相关选项踩坑记

作为一名小白,要打开区区两个内核配置相关的编译选项,成功编译,打开并进入模拟器,看起来是一件事,其实是三件事,每一件事都花费了不少时间,这篇文章尝试总结一些方法论。打开内核相关的编译选项要打开内核相关的编译选项,我们首先得知道它究竟使用到了哪一个,因为整个Android代码里面,为各种架构,各种版本设计的编译选项一抓一大把,改哪里,是第一个问题。Android内核代码使用了bazel这个编译工具进...

2022-10-29 20:42:57 385

原创 Android Kernel | 在模拟器中的/data分区的来龙去脉

这篇文章用来记录/data分区在模拟器中是如何被初始化的。首先我们需要知道/data的挂载信息,查看fstab挂载表:# Android fstab file.#<src> <mnt_point> <type> <mnt_flags a...

2022-10-23 19:31:09 215

原创 文件系统 | 浅浅学习一下F2FS文件系统

F2FS全称为Flash Friendly File System,是专门为闪存设备设计的一个日志追加型文件系统(Append Logging File System)。相比于传统的日志型文件系统,F2FS在wandering tree和gc的高时间开销等问题上有一定的改进和优化。写了这么一段,其中就有了若干个奇奇怪怪的名词,我们先来逐个解释一下:日志型文件系统:参考知乎:日志型文件系统 - 原理...

2022-10-20 01:20:58 1531

原创 Android | AOSP是怎么处理内核发过来的Uevent的?

经过前面几天的学习,我们已经知道了,一块磁盘设备被发现后,内核完成注册可以使用之后,会以uevent的形式通知用户空间,使得用户空间也能做好准备,正确地使用设备。在Android系统中,Android kernel发出的uevent将在AOSP中被处理,我们今天来分析这个过程。uevent处理相关文件、头文件均在这个路径:system/core/init/在ueventd.cpp这个文件中,包含了...

2022-10-15 18:59:28 302

原创 Linux | Linux 驱动模型(1)

Linux 核心开发团队在开发2.5内核的过程中,引入了Linux驱动模型(Linux Driver Model),有时也被称为Linux设备模型(Linux Device Model),主要的目的是解决之前版本存在的以下问题:没有一种统一的机制表达驱动和设备之间的关系;没有通用的热插拔机制;没有通用的电源管理机制;procfs文件系统过度混乱,包含了许多不是进程的信息。Linux内核基于kobj...

2022-10-14 22:26:08 148

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除