- 博客(131)
- 资源 (8)
- 收藏
- 关注
原创 Linux migrate_type进一步探索
fallbacks是不同迁移类型内存不足时,可从哪个迁移类型中进行fallback操作,对于MIGRATE_UNMOVABLE迁移类型不足时,可以先MIGRATE_RECLAIMABLE迁移类型中偷内存,如果MIGRATE_RECLAIMABLE也没有内存的话,会进一步fallback到MIGRATE_MOVABLE迁移类型。因此对于我们一开始需要MIGRATE_UNMOVABLE类型的页面没有时,最终会fallback到MIGRATE_MOVABLE。
2024-05-02 20:30:19 786
原创 Linux migrate_type初步探索
为了更好的管理物理内存,操作系统进一步抽象出页块的概念,通常一个页块的大小是2^(MAX_ORDER-1)个页面(4MB)。每个页块对应一个迁移类型migrate_type,buddy系统中的页面,根据其所在migrate_type链表,可知道该页是属于哪个migrate_type的页块。
2024-05-01 21:53:01 578
原创 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 986
原创 Linux pageset
在用户进程发生缺页异常时,Linux内核需要分配所需物理页面以及建立也表映射,来维持进程的正常内存使用需求。而对于分配物理页面仅依赖于buddy系统,对于小order页面的分配效率较低。因此Linux通过在每个cpu维护一个page链表(percpu page list简称pageset),用来满足小order页面分配请求,提高页面分配效率。
2024-02-21 22:39:25 522 2
原创 Linux 匿名页反向映射
反向映射恰好相反,想根据已分配的物理页找到该映射到该物理页上的所有用户进程,该操作主要用于页面回收,当内存不足时,回收一个页面就需要找到映射到该页面的所有用户进程,修改进程页表的映射信息,防止出现非法访问。最简单找到该页面被哪些进程所映射的方式,是通过遍历所有的进程的页表,然后遍历每个页表项,检查是否映射到该页面上,但这种方式无疑是最耗时的,所以才有了后面的反向映射机制。
2023-12-02 22:04:52 1279
原创 Linux fork()系统调用流程解析
fork系统调用用于创建一个新进程,称为子进程,它与进程(称为系统调用fork的进程)同时运行,此进程称为父进程。创建新的子进程后,两个进程将执行fork()系统调用之后的下一条指令。子进程使用相同的pc(程序计数器),相同的CPU寄存器,在父进程中使用的相同打开文件。它不需要参数并返回一个整数值。下面是fork()返回的不同值。负值:创建子进程失败。零:返回到新创建的子进程。正值:返回父进程或调用者。该值包含新创建的子进程的进程ID 。
2023-02-11 14:19:57 1799 1
原创 ftrace和tracepoint简单使用
tracepoint是预先在函数的插入点中插桩,当执行到函数的插入点,则执行插桩函数,进而触发与插入点预先绑定的probe函数,probe函数可以是一个或者多个,probe函数可以定义为任意的行为,从而可以起到对函数内部观测的作用。如今 ftrace 已经成为一个 framework,采用 plugin 的方式支持开发人员添加更多种类的 trace 功能。ftrace 的作用是帮助开发人员了解 Linux 内核的运行时行为,以便进行故障调试或性能分析。...
2022-08-12 23:36:43 1063
原创 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 4276
原创 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 6435
原创 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 2066
原创 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 850 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 587
原创 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 1371
原创 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 1699
原创 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 800
原创 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 916
原创 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 1180
原创 初步分析汇编代码
该篇文章为《中科大老师全程讲解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 2654 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 223
原创 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 271
原创 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 2658
原创 C语言静态链接库和动态链接库讲解及制作使用
C语言静态链接库和动态链接库讲解及制作使用1. 引言静态链接库和动态库均为函数库函数库:不是C语言的一部分,是一些事先写好的函数的集合,给别人复用就像scanf和printf函数一样,通过#include <stdio.h>,即可调用早期并没有函数库,只是后来的程序员们通过整理把日常用的函数进行合并,形成一份完整的函数库,就是现在的标准函数库,例如:glibc静态链接库:函数库源代码经过只编译不链接形成的.o目标文件,然后通过ar工具将.o文件归档成.a静态链接库文件商业公
2021-02-06 23:10:48 3448 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 1009
原创 Windows10 搭建 FTP 服务器
问题:有这么一个需求,博主需要对班级同学的信息进行收集,同学的信息是一个个的文件,正常是每个同学将自己的信息打包压缩通过 QQ 或者邮箱方式发送给博主,博主一个个接收这些压缩包,然后进行解压,再统一放到一个文件夹下,但是博主觉得这样子实在是太麻烦了,如果某一个同学的信息来回变动,就需要接收很多次,更改很多次,另外如果消息过多还会产生漏掉某个同学的信息的问题。解决方法:如果可以使...
2020-04-23 22:18:48 3088 1
原创 算法:trie 树(字典树)
概念:字典树又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询效率比哈希树高。(百度百科)图解:上图为一颗字典树,它表示字符串:aa、aaeb、aaec、ad、b、ba、cb、ca、cac...
2020-04-14 20:42:47 391
原创 算法:线段树
概念:线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点。对于线段树中的每一个非叶子节点[a,b],它的左儿子表示的区间为[a,(a+b)/2],右儿子表示的区间为[(a+b)/2+1,b]。因此线段树是平衡二叉树,最后的子节点数目为N,即整个线段区间的长度。问题:在一维数组中求任意区间的和,要求尽可能的速度快该问题使用线...
2020-04-13 22:03:58 1044
原创 算法:并查集
概念:并查集是一种树型的数据结构,用于处理一些不相交集合(Disjoint Sets)的合并及查询问题(百度百科)博主理解:1.并查集可以用来快速查询某一项元素在哪个集合中2.并查集可以快速将两个不相交集合合并为一个集合基本介绍:一般并查集使用数组进行实现ids = [0, 1, 2, 3, 4, 5, 6, 7]ids 为一维数组,这个一维数组和其他的数组不一样,数组下标:用来...
2020-04-12 13:05:13 264
原创 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 5565 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 30911 15
原创 Spring Boot 视频流和音频流(预加载效果)接口
正常编写的文件上传和下载,利用 HttpServletResponse 对象的 OutputStream 流,去输出文件内容的接口是无法完成网页上的视频播放、音频播放的预加载效果,这个预加载效果是我自己创的一个词吧,实际的问题是:当你在播放视频或音频的时候,你点击进度条,无法实现指定位置进行播放,莫名的不爽,这是因为后台接口写的有问题!实际效果:实现代码:基于 Spring Boo...
2020-03-11 21:51:07 16060 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 3029 1
原创 SpringBoot 配置(Profile 解决不同开发运行环境)
开发者在项目进行发布或者运行时,一般需要对配置文件进行大量的修改比如:在本地开发环境、测试环境、生产环境这些环境中,它们所使用的数据库配置信息、redis 配置信息、自定义的其他配置信息都是不一样的,当切换到不同的环境进行项目部署,相应的配置信息要对应进行修改为了解决上述提到的问题,SpringBoot 提供了 profile1. SpringBoot 约定在不同的环境下配置文件的命名...
2020-02-19 13:13:49 427
原创 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 371
原创 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 400
原创 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 270
原创 时间戳分析(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 1717
原创 Linux 进程控制类命令详解
本文主要讲解 Linux 进程控制类命令,这些命令在工作中十分常用,本博主会给出具体实例和运行截图进行讲解前置知识:1. 程序与进程概念:程序:是一个包含可执行代码的文件,存放在磁盘等介质上,属于静态概念进程:当程序被操作系统装载到内存中并分配给它一定的资源后,此时可称为进程,属于动态概念下面是进程状态转换图:查看进程:1. ps英文原意:report a snaps...
2020-01-12 13:05:02 2119
原创 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 3340 3
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人