自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 编译并运行Linux内核

目录0、环境1、编译内核2、创建根文件系统3、安装qemu并执行4、参考0、环境系统:Linux Mint 19.1 Tessa 内核版本:4.15.0-96-generic(该版本是笔者开发机的版本,不是要编译的版本) 虚拟机:qemu2.11.1 平台:x86_64 根文件系统:buildroot-2021.02.3 创建 编译过程中的依赖等自行安装。1、编译...

2021-07-05 18:29:35 1088

原创 HTML日期时间控件并设置默认值为当前时间

<!DOCTYPE html><html> <head> <meta charset="UTF-8"> </head> <body> <input type="date" id="start_time" /> </body> <script type="text/javascript"> var start =

2021-04-29 17:17:09 5729 1

原创 一个关于意识是物质的猜想

人类能否创造出真正的人工智能-------这是副标题首先说结论,我认为人类是不可能创造出真正的人工智能的,因为要想创造出真正的人工智能,首先要解决的一个问题,那就是--意识。意识是什么,如何创造意识。我觉得意识是物质,当然不是大脑分泌的物质,那成了庸俗唯物主义了,它是属于高维空间的物质。比如,我们这个世界是三维的,那二维生物--影子,假设它们也有属于它们二维的意识,它们也会去想自己为什么会出现,为什么会移动,为什么会消失。他们可能就想不明白这些问题,但是作为比它们高一维的我们,就很好解释这些

2021-03-30 09:31:11 253

原创 一个简单神经网络的代码实现

用算法来预测下表的结果:InputOutput0 0 101 1 111 0 110 1 10上表就相当于是训练数据,Output相当于标签(Label)。import numpy as npdef nonlin(x, deriv=False): if True == deriv: return x*(1-x) return 1 / (1 + np.exp(-x))train_data = np.array([[

2021-02-07 19:23:28 2054 1

原创 Linux 虚拟机使用tap设备

为了给bochs配置网络,前几个月一直在折腾tun/tap设备,一直也没弄明白,后来使用bochs的vnet模式晢时替代了一段时间,而且支持的协议有限(arp, dhcp, icmp, tftp),所以要测试更多协议,就要使用tun/tap设备,所以去百度了一些文章,一般都是说先modinfo, 然后再lsmod查看有没有tun这个模块,没有的话要重新编译模块,再加载进来,但是现在据我所知,现...

2020-05-05 20:37:23 1258

原创 记一次失败的安装tun设备过程

由于bochs, qemu想要配置网络,比较好的选择是采用tun设备,所以在网上找了一些教程。先下载Linux的源码(apt-get install -y linux-source),由于我的内核版本是4.15.0-70-generic, 只能下载4.15.0版本的源码。然后按照教程把tun模块编译出来,得到tun.ko, 但是把它放到/lib/modules...相应目录下,执行dep...

2020-04-25 15:15:09 3561

原创 qemu引导时读取硬盘数据出现空洞的问题

本来内核是在bochs中运行是没有问题的,但是放到qemu中出现了几个问题。 主要是在引导阶段,qemu在引导时需要关掉中断,否则屏幕会一直刷新。 第二个问题是在把内核文件从硬盘读取到内存时,本来应该是连续的,结果在读取完一块后,间隔若干个‘00’, 然后才是第二个盘块的数据,后面也都是许多这种情况,可能是因为qemu读取时不是以512字节为单位,但是没有找到相关的参数,这个可能应...

2020-04-23 19:49:26 453

原创 操作系统内核写后感

最近用的几个月的时间,大体写了一个简单的微内核的操作系统内核,还是想继续写下去,关于一个简单的内核开发有一些思考。 首先要选定好语言,我刚开始想用C来写,但是一想现在很多书都是用C来教学写内核的,如果我也用C,那我那容易就由于惯性,把人家的代码抄上了,所以决定用C++来写,但是用C++写的时候,又发现了一些问题,比如无法使用运行时库,对于C++运行时的特性无法使用,甚至全局对象都不构造(...

2020-04-11 20:04:43 221

原创 微内核将内核进程放入用户态的问题

     不论宏微内核,要进行系统调用,首先要陷入内核态,对于宏内核,陷入内核态后,调用内核态的函数来实现相应功能; 对于微内核,陷入内核态后,进行消息传递,然后等待结果。     可以看到,不管宏微内核,都必须要陷入内核,也就是执行int 0x80这种指令,但是陷入内核这种操作是比较耗时的,要...

2020-04-03 15:01:23 800

原创 浅淡微内核地址空间是否独立问题

        现在操作系统主要有宏微内核两种设计方法。(当然不只这两种)        大家经常接触到的Linux是宏内核的,而微内核并不是在Linux之后才出现的设计理念,而是在Linux之前就有微内核的操作系统了。        那为什么Linux还要采用宏内核呢?最主...

2020-04-02 17:20:16 333

原创 vmtools装完没有效果

sudo apt-get install open-vm-tools-desktop然后重启

2020-03-21 19:34:52 1930

原创 vim自动滚屏-让光标行保持位置

function! MyAutoScroll()let s:SusLines=winheight(winnr()) * 0.3 if winheight(winnr())-winline()>=s:SusLinesreturnelselet thisline=winline()let inbetween=winheight(winnr())-thislinewhile inbe...

2020-02-23 12:03:02 1458

原创 阿里云断开连接任务也中止

参照官网解决方案nohup可以使后面的命令不会响应挂断(SIGHUP)信号。也就是说,通过远程登录执行nohup命令后,即使退出登录后,程序还是会正常执行。通常情况下,nohup命令最后会跟上&字符,表示将这个命令放至后台执行,这样才能真正做到将这个命令放至后台持续的执行。如,要执行一个python脚本:nohup python3 script.py &再断开连接,这个脚本...

2020-02-12 15:42:21 1047

原创 C++全局对象不调用构造函数情况

我们知道,在通常情况下,纵然这个对象是全局的,也会调用其构造函数。但是有些情况例外。导致全局对象不调用构造函数的主要原因是编译器的问题。(主要是其中的链接器部分)首先我们要知道,全局对象初始化的时候,其构造函数是在什么时候调用的。linux下程序的执行过程。可以看到在main函数之前是有对全局变量的初始化过程的(_init -> __do_global_ctors_aux)。...

2020-02-08 19:13:34 2593 1

原创 Linux硬盘空间不足

使用du命令排查目录,发现一个26G的文件夹(timeshift), 这个文件夹是用于保存快照用于恢复系统的。终端使用sudo timeshift-gtk, 打开其管理界面,把所有快照删除即可。可以去Setting->Scedule中设置备份时间的间隔。因为我的Linux是装在个人电脑上的,使用一年多也没有恢复系统的需求,如果有经常需要恢复系统的话,还是要根据实际情况来处理。...

2020-02-05 10:47:56 790

原创 bochs模板配置文件及配置网卡

设置bochs使用网卡:根据下面的模板文件相应的内容,在配置文件中添加:ne2k: ioaddr=0x280, irq=10, mac=b0:c4:20:00:00:99, ethmod=linux, ethdev=wlp2s0ethdev不一定都是eth0, 要根据ifconfig的实际输出来确定。在设置irq时注意不要冲突。以上设置能保证正常启动,但能否正常使用还未测试。模板配置文件...

2020-01-15 14:28:41 1676

原创 读取CMOS时间并转为十进制

CMOS字节信息(仅列出比较常用的字节)偏移值描述0当前秒数2当前分钟4当前小时6星期几7一个月中的第几天8几月9年(仅表示后两位,如2021年,存放的数据为21)读取CMOS时间步骤:先向地址端口(0x70)发送偏移信息,告诉它要读的分,时还是秒从数据端口(0x71)读出一个字节数据。比如要读取当前月份:o...

2020-01-13 14:34:50 980

原创 复制构造函数重载

先看代码:以下代码编译时要加:-fno-elide-constructors 来关闭编译器优化,否则可能看不到复制构造函数的调用。#include <iostream>using std::cout;using std::endl;class A { public: A() = default; A(A& a) { cout << "c...

2019-12-21 13:33:35 1332

原创 c3p0配置常见问题

1、c3p0-config.xml要放在src目录下,而不是WEB-INF目录下2、在测试时PreparedStatement pstmt = (PreparedStatement)conn.prepareStatement(sql);使用是应该是java.sql.PreparedSatement, 而不是mysql的PreparedStatement.因为c3p0使用的是java...

2019-12-18 16:17:14 792

原创 浅谈delete[]如何处理数组

测试是否在数组周围存放数组大小运行结果:可见,在数组周围并没有记录数组的大小。使用delete释放数组和释放单个元素空间应该是没有区别的。如delete[] arr, delete e;释放单个元素不用解释,那么释放数组空间时是否需要获取其元素个数呢?个人认为,这是不需要的。大家都知道,在new一个对象时,执行的两个操作,operator new申请内存,然后进行构造;delet...

2019-12-18 12:52:46 8860 2

原创 快速幂取模算法解析

代码:def quick_mod(a, b, n): a = a % n result = 1 while 0!=b: if b&1 == 1: result = (result*a) % n b = b >> 1 a = (a...

2019-12-13 23:15:39 741

原创 Redis 持久化机制--RDB/AOF

持久化通俗地理解就是把内存中的数据,存到硬盘中。Redis是一种内存数据库,它的数据是存放在内存中的,也就是说如果断电,数据就会丢失(RAM断电失忆)。Redis中的数据就是键值对。Redis持久化,把数据存到硬盘上,可以防止服务器出现故障造成数据丢失,这时只需要从硬盘中存放的数据重新加载到内存,那么Redis就可以恢复状态。如何恢复状态?这里恢复状态就有两种方案了:把原来的数据存放...

2019-12-12 16:32:32 667

原创 解决Servlet 第一个项目一直404

项目的部署路径是否在Tomcat的webapps下面,如果不是,删掉Server, 新建一个,修改路径:检查web.xml是否正确打开tomcat的webapps中找到相应项目查看classes中是否生成字节码文件。eclipse中可能看不到这个文件夹,直接打开查看。如果没有字节码文件,有可能是代码有编译错误,检查代码。如果代码没问题,那就重新编译:先project->buil...

2019-12-08 17:37:36 1251

原创 指针加减运算--void*的加减

大家都知道对于一般的指针,比如int*等,其加减运算是以元素的大小为单位的。unsigned int *s = (unsigned int*)0x1234;cout << s+1 << endl;cout << s-1 << endl;其结果分别是:0x1238, 0x1230分别加减了一个unsigned int的大小,也就是4个字节。...

2019-12-07 16:35:38 4694

原创 new操作符分析及重载

new与operator new的区别?可以把new理解为C++中的一个关键字(准确地说是操作符)。operator new可以当成一个函数名,可能有人会问,函数名怎么可以有空格呢?其实这无伤大雅,想想我们在重载运算符时(+,-等 运算符),函数名的位置不也是类似operator+, operator-吗,+/-符号在重载时也可以作为函数名的一部分。operator new想相当于operat...

2019-12-05 22:53:58 2344 1

原创 fork原理--Linux实现

fork的一些特征是怎么实现的?比如:为什么父进程返回子进程pid, 子进程返回0?子进程是如何做到与父进程“一模一样的”?子进程同父进程一样,都是从调用fork处继续向下执行,而不是子进程从头执行?下面直接看源码来分析。注:如果不额外说明,为了阅读方便,以下展示源码都已删减。从父进程调用fork开始; 就不写程序了。大家都知道,这是一个系统调用,当父进程调用fork()时,大...

2019-12-03 19:43:34 3175

原创 TLS抓包分析

TLS(Transport Layer Security, 传输层安全):用于保证Web通信以及其他流行协议的安全。TLS的前身是安全套接字层(SSL)。TLSv1.2版本运行在面向流的协议(如TCP)之上。记录协议提供分片、压缩、完整性保护以及对客户端与服务器之间所交换数据的加密服务。信息交换协议负责建立身份,进行认证,提示警报,以及为用于每一条连接的记录协议提供唯一的密钥材料。TL...

2019-12-01 18:52:05 6839

原创 Eclipse: User Operation is waiting.

出现这个问题,重启eclipse, 重启电脑都没用。点击项目,然后Property->Builders->去除Validation选项。

2019-12-01 12:11:46 987

原创 Eclipse配置Tomcat常见问题及运行第一个项目

常见问题:install new software异常缓慢:解决:不要勾选Contact Update …(最下方)Server中没有Tomcat: 解决:去install new software下载JST Server Adapter Extensions(在Web,XML,Java EE and OSGi Enterprise Development列表中)启动项目提示端口占用:...

2019-12-01 11:43:46 812

原创 Linux页出错处理及需求加载,写时复制源码分析

写时复制:若干个进程都是读一个页面数据时,则共享这一个页面,不需要复制这个页面。(节约内存并加快进程创建速度),当某个进程想要对这个页面进行写操作时(修改数据),会影响共享这个页面的其他进程,这时才把页面进行复制(分别持有不同的页面),这时进行写操作不会影响到其他进程。只有在写的时候才复制。需求加载加载一个进程时,不会把这个进程的所有数据全部加载到内存,而是仅分配必要的内存,没有给代码段和...

2019-11-30 10:38:03 1420

原创 解决Access denied for user 'root'@'%' to database 'xxx'

jdbc连接mysql出现Access denied for user ‘root’@’%’ to database ‘xxx’查看授权情况:SELECT host,user,password,Grant_priv,Super_priv FROM mysql.user;但是user=root, host=%, 权限都已经打开。经过检查,发现上面命令显示的host=%, 有两条记录一条是us...

2019-11-28 22:15:08 24038 1

原创 TCP四次挥手特殊情况--同时发送FIN

数据包如下:过程如下:数据包解析:

2019-11-26 16:40:31 3428

原创 优雅地移除节点

先来看一个不优雅的写法:remove_list_entry(entry){ prev = NULL; walk = head; while (walk != entry) { prev = walk; walk = walk->next; } if (!prev) head = entry-&gt...

2019-11-26 15:38:16 1301

原创 统计二进制数组中1的个数--variable-precision SWAR算法解析

统计一个32位数字的二进制表示中,1的个数(把这个32位数字当做一个长度为32的二进制数组)。如0xffc1, 其二进制为1111 1111 1100 0001, 那么1的个数为11个。算法如下:unsigned int swar(unsigned int n) ...

2019-11-24 14:01:31 1853 1

原创 C++ API设计

1. 隐藏实现细节一般来说,声明放在.h文件中,定义放在.cpp文件中,.h文件中也可以给出定义,如下class A { public void f() { std::cout << "In f" << std::endl; }};但是很不建议这么写,因为这种写法隐式地要求编译器在调用这个函数的地方,内联此函数,不仅暴露实现细节还将代码内联到客户程序中。...

2019-11-22 11:13:42 1776

原创 链表的“二分查找”--跳跃表

二分查找是一种效率很高的查找方法,但是二分查找要求数据结构必须是顺序表,也就是类似于数组的连续存储,因为只有这样才能一下定位出数组的中间位置(直接使用类似a[len / 2]),然后就可以把数组一分为二,进行后面的操作。但是对于链表,由于存储是离散的,不能像数组一样,快速定位中间位置,来把链表一分为二,所以一般的二分查找不能直接应用于链表。本文要说的跳跃表其实也可以算是一种新的数据结构,采用空...

2019-11-13 09:15:25 6161

原创 Redis字符串(SDS)与C字符串比较

Redis并不是直接使用C的原生字符串,而是对char*进行了简单的包装,但是经过包装后会避免很多缺陷。C原生字符串的缺点:使用API时不安全:比如调用strcat()进行字符串拼接时,strcat(str1, “extend”)原数据:经过拼接后:str2中原来的数据被破坏,因为C语言在执行这些API时不进行溢出检查,只是一股脑地把数据填到后边。获取字符串长度,时间复杂度为O(n...

2019-11-10 11:58:01 1170

原创 复制二进制文件

用sublime打开二进制文件,然后全选复制到一个新文件中,即使给新文件执行权限,也不能执行。使用diff命令可以看到两个文件是不同的。因为使用文本编辑器打开时会对文件内容进行处理,比如换行符等所以正确的方式应该是使用程序把文件内容拷贝过去。#include <stdio.h>#include <sys/types.h>#include <sys/stat...

2019-11-05 17:32:28 1111

原创 Minix进程间通信分析

进程间通信(IPC: Inter-Process Communication), 可以直接理解为进程间互相发送消息,进程间互相发送消息的方式有很多,比如消息传递,管道,共享内存等都可以,本文主要分析消息传递方式在Minix内核中是如何工作的。为什么需要进行进程间通信?宏、微内核系统调用区别?进程A要给B发送消息,说明进程A有求于进程B,A和B共同协作才能完成一项任务,如何只有A是完成不了的。...

2019-11-04 16:16:54 1595

原创 Linux系统调用过程分析

本文以write()来简要分析一下Linux系统调用过程:write系统调用:函数定义如下:lib/write.c其中_syscall是一个宏定义, 内容类似如下:include/unistd.h其实就相当于int write(int fd, const char *buf, off_t count) { … }就是定义了write()这个函数。可以看到,在执行write函数时,...

2019-11-03 23:24:16 1959

homeworkhomework

homeworkhomework

2022-08-24

空空如也

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

TA关注的人

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