自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(102)
  • 问答 (1)
  • 收藏
  • 关注

原创 解决基于kvm的win10虚拟机只识别2个cpu的问题

在使用kvm+qemu创建win10虚拟机的时候,发现尽管我在virt manager里面指定了72个vcpu,但是win10里面只识别2个cpu核心的现象。由于我宿主机有2个cpu,每个是18核,每个核心有2个线程。初步猜测是因为win10对cpu拓扑结构检测的代码有点问题的原因。如果你的机器是1个cpu的,那么套接字(其实就是插槽)写1,然后核心数就是你要分配给cpu的核心数。解决基于kvm的win10虚拟机只识别2个cpu的问题 – 龙进的博客。欢迎关注我的公众号“灯珑”,让我们一起了解更多的事物~

2023-05-19 11:37:31 1773

原创 使用Rust构建一个kvm用户空间实例

最近在学习虚拟化相关的内容,想着使用Rust构建一个最小的kvm用户空间实例。也就是直接调用kvm的api,然后创建虚拟机。网络上关于kvm的内容大部分是使用libvirt的,然后kvm用户空间实例也是使用C编写的。因此想着使用Rust写一个简单的。

2023-05-19 11:31:01 412 1

原创 RAII技术:在Rust中实现带有守卫的自旋锁,支持一定程度上的编译期并发安全检查

本文介绍了一种使用了RAII技术的自旋锁,配合Rust的生命周期及所有权机制,能够在减少代码量的同时,很好的解决自旋锁的“忘记放锁”、“双重释放”、“未加锁就访问”的并发安全问题。并且这种自旋锁能够支持编译期的检查,任何不符合以上安全要求的代码,将无法通过编译。

2023-01-16 14:51:55 516

原创 异地旁路组网:zerotier

有这么一个需求:需要远程访问内网的nas。然后现成的解决方案有蒲公英这个方案,但是个人版的话限了只能3个设备,因此找了半天,最后选择了功能类似的zerotier.

2023-01-04 13:21:07 3330

原创 6步速通:修复损坏的word文件

前两天,老师找到我,想让我帮忙修复一个打不开的docx文档。症状大概是这样:打开文件的时候花了较长时间,并且显示了乱码,并且老师使用WPS自带的文档修复功能也无法修复。遇到这个情况,到底怎么办呢?

2023-01-04 13:17:22 795

原创 一个在关键路径上面隐藏了11个月的BUG:DragonOS进程切换查错

DragonOS是一个从0开始研发内核及用户态环境的,独立自主的,面向服务器领域的开源操作系统,提供Linux兼容性。GitHub - fslongjin/DragonOS: 一个64位的操作系统。加一行printk(“”);,代码就能正常运行读写几个无关的变量,代码就能跑了加一层函数调用,把某个函数wrap一下,代码就能运行10月份的时候,我和同学调试IDR的源代码,有个单元测试用例就是无法通过。并且,出错的位置总是不相同。将测试用例的数据规模减小之后,就不会报错。

2023-01-04 13:12:09 358

原创 【干货】教你在十分钟内编译一个Linux内核,并在虚拟机里运行!

这篇文章将会简单的介绍如何在Linux系统上面,编译一个5.19的内核,然后在QEMU虚拟机中运行。

2022-11-19 13:54:40 3428

原创 简单实现posix中规定的memcmp函数

memcmp函数的功能非常简单,传入两个指针s1和s2,以及要比较的字节大小n,比较这两块内存的值的差异(逐字节比较,把每个字节都翻译为unsigned char)。当比较第i位时,如果相等,则返回0, 否则返回不相等的字节的差值(s1[i]-s2[i]).

2022-10-25 23:06:34 311

原创 高效的无锁引用计数结构:lockref

lockref是将自旋锁与引用计数变量融合在连续、对齐的8字节内的一种技术。

2022-10-07 11:27:06 370

原创 C语言实现编译期断言

编译期断言是一种对编译期能计算出来的常量的值进行断言,从而避免代码中引入一些不合理的值。

2022-10-06 16:05:55 251

原创 GCC禁用对某个类型的变量的“基于类型别名的分析”——may_alias

那么,在编译的时候,GCC会抛出警告信息,提示我们这里的存在“双关引用”(原文是dereferencing type-punned pointer)。如果我们启用了-fstrict-aliasing或者O2优化,编译过程会被中止,编译器会认为代码出现了错误。对于写操作系统过程中的一些特殊场景来说,我们要求编译器不要检查指针的类型的检查。那么,我们就可以使用may_alias这个属性,配合宏的使用,定义一个新的类型short_a,使得编译器认为这个类型可以指代其他的任何类型。

2022-10-04 15:55:52 535 1

原创 内核线程的fork与普通的fork的区别

用户程序调用fork()和内核下调用fork(),背后的逻辑是不一样的。咱平时如果没有真的去写操作系统的话,应该不会意识到这个问题。

2022-08-02 12:48:03 353

原创 解决python封装Logging模块后,log位置显示错误的问题

其实本文所述的问题并不是特别的复杂,只是需要熟悉计算机的函数调用的原理调用函数时,将当前函数的局部变量和返回地址压栈,函数return的时候,将ret_addr填写到指令指针寄存器之中。当你对这一基本原理熟悉之后,就能很顺理成章的解决本文所述的问题了~解决python封装Logging模块后,log位置显示错误的问题||龙进的博客httpsp=1484欢迎关注我的公众号“灯珑”,让我们一起了解更多的事物...

2022-07-15 18:27:59 2096 2

原创 Linux下,使用nm命令输出可执行文件的符号表

可执行文件的符号表(symbol table)记录了某个可执行文件中的函数名、全局变量、宏定义等符号信息,这些信息对于我们调试十分重要。目前,我正在DragonOS上开发内核栈traceback程序,因此需要导出内核文件的符号表.这个时候就需要用到Linux的nm命令。nm命令属于GNU binutils的功能,能够输出可执行文件的符号表。它的用法是这样的:看了上面的帮助信息,人都晕了。这里需要用到-n选项,就以DragonOS的内核文件为例,我们输出来看看:为了便于查看,上面的命令把nm的输出

2022-06-22 19:12:20 1820 1

原创 不容置疑,这是一个绝对精心制作的项目

《发布一款精心制作的软件》😜😜😜这个项目叫做:《这个项目有N个stars》你只需要在github上面给项目点赞,项目名称就会自己改变,非常的智🤪🤪🤪🤪🤪链接:https://github.com/fslongjin/This-repo-has-2-stars...

2022-06-14 19:20:24 96

原创 快速入门CherryPy(1)

CherryPy是一个轻量级的python网络框架,用来创建网络应用。比如快速实现api接口、做网站后端这样。感觉和flask差不多。最简单的一个例子下面这段代码通过创建一个类“HelloWorld”,定义了一个cherryPy的应用,然后通过quickstart方法启动这个应用import cherrypyclass HelloWorld(object): @cherrypy.expose def index(self): return "Hello..

2022-05-22 12:58:34 1633

原创 视频文件太大?使用FFmpeg来无损压缩它

咱们平时如果经常拍视频的话,都会遇到一个困境:视频文件太大了,存储的时候需要占用很多的空间。如果直接使用视频压缩工具来压缩码率的话,又会担心损失了视频的画质,这该怎么办呢?这个时候,我们就可以使用ffmpeg的hevc编码功能来实现无损的压缩!什么是FFmpeg?FFmpeg是业内有名的开源图像视频处理程序。它被广泛的使用,在许多视频剪辑软件、图像处理软件中,都使用的FFmpeg,还有比如OBS这样的导播软件里面也使用了FFmpeg啥是HEVC编码?咱们常用的MP4格式中,一般使用的

2022-05-22 12:55:09 28953 7

原创 openGrok手动更新索引的方法

有时候openGrok在导入新项目代码之后,长时间都不建立索引,这时候的解决方法就是手动启动索引构建器。如果是docker容器部署的,就先进入到docker容器内,再执行下面的命令。如果是直接在操作系统中安装的,就直接运行下面的命令。opengrok-indexer \ -J=-Djava.util.logging.config.file=/opengrok/etc/logging.properties \ -a /opengrok/lib/opengrok.jar -- \

2022-04-29 12:19:20 3017

原创 实现一个简单的UART驱动程序

在DragonOS中,为了方便调试,实现了一个简单的UART驱动程序。https://github.com/fslongjin/DragonOS/tree/master/kernel/driver/uarthttps://github.com/fslongjin/DragonOS/tree/master/kernel/driver/uart原理不难,就简单讲讲吧。uart驱动程序工作的原理就是往指定的io端口写入数据,每次传送8个bit。其中,io端口与com口的对应关系如下:COM端口

2022-04-23 20:42:53 738

原创 DragonOS的中断处理设计

在这里简单记录一下目前DragonOS中的中断处理的设计吧。首先,先上DragonOS的GitHub链接:GitHub - fslongjin/DragonOS: 一个64位的操作系统。A x86_64 operating system.https://github.com/fslongjin/DragonOS写这篇文章的时候,代码版本长这样:update README.md · fslongjin/DragonOS@5ec1b82 · GitHubhttps://github.com/fslo

2022-04-23 20:41:46 701

原创 在docker中安装phpmyadmin

方法很简单,也不用改配置文件什么的,只需要几行命令:拉取phpmyadmin镜像sudo docker pull phpmyadmin运行镜像其中,PMA_HOST和PMA_PORT填写的内容是MySQL数据库的地址和端口号sudo docker run --restart=always -d --name myadmin -e PMA_HOST=172.17.0.1 -e PMA_PORT=49153 -p 20888:80 phpmyadmin然后phpmyadmin就成

2022-04-07 15:59:28 2126

原创 简单实现了DragonOS的块设备驱动模型以及AHCI驱动程序

上周写好了DragonOS的AHCI驱动程序,能够通过DMA读写SATA硬盘,在这里简单记录一下。源代码:https://github.com/fslongjin/DragonOS/tree/cc39911d4db00b9e3890f35ca46f1579e44d5be4/kernel/driver/disk块设备驱动程序模型块设备定义(以下内容来自维基百科)块设备是指与系统间用块的方式移动数据的设备。这些设备节点通常代表可寻址设备,如硬盘、CD-ROM和内存区域。块设备通常支持随机存取

2022-04-07 15:29:40 376

原创 如何根据ACPI规范来获取I/O APIC控制寄存器的地址

ACPI这个单词,用电脑用多了的同学应该或多或少能在系统的报错信息等地方见过它。它表示表示高级配置和电源管理接口(Advanced Configuration and Power Management Interface)。通过ACPI规范,就能查询计算机硬件的一些信息。在这里给大家推荐一下我的操作系统项目,希望大家能在GitHub上面给我点个小星星哦~GitHub - fslongjin/DragonOS: 一个64位的操作系统。A x86_64 operating system.事情的起因是这样

2022-03-14 21:37:02 684

原创 在软盘上实现一个FAT12文件系统

在操作系统启动的过程中,第一步启动的是Booter,由于我们需要找到Loader.bin这个引导文件,我们需要在软盘上实现一个FAT12文件系统,从而方便我们的文件管理。话不多说,先上最终结果图:已经实现了文件搜索功能,只是因为我还没往软盘中写入loader.bin,因此提示找不到文件。之前我已经了解过FAT文件系统的基本原理,在这里不多赘述。本质上,FAT将一个文件的数据簇以链表的形式进行了管理。FAT文件系统的存储布局引导记录 FAT1 FAT2 根文件夹

2022-01-17 11:49:40 1069

原创 我用一早上时间做了个股价预测,居然这么准?

最近因为做项目的需要,要做一些数据预测,因此就去学习了一下相关的知识。主要就是采用LSTM来做时间序列的预测。IBM股价预测数据集选择的是IBM2006-2018年的股价数据,我这里算的是每日的最高股价。其中,2006-2016年的数据是训练集,2017年的是测试集。模型搭建如下:然后就是对数据进行预处理(归一化),接着进行训练。在训练的时候采用了一些小技巧:采用了学习率逐渐衰减的方式,使得loss更小。在不同epoch下,对2017年的数据进行预测的结果像下面的图片中所示的那样..

2022-01-03 21:29:03 1975 1

原创 Selenium添加Cookie来实现自动登录

最近在写一个爬虫,需要爬取京东的商品信息。本来第一天还爬的好好的,第二天就提示要登录才能进去搜索页面了。上网找的办法是添加cookie来实现自动登录。我写了一个程序,使用selenium+chrome,先手动登录一次之后,把Cookie保存到数据库里,然后当需要登录时,自动从数据库里面读取cookie,并设置上去。网上的代码大都是这样,但是事实证明这是不行的,没法登陆上去。直到我看到一篇文章之后,才意识到,可能是因为cookie里面有些内容需要被替换,才能继续使用,于是我就加了一个重新构造coo

2021-12-30 14:21:46 4003 2

原创 docker部署安装jenkins

首先,我们需要一台安装了docker的服务器。(这个我已经在我的小主机上安装了)第一步,把镜像给拉下来docker pull jenkins/jenkins:lts第二步,创建映射目录# 在适当的位置创建映射目录mkdir -p jenkins_home# 查看目录权限ls -nd jenkins_home# 改变拥有者为管理员sudo chown -R 1000:1000 jenkins_home第三步,启动jenkins# 查看docker的镜像dock

2021-12-27 20:39:18 503

原创 【论文阅读笔记】Myers的O(ND)时间复杂度的高效的diff算法

前言之前咱们三个同学做了个Simple-SCM,我负责那个Merge模块,也就是对两个不同分支的代码进行合并。当时为了简便起见,遇到文件冲突的时候,就直接按照文件的更改日期来存储,直接把更改日期较新的那个文件认为是我们要保留的文件版本。但是这样子做是存在很多问题的,因为这样做就无法对不同分支的代码他们各自的特性进行整合,最终保留的只是其中一个分支的代码。因此,加入按行进行比较的diff算法是非常必要的。然后,本着自力更生的理念,我希望能够自己写出这个代码,然后把它应用到Simple-SCM之中。今年

2021-12-24 15:24:31 1310

原创 缓存系统中的write back 和write through

缓存系统中,当有新的写请求,且目标块在缓存中时,write back操作只写入缓存,并将其标记位置位,待这个缓存块要被换出的时候,才把它写回到后端的存储设备上。write through操作则是,有新的写请求且目标块在缓存中时,同时向cache和后端存储写数据,保证二者在任何时候一致。小结:write back的执行效率更高,但是CPU硬件实现更为复杂。write through效率较低,但是实现起来较为简单。转载请注明来源:缓存系统中的write back 和write through

2021-12-24 15:22:18 1607

原创 IEEE754浮点数及其运算

一个二进制浮点数可以表示为:数的符号 一些有效位 有符号的比例因子系数(隐含的基数为2)结构如图所示(单精度)如果是双精度浮点数,则是1位符号位+11位余1023格式的指数+52位尾数规格化:当二进制小数点位于第一个有效位的右方时,我们说这个数是规格化(Normalized)的。特殊值余127指数E’的端点值0和255被用来表示特殊值。当E’=255且M=0时,表示∞。这里的∞时用0去除一个正常数的结果。这些表示中仍然使用符号位,因此存在±0和±∞的表.

2021-12-21 19:51:24 1963

原创 动态规划之硬币问题

现有面值为c1,c2,c3,…,cm的m种硬币,求支付n元时所需硬币的最少枚数。各面值的硬币可以使用任意次首先最开始想到的是贪心算法,也就是从最大面值的硬币开始用。但是贪心算法只关注当前的最优解,所得结果不一定是全局最优解。举个例子,当面值为1、2、7、8、12、50时,我们如果需要支付15元,用贪心算法来算的话,就会出现12、2、1的结果,需要三枚硬币。但是事实上,我们只需要7、8元面值的两枚硬币就够了。所以,硬币问题可以用动态规划来求解。用c[i]来存储硬币的面值,用T[j]来存储支付j

2021-09-07 20:18:24 2185

原创 扩展欧几里得算法

欧几里得算法欧几里得算法是用来求最大公约数的,gcd(a,b)=gcd(b, a%b),如此递归下去,直到a%b==0,然后返回。最终,gcd(a,b)=gcd(c,0),其中,a,b的最大公约数就是c扩展欧几里得算法(exgcd)扩展欧几里得算法是解决诸如:求整数x和y使得ax+by=gcd(a,b)的问题的。这里借用oi-wiki中的证明:然后,代码如下:int Exgcd(int a, int b, int &x, int &y) { i.

2021-09-07 20:17:59 186

原创 POJ3255:求解[次短路]->Dijkstra

题目:http://poj.org/problem?id=3255RoadblocksTime Limit: 2000MS Memory Limit: 65536KTotal Submissions: 28456 Accepted: 9683DescriptionBessie has moved to a small farm and sometimes enjoys returning to visit one of her best friends. She does not wan

2021-08-31 22:32:30 110

原创 POJ1182(食物链):种类并查集

Description动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形。A吃B, B吃C,C吃A。现有N个动物,以1-N编号。每个动物都是A,B,C中的一种,但是我们并不知道它到底是哪一种。有人用两种说法对这N个动物所构成的食物链关系进行描述:第一种说法是”1 X Y”,表示X和Y是同类。第二种说法是”2 X Y”,表示X吃Y。此人对N个动物,用上述两种说法,一句接一句地说出K句话,这K句话有的是真的,有的是假的。当一句话满足下列三条之一时,这句话就是假话,否则就是真话。1)

2021-08-31 20:25:16 117

原创 二分图最大匹配问题(匈牙利算法)

什么是二分图如果一个无向图的的顶点可以分为两个互不相交的子集A和B,那么它就是二分图。也就是说,A、B内部不存在连边,所有连边都一头连着A中的顶点,另一头连着B中的顶点。什么是二分图最大匹配?二分图最大匹配问题,就是在A、B这两个集合中,不断选择两个存在连线的点,把他们连起来,求最多可以有多少条连线的问题。怎么解?匈牙利算法的核心在于:从A集合中选择一个点,然后将与其相连的B中的点依次对照,如果B中的点尚未匹配,那就将这两个点进行匹配,然后遍历A中的下一个点。接着继续访问与其相连的B

2021-08-31 20:21:46 1009

原创 【题解】Gym – 102307C Common Subsequence

题目:Manuel thinks that Diego is his long lost brother. But Diego thinks Manuel is wrong, and to prove it, he got DNA samples from himself and Manuel. Now Diego has given you the DNA samples and it is your task to say whether they are brothers or not.Th

2021-08-31 20:19:53 179

原创 【题解】HDU7046(数学推导)

题目:https://acm.hdu.edu.cn/showproblem.php?pid=7046题目来源:2021“MINIEYE杯”中国大学生算法设计超级联赛(7)题目大概要求就是求按照给定的规则画出的图形的凸包大小。乍一看是计算几何的题目,然后再细想,其实就是一题数学推导的题目。先画出内容,然后手动推一下边长的公式,然后就可以推出面积公式,直接计算就可以了。AC代码#include <bits/stdc++.h>using namespace std;

2021-08-31 20:17:01 97

原创 树形DP简介

树形dp就是在树上进行的dp。由于树具有递归的性质,因此树形dp一半都是用递归的方式进行的。问题的大意是,选了父节点,那么它的直接子节点就不能被选择,求总的权值的最大值。题目:P1352 没有上司的舞会这题是树形dp的板子题,每个节点都有被选择和不被选择两种情况。用数组dp[n][0]记录第n个节点不被选择的情况,用数组dp[n][1]记录被选择的情况。那么就有状态转移方程dp[n][0] = Σ(max(dp[x][0],dp[x][1]),其中,x是n的所有子节点dp[n

2021-06-13 22:59:54 3658

原创 动态规划之最长递增子序列

最长递增子序列的问题就是:给定序列A=a0,a1,a2,…,an,如果它的子序列b1,b2,…,bn满足b1<b2<b3<…<bn则称这个子序列是一个递增子序列。A的所有子序列中,最长的那个就是最长递增子序列(LIS)这是一个经典的动态规划问题,我们可以用两种方法来解决。第一种是比较笨的纯dp算法。时间复杂度为O(N2).假设原序列存储于A[n+1]中,注意,序列从A[1]开始存储方法是使用两个数组:L[n+1] 用于存储A[1]到A[i]中,部

2021-04-06 23:04:22 1362 1

原创 计算几何之线段相交问题(平面扫描)

给出n条平行于x轴或y轴的线段,输出其交点数求n条线段的交点,可以用抽选配对的方式来遍历所有的情况,这样子时间复杂度为O(n2).与轴平行的线段相交问题(曼哈顿几何)可以通过平面扫描(sweep)高效求解。平面扫描算法的思路是将一条与x轴(y轴)平行的直线向上(向右)平行移动,在移动过程中寻找交点,这条直线被称为扫描线。扫描线在每次遇到平面上线段的端点的时候停止移动,并且检查该位置上的线段交点。为了进行上述的处理,我们需要先将输入的线段的端点按照y的大小进行排序,然后让扫描线向y轴正向移

2021-03-18 21:03:31 778

空空如也

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

TA关注的人

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