自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(128)
  • 资源 (8)
  • 收藏
  • 关注

原创 Linux 文件页反向映射

用来管理一个文件所有内容页面,一个真实的文件只对应一个address_space结构,其中address_space->i_pages是保存页面的结构,address_space->i_mmap是一个红黑树,红黑树上挂载着映射该文件的所有vma对象。用来描述用户进程的一段虚拟地址空间,其中vma->vm_start表示映射的起始虚拟地址,vma->vm_end表示映射的结束虚拟地址,vma->vm_file指向映射的文件对象,vma->vm_pgoff表示从文件哪里进行映射(以页面为单位)。

2024-04-14 23:05:48 896

原创 Linux pageset

在用户进程发生缺页异常时,Linux内核需要分配所需物理页面以及建立也表映射,来维持进程的正常内存使用需求。而对于分配物理页面仅依赖于buddy系统,对于小order页面的分配效率较低。因此Linux通过在每个cpu维护一个page链表(percpu page list简称pageset),用来满足小order页面分配请求,提高页面分配效率。

2024-02-21 22:39:25 442 2

原创 Linux 匿名页反向映射

反向映射恰好相反,想根据已分配的物理页找到该映射到该物理页上的所有用户进程,该操作主要用于页面回收,当内存不足时,回收一个页面就需要找到映射到该页面的所有用户进程,修改进程页表的映射信息,防止出现非法访问。最简单找到该页面被哪些进程所映射的方式,是通过遍历所有的进程的页表,然后遍历每个页表项,检查是否映射到该页面上,但这种方式无疑是最耗时的,所以才有了后面的反向映射机制。

2023-12-02 22:04:52 1133

原创 Linux fork()系统调用流程解析

fork系统调用用于创建一个新进程,称为子进程,它与进程(称为系统调用fork的进程)同时运行,此进程称为父进程。创建新的子进程后,两个进程将执行fork()系统调用之后的下一条指令。子进程使用相同的pc(程序计数器),相同的CPU寄存器,在父进程中使用的相同打开文件。它不需要参数并返回一个整数值。下面是fork()返回的不同值。负值:创建子进程失败。零:返回到新创建的子进程。正值:返回父进程或调用者。该值包含新创建的子进程的进程ID 。

2023-02-11 14:19:57 1594 1

原创 ftrace和tracepoint简单使用

tracepoint是预先在函数的插入点中插桩,当执行到函数的插入点,则执行插桩函数,进而触发与插入点预先绑定的probe函数,probe函数可以是一个或者多个,probe函数可以定义为任意的行为,从而可以起到对函数内部观测的作用。如今 ftrace 已经成为一个 framework,采用 plugin 的方式支持开发人员添加更多种类的 trace 功能。ftrace 的作用是帮助开发人员了解 Linux 内核的运行时行为,以便进行故障调试或性能分析。...

2022-08-12 23:36:43 932

原创 Linux中open命令实现原理以及源码分析

在阅读该篇文章的前提,最好对mknod有一定的了解,前置知识点:Linux中mknod命令实现原理以及源码分析open 原理我们经常在一个进程中使用open()来获取一个文件描述符fd,然后通过该fd去进行一些write()、read()操作。open()的原理是通过给定的文件路径/dev/hello,从而找到该文件路径所对应的inode信息,最后生成一个struct file结构体,该结构体在进程的打开文件列表中,返回的fd信息就是这个打开文件列表中的下标索引,所以说fd永远不会小于0。open

2022-05-21 16:52:54 3291

原创 Linux中mknod命令实现原理以及源码分析

本篇文章以mknod创建字符设备文件进行讲解字符设备驱动的Demo例子可参考该篇文章Linux 编写简单驱动并测试1. mknod 命令mknod /dev/hello c 520 0该命令主要通过制定要创建的设备文件名称/dev/hello,以及设备类型c字符设备,最后的520 0 表示为主设备号和次设备号。当我们使用该命令创建好了/dev/hello设备文件,当我们在用户态对该文件进行open()、write()、read()时,就会调用到/dev/hello设备文件对应的设备驱动的fil

2022-05-21 15:51:18 4799

原创 Linux中__setup()实现原理以及源码分析

1. __setup()介绍static __init int dma_debug_cmdline(char *str){ if (!str) return -EINVAL; if (strncmp(str, "off", 3) == 0) { pr_info("debugging disabled on kernel command line\n"); global_disable = true; } return 1;}static __init int dma_deb

2022-05-14 16:31:29 1761

原创 Busybox制作x86文件系统(最便捷版)

1. busybox的安装请参考这篇文章:https://blog.csdn.net/assiduous_me/article/details/120939319?spm=1001.2014.3001.55012. x86文件系统的制作当前的操作目录:syz@DESKTOP-B10G93S:~$ ls -ltotal 1488drwxr-xr-x 44 syz syz 4096 May 13 19:08 busyboxdrwxr-xr-x 32 syz syz 4096 M

2022-05-13 19:46:45 692 1

原创 shell 递归判断文件夹下文件权限是否为指定权限

shell 脚本#!/bin/bashcheck_permission() { for file in `ls -a $1` do if [ -d $1"/"$file ]; then if [[ $file != "." && $file != ".." && $file != ".git" ]]; then check_permission $1"/"$file fi else if [ `stat -c %a $1"

2022-03-04 09:39:07 509

原创 Qemu 调试 Linux 内核

1. 开启 Linux 内核调试编译选项make menuconfig2. 设置 qemu 启动脚本参数增加 -S -s 命令:sudo qemu-system-x86_64 \ -S -s \ -m 1024M \ -kernel ../linux/arch/x86/boot/bzImage \ -nographic \ -append "root=/dev/ram0 console=ttyS0 init=/linuxrc"

2021-11-07 17:36:36 1296

原创 Linux 编写简单驱动并测试

字符驱动编写1. 编写一个字符驱动在 driver/char/ 目录下新建一个 hello_dev.c 文件,用来编写一个字符驱动代码如下:#include <linux/module.h>#include <linux/moduleparam.h>#include <linux/cdev.h>#include <linux/fs.h>#include <linux/wait.h>#include <linux/poll.h

2021-11-07 16:32:49 1445

原创 Busybox 制作文件系统并用 Qemu 启动编译的内核镜像

编译内核操作:https://blog.csdn.net/assiduous_me/article/details/120938556安装Busybox操作:https://blog.csdn.net/assiduous_me/article/details/1209393191. 目录结构syz@DESKTOP-B10G93S:~$ ls -ltotal 20drwxr-xr-x 44 syz syz 4096 Oct 26 22:05 busyboxdrwxr-xr-x 31 syz syz

2021-10-26 22:43:48 656

原创 Busybox 安装

下载busybox-1.34.1.tar.bz2源代码https://busybox.net/downloads/通过这个网址下载busybox-1.34.1.tar.bz2源代码压缩包解压tar -jxvf busybox-1.34.1.tar.bz2将压缩包进行解压配置make menuconfig选中Settings->Build static binary (no shared libs)项,保存退出安装make && make install结果

2021-10-24 19:52:03 726

原创 Linux 内核镜像编译(包括编译环境配置)

1. Linux 内核源代码下载https://www.kernel.org/直接点击下载就好了,会得到 linux-xxx.tar.xz 源代码压缩包2. 解压sudo xz -d linux-5.14.14.tar.xztar xvf linux-5.14.14.tar使用上述命令,解压得到源代码3. 配置编译环境sudo apt install gccsudo apt-get install pkg-configsudo apt-get install flexsudo apt

2021-10-24 19:11:11 1066

原创 初步分析汇编代码

该篇文章为《中科大老师全程讲解Linux内核分析》对于汇编代码的解读过程1. C 语言程序main.cint g(int x){ return x + 3;}int f(int x){ return g(x);}int main(void){ return f(8) + 1;}2. 汇编程序main.s(通过gcc -S -o main.s main.c -m32得来,并去掉以 .开头的辅助链接信息) 1 g:.

2021-08-07 18:13:02 2338 3

原创 使用 Hexo 搭建个人博客网站

Hexo 网站地址:https://hexo.io/zh-cn/1. 下载依赖工具 Node.js下载链接地址:https://nodejs.org/en/download/2. 配置 NPM 镜像2.1 NPM 介绍NPM是随同NodeJS一起安装的包管理工具,能解决NodeJS代码部署上的很多问题,常见的使用场景有以下几种:允许用户从NPM服务器下载别人编写的第三方包到本地使用 允许用户从NPM服务器下载并安装别人编写的命令行程序到本地使用 允许用户将自己编写的包或命令行程序

2021-08-07 12:40:30 169

原创 CMake 介绍

CMake 介绍CMake:你或许听过好几种 Make 工具,例如 GNU Make ,QT 的 qmake ,微软的 MS nmake,BSD Make(pmake),Makepp,等等。这些 Make 工具遵循着不同的规范和标准,所执行的 Makefile 格式也千差万别。这样就带来了一个严峻的问题:如果软件想跨平台,必须要保证能够在不同平台编译。而如果使用上面的 Make 工具,就得为每一种标准写一次 Makefile ,这将是一件让人抓狂的工作。CMake 就是针对上面问题所设计的工具:它首

2021-05-22 15:29:18 157

原创 Lua 表的遍历

## 遍历表### 1. pairs 迭代器遍历pairs 适用于遍历含有键值对的表local t = { "apple", x = 10, y = 20, "banana", "grape",}for k, v in pairs(t) do print(k, v)end运行结果:lua.exe table.lua1 apple2 b

2021-03-21 15:23:37 2478

原创 C语言静态链接库和动态链接库讲解及制作使用

C语言静态链接库和动态链接库讲解及制作使用1. 引言静态链接库和动态库均为函数库函数库:不是C语言的一部分,是一些事先写好的函数的集合,给别人复用就像scanf和printf函数一样,通过#include <stdio.h>,即可调用早期并没有函数库,只是后来的程序员们通过整理把日常用的函数进行合并,形成一份完整的函数库,就是现在的标准函数库,例如:glibc静态链接库:函数库源代码经过只编译不链接形成的.o目标文件,然后通过ar工具将.o文件归档成.a静态链接库文件商业公

2021-02-06 23:10:48 2565 1

原创 C语言的编译链接流程

C语言的编译链接流程1. 编译链接流程图2. 引言#include <stdio.h>#define OUTPUT_STR "hello world"int main(){ printf("%s\n", OUTPUT_STR); return 0;}对于上面这个代码,大家可能再熟悉不过了,现在我们来从头分析它,如何从源码变为可执行程序3. 预编译预编译的命令:gcc -E *.c -o *.i其中 *.c 表示C语言编写的源代码,

2021-02-06 18:04:18 955

原创 C语言的编译到执行的过程

C语言的编译过程预处理【gcc -E】编译汇编链接

2020-12-12 02:51:10 286

原创 Windows10 搭建 FTP 服务器

问题:有这么一个需求,博主需要对班级同学的信息进行收集,同学的信息是一个个的文件,正常是每个同学将自己的信息打包压缩通过 QQ 或者邮箱方式发送给博主,博主一个个接收这些压缩包,然后进行解压,再统一放到一个文件夹下,但是博主觉得这样子实在是太麻烦了,如果某一个同学的信息来回变动,就需要接收很多次,更改很多次,另外如果消息过多还会产生漏掉某个同学的信息的问题。解决方法:如果可以使...

2020-04-23 22:18:48 2761 1

原创 算法:trie 树(字典树)

概念:字典树又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。(百度百科)图解:上图为一颗字典树,它表示字符串:aa、aaeb、aaec、ad、b、ba、cb、ca、cac...

2020-04-14 20:42:47 317

原创 算法:线段树

概念:线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。对于线段树中的每一个非叶子节点[a,b],它的左儿子表示的区间为[a,(a+b)/2],右儿子表示的区间为[(a+b)/2+1,b]。因此线段树是平衡二叉树,最后的子节点数目为N,即整个线段区间的长度。问题:在一维数组中求任意区间的和,要求尽可能的速度快该问题使用线...

2020-04-13 22:03:58 955

原创 算法:并查集

概念:并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题(百度百科)博主理解:1.并查集可以用来快速查询某一项元素在哪个集合中2.并查集可以快速将两个不相交集合合并为一个集合基本介绍:一般并查集使用数组进行实现ids = [0, 1, 2, 3, 4, 5, 6, 7]ids 为一维数组,这个一维数组和其他的数组不一样,数组下标:用来...

2020-04-12 13:05:13 237

原创 vue.js 使用 vue-aplayer 音频播放器(最全面)

效果图:代码实现:1.首先引入 vue-aplayer 包npm install @moefe/vue-aplayer --save2.然后在 main.js 中进行配置import APlayer from '@moefe/vue-aplayer'Vue.use(APlayer);3.在代码中进行使用<template> <ap...

2020-03-11 22:14:00 4998 2

原创 Vue.js 使用 vue-video-player 视频播放器(最全面)

前端效果:1.首先要安装vue-video-player 包npm install vue-video-player --save2.在 main.js 中进行配置import VueVideoPlayer from 'vue-video-player'import 'video.js/dist/video-js.css'import 'vue-video-playe...

2020-03-11 22:04:16 22309 12

原创 Spring Boot 视频流和音频流(预加载效果)接口

正常编写的文件上传和下载,利用 HttpServletResponse 对象的 OutputStream 流,去输出文件内容的接口是无法完成网页上的视频播放、音频播放的预加载效果,这个预加载效果是我自己创的一个词吧,实际的问题是:当你在播放视频或音频的时候,你点击进度条,无法实现指定位置进行播放,莫名的不爽,这是因为后台接口写的有问题!实际效果:实现代码:基于 Spring Boo...

2020-03-11 21:51:07 15228 13

原创 SpringBoot 配置 Logback 日志(不同等级输出到不同文件)

1. 排除 jar 包冲突,由于 jar 包的冲突会导致 linux 服务器日志输出文件无内容的问题<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> <excl...

2020-02-20 11:26:39 2934 1

原创 SpringBoot 配置(Profile 解决不同开发运行环境)

开发者在项目进行发布或者运行时,一般需要对配置文件进行大量的修改比如:在本地开发环境、测试环境、生产环境这些环境中,它们所使用的数据库配置信息、redis 配置信息、自定义的其他配置信息都是不一样的,当切换到不同的环境进行项目部署,相应的配置信息要对应进行修改为了解决上述提到的问题,SpringBoot 提供了 profile1. SpringBoot 约定在不同的环境下配置文件的命名...

2020-02-19 13:13:49 386

原创 CentOS7 安装 Nginx

1. 安装 Nginx 所需依赖yum install -y pcre pcre-develyum install -y zlib zlib-develyum install -y openssl openssl-devel2. 下载 Nginx 安装包wget http://nginx.org/download/nginx-1.9.9.tar.gz3. 将安装包解压到 ...

2020-02-18 13:50:46 343

原创 CentOS7 安装 MySQL

1. 下载 MySQL 官方 Yum Repositorywget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm2. 开始安装yum -y install mysql57-community-release-el7-10.noarch.rpmyum -y inst...

2020-02-17 18:29:42 345

原创 CentOS7 安装 JDK

1. 通过 yum 命令查询可安装 JDK 版本yum -y list java*2. 选择所需版本进行安装yum -y install java-1.8.0-openjdk-devel.x86_643. JDK 默认安装路径为 /usr/lib/jvmcd /usr/lib/jvm4. JDK 进行配置vim /etc/profile#...

2020-02-17 18:05:57 232

原创 时间戳分析(Java 版)

我们经常看到一个时间用long类型数据来表示,例如:1580704106823 表示当前时间:2020年02月03日12时28分26秒823毫秒那么为什么时间可以用一个long类型数据来表示呢?下面我们来一点点的分析:首先,介绍一个概念,时间戳:百度百科:时间戳是指格林威治时间1970年01月01日00时00分00秒(北京时间1970年01月01日08时00分00秒)起至现在的总毫秒数...

2020-02-03 13:25:32 1540

原创 Linux 进程控制类命令详解

本文主要讲解 Linux 进程控制类命令,这些命令在工作中十分常用,本博主会给出具体实例和运行截图进行讲解前置知识:1. 程序与进程概念:程序:是一个包含可执行代码的文件,存放在磁盘等介质上,属于静态概念进程:当程序被操作系统装载到内存中并分配给它一定的资源后,此时可称为进程,属于动态概念下面是进程状态转换图:查看进程:1. ps英文原意:report a snaps...

2020-01-12 13:05:02 2065

原创 Linux 常用目录及文件操作(压缩、解压缩)等命令

本文主要介绍 Linux 操作系统里的目录及文件操作命令浏览目录:1. ls英文原意:list directory contents(列出目录内容)描述:List information about the FILEs (the current directory by default).列出有关文件的信息(默认情况下为当前目录)语法:ls [OPTION]... [FILE...

2020-01-10 20:05:59 3259 3

原创 Python 打包 xx.py 为 xx.exe 可执行程序

0. 首先安装 pyinstallerpip install https://github.com/pyinstaller/pyinstaller/archive/develop.tar.gz1. 再执行pyinstaller -F -w xxx.py2. 查看结果

2019-11-16 23:40:49 253

原创 Python 利用邮件系统完成远程控制电脑(关机、重启等)

0. 我们如何通过邮件系统完成远程控制电脑(关机、重启等)?实现思路:需要有两个邮箱:接收指令邮箱(A)发送指令邮箱(B)被控制的电脑(查看 A 邮箱):1.每隔指定时间监听 A邮箱查看最近的邮件2. 打开最近邮件,看是否是B 邮箱地址发来的执行命令3. 向 A 和 B 邮箱都发送 主题为:反馈 内容为:“目标计算机已收到指令!开始执行:xxx 指令!” 邮件4.执行指...

2019-11-16 23:34:39 2080

原创 SpringBoot 构建 RESTful 服务

REST (Representational State Transfer) 表述性状态传递 一种 Web 软件架构风格在 REST 中,资源是由 URI 来指定的,对资源的增删改查操作可以通过 HTTP 协议提供的GET <=>查询POST <=>增添PUT <=> 修改DELETE <=> 删除等方法来实现下面我们来介绍一...

2019-11-12 17:07:10 305

Vue-resource.js

可以使用这个vue-resource.js在vue应用中发起get post 等请求

2018-08-10

Javascript技术文档PPT

本文档详细写了javasrcipt的一些基本的语法,以及一些基本的案例,十分详细具体

2018-07-28

CSS技术文档ppt

本CSS技术文档ppt,讲解了基本的css语法,以及很多的重点内容,通俗易懂

2018-07-28

HTML技术文档ppt

HTML技术文档,本ppt讲解了一些基本的html语法,简单易懂

2018-07-28

Mysql数据库安装图解

有关 Mysql 的安装步骤图解,可以实现按文档自己安装

2017-12-02

C语言的一些基本操作

一些基本的C语言语法笔记

2017-04-23

Java的一些基本语法

一些很纠结的东西,写出来构成的笔记

2017-04-23

空空如也

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

TA关注的人

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