自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 解决编译内核报错:No rule to make target ‘debian/canonical-certs.pem‘

最终,通过命令直接禁用内核配置中的证书吊销功能,避免了编译过程中对缺失的 debian/canonical-revoked-certs.pem 文件的依赖,问题得以解决。具体方法是使用内核配置工具禁用 SYSTEM_TRUSTED_KEYS,这会阻止内核编译过程中对证书文件的需求。该错误提示缺少 debian/canonical-certs.pem 内核签名证书文件,这通常是因为内核编译过程中需要该证书文件来对内核进行签名,尤其是在启用 Secure Boot 或需要内核签名的情况下。

2025-04-06 13:26:16 336

原创 深入理解Linux网络随笔(五):深度理解本机网络I/O

本机网络I/O并不会经过网卡,Linux 内核在进行路由查找时,优先查询如果目标 IP 是本机地址(如127.0.0.1或者主机上任意IP地址),查找并匹配 RTN_LOCAL路由类型,数据包的下一跳(next hop)指向(即回环设备)。如果未命中,才会查main路由表,决定是否通过真实网卡发送。

2025-03-22 13:20:04 715

原创 进程PID分配

版本进行优化,所有资源管理(CPU、内存、I/O)必须在同一个 cgroup 层级下进行,即 一个进程只能属于一个 cgroup,不能分散到多个不同的 cgroup 里。问题,是一种分层组织进程的机制,沿层次结构以受控方式分配CPU、内存等系统资源(命令 lssubsys -a),其中有v1和v2版本。版本中一个进程可以属于不同的层级,每种资源(CPU、内存、I/O)都有自己的层级,它们是独立的,互不干涉。bitmap 可以极大地压缩整数的存储,使用bitmap 方式存储使用过的进程号,节省内存。

2025-03-18 10:04:54 607

原创 深入理解Linux网络随笔(六):网络性能优化

减少不必要网络I/O一次网络I/O处理多个请求,方法:redis批量命令:hmget、pipeline客户端与服务端部署靠近,降低RTT延迟内网调用不要使用外网域名,外网接口慢、带宽成本高、内网请求外网时NAT单点瓶颈。

2025-03-16 12:28:50 752

原创 深入理解Linux网络随笔(七):容器网络虚拟化--Veth设备对

微服务架构中服务被拆分成多个独立的容器,docker网络虚拟化的核心技术为:Veth设备对、Network Namespace、Bridg。

2025-03-12 13:38:21 1091

原创 深入理解Linux网络随笔(四):内核是如何与用户进程协作的(下篇:多路I/O复用模型epoll)

调用epoll_wait时,主要观察 eventpoll->rdllist 就绪链表里有没有数据,如果有数据就返回,没有数据就创建一个等待队列项,将其添加到 eventpoll 的等待队列上,阻塞自己。I/O解释:在Linux中均用文件描述符fd表示,输入输出的对象可以是文件(file), 网络(socket),进程之间的管道(pipe)。epoll_wait负责检查就绪列表,就绪列表没有数据会修改任务状态为可中断状态,并加入到epoll 的接收队列中,让出CPU。

2025-03-08 19:02:57 822

原创 Flow Size Prediction with Short Time Gaps

在当今数据中心和云计算环境中,网络流量的精准预测是优化资源分配、实现智能负载均衡的关键。传统流量和预测聚焦于,对于。本文提出了一种基于方法。

2025-03-08 11:46:09 668

原创 # 深入理解Linux网络随笔(三):内核是如何与用户进程协作的(上篇:同步I/O阻塞)

在网络数据帧通过协议栈处理后,内核需要将数据传递给用户空间的进程进行处理。内核与用户进程的协作主要通过两种方式来唤醒用户进程:同步阻塞(多用于客户端)(Java(BIO))在这种模式下,。客户端进程通常使用这种方式进行等待,直到网络数据到达为止。类似于Java中的**BIO(Blocking I/O)**模式,其中I/O操作会阻塞进程,直到操作完成。多路I/O复用(多用于服务端)(Java (NIO))在这种模式下,的状态时,避免每个连接都单独占用一个线程,从而提高资源利用效率。

2025-03-05 13:25:10 967

原创 深入理解Linux网络随笔(二):内核是如何接收网络包的(下篇)

数据帧从网线到达网卡时候,首先到达网卡的接收队列,网卡会在初始化时分配给自己的RingBuffer中寻找可用内存位置,寻找成功后将数据帧DMA到网卡关联的内存里,DMA操作完成后,网卡会向CPU发起一个硬中断,通知CPU有数据到达。是一个基于协议类型的哈希表,它包含了协议类型(如 IPv4、IPv6、TCP 等)对应的特定处理函数,当数据包的协议类型与哈希表中的某个条目匹配时,数据包会被传递到该处理函数。函数中,首先会遍历这个链表,依次处理每个协议类型,并调用与协议相关的处理函数,

2025-02-14 16:53:58 1489

原创 深入理解Linux网络随笔(一):内核是如何接收网络包的(上篇)

从Linux视角看,TCP/IP网络分层模型包括用户空间和内核空间。用户空间(应用层)负责HTTP、FTP等协议的网络服务。各层通过封装与解封装协作完成数据传输,内核通过接口支持用户进程与网络交互。​。

2025-02-12 19:24:29 1255

原创 代码随想录--707设计链表

你可以选择使用单链表或者双链表,设计并实现自己的链表。val和next。val是当前节点的值,next是指向下一个节点的指针/引用。如果是双向链表,则还需要属性prev以指示链表中的上一个节点。假设链表中的所有节点下标从开始。实现index-1valvalvalindexindexindexindex。

2025-02-12 12:19:51 292

原创 代码随想录--27移除元素

给你一个数组 nums 和一个值 val,你需要 原地 移除所有数值等于 val 的元素,并返回移除后数组的新长度。不要使用额外的数组空间,你必须仅使用 O(1) 额外空间并修改输入数组。元素的顺序可以改变。你不需要考虑数组中超出新长度后面的元素。示例 1: 给定 nums = [3,2,2,3], val = 3, 函数应该返回新的长度 2, 并且 nums 中的前两个元素均为 2。你不需要考虑数组中超出新长度后面的元素。

2025-02-09 13:09:36 404

原创 代码随想录--704二分查找

给定一个 n 个元素有序的(升序)整型数组 nums 和一个目标值 target ,写一个函数搜索 nums 中的 target,如果目标值存在返回下标,否则返回 -1。

2025-02-08 20:38:42 315

原创 进程加载启动原理--第一部分

对于一个 C 语言程序,从源文件到 ELF 可执行文件的过程是一个多阶段的复杂流程,涵盖了预处理、编译、汇编和链接4个阶段,最终生成一个可由操作系统加载并执行的 ELF 格式的可执行文件。在分析ELF文件头时,我们通过readelf命令查看了程序test.c的入口地址是0x160,我们在Section Headers中进行查找,可以看到其对应的Segment的.text部分,说明程序test.c的入口地址与.text Section地址相同。命令查看ELF文件,ELF文件头记录了整个文件的属性信息,使用。

2024-12-01 17:06:27 613

原创 eBPF技术审计和拦截网络流量

基于套接字过滤器审计网络流量实现方式如下:(1)内核态eBPF程序解析网络数据包(2)用户态解析网络数据包。

2024-11-12 23:09:09 803

原创 解决主机重启后kubelet无法自动启动问题

命令暂时关闭了swap,看到关闭的状态,但是在每次关闭虚拟机,重启虚拟机的时候swap并未关闭会自动开启,导致kubelet无法启动,如何永久解决这个问题呢?查看了kubelet状态,发现并未启动成功,状态:loaded,究其原因是因为在k8s环境中必须确保全程关闭交换内存,在最初部署k8s的时候使用了。在安装配置好Kubernetes后,每次关机重新利用。进行注释后保存并退出即可。修改fstab配置文件。

2024-11-04 14:52:34 954

原创 netfilter和iptables--netfilter源码篇

防火墙是保护服务器和基础设施的重要工具,在Linux系统下,目前广泛使用的防火墙工具是iptables,但实际进行规则实施并产生实际作用的是Netfilter,iptables与内核中的netfilter框架中Hook协同工作,实现IP数据包的控制与过滤,本次将基于Linux6.5从源码视角分析。

2024-09-24 10:54:34 1461 1

原创 模拟同主机跨网段通信

将lo接口在ns1命名空间中启用,并在命名空间ns1中启动一个python3内置的HTTP服务器,该服务器监听端口为8080,并接受来自任务网络接口的请求。没有配置ns2 去往10.10.10.0/24网段的路由。在 FORWARD 链的最顶部插入规则,允许从。使用Libpcap捕获用户级别的网络数据包。ping失败,开启ipv4转发依旧失败。只有一条直连路由,没有去往。使用namespace完成。创建两个namespace。在ns2访问HTTP服务器。网段的路由,配置路由。重新查看路由表,添加成功。

2024-09-22 11:04:02 389

原创 http实现免密登录

你可以运行以下命令来验证远程URL是否更新成功,输出应该显示更新后的URL。: 使用生成的个人访问令牌更新远程URL。假设你的Gitee用户名是。打开终端并导航到你已经克隆的仓库目录。

2024-07-06 20:40:59 161

原创 出错记录笔记

显然这种方法太死板了,直接升级go版本到1.20,1.18在build时还是会报错。构建注释标记,它是在Go 1.17中引入的,所以需要升级版本或者加入。命令中包含了一个不正确的文件名或参数。将go可以mv到/usr/local/目录下,并配置环境变量。或者二进制文件安装的Go,需要手动删除Go的安装目录。这是因为go版本太低,Go 1.16版本不支持新的。2、yarn build构建项目报错。文件作为输入,但传递了一个非。解决办法:未安装yarn依赖包。重新bulid,显示成功。删除go环境重新下载。

2024-07-03 10:03:26 353

原创 Netlink机制实现内核用户间通信

Linux中内核与用户空间交互方式很多,比如/proc、ioctl,用户态通过标准的文件操作访问,比如procfs中的文件,内核态被动响应且无法主动向用户态发起通信,这种单向通信具有一定的局限性。Netlink通信机制完美克服了单向通信的不足,支持双工通信,允许内核主动发起通信,适用于用户空间与内核空间通信、用户空间两个进程通信。Netlink为用户空间进程提供了一个标准的基于套接字的接口,可以实现Linux内核与用户空间的双向数据传输。本文Netlink通信机制源码分析基于6.2版本。

2024-07-02 12:04:06 919

原创 信号量基础总结

在linux中信号量可以看作是一种睡眠锁,允许进程进入睡眠状态,其过程如下:存在一个 Task获得已占用的信号量,信号量将task推进等待队列让其处于睡眠状态,CPU处理其他任务,当signal被释放,则将处于等待队列睡眠的task唤醒,重获该信号量,由于争用信号量的进程在等待锁重新变为可用时会处于睡眠状态,故信号量适用于锁被长时间持有的状态。

2024-06-02 20:09:25 1053

原创 xdp学习—加载第一个BPF程序

xdp 提供了一种处理网络报文的高性能方案,之所以性能高,是因为 xdp 对报文的处理在报文进入 IP TCP 协议栈之前,避免了漫长而繁琐的协议栈处理过程, 也就是 xdp 在收到包时最早能处理包的地方进行处理。即网卡收到网络数据包并将其交付到IP/TCP协议栈之前插入XDP程序。

2024-04-29 11:14:39 1463

原创 记录错误——ubuntu连接vs code始终连接不上

分析报错一直显示写入的管道不存在,这是因为vs code在连接和ssh终端连接方式类似,因为之前在vs code 里面连接过该ip对应的服务器,win本地已经保存了该ip所对应服务器的密钥。删除ubuntu虚拟机之后重置ubuntu并配置,发现其分配的虚拟机ip与之前的一样,所以我们在重置服务器当该ip对应的服务器发生变化时,连接的时候发现远程服务器发回来的密钥跟之前的对不上了,导致连接失败,显示管道并不存在。win/用户下面找到.ssh文件夹找到。删除原先密钥j即可连接成功。

2024-04-25 12:02:21 797 2

原创 《操作系统真象还原》第一章 部署工作环境

/configure --prefix=/root/Ytest/bochs --enable-debugger --enable-disasm --enable-iodebug --enable-x86-debugger --with-x --with-x11 LDFLAGS='-pthread'(/root/Ytest/替换为自己的路径)keyboard:keymap=/root/Ytest/bochs/share/bochs/keymaps/x11-pc-us.map(路径替换)

2024-04-22 09:34:22 749 1

原创 监控端口流量

【代码】监控端口流量。

2024-04-22 09:25:42 197

原创 linux网络协议栈——TCP连接

(1)创建socket。(2)调用connect连接服务端地址和端口。(1)创建socket,服务端需要创建一个 socket 对象,用于监听传入的连接请求。(2)bind()绑定本地的IP/Port二元组用以定位,将创建的 socket 绑定到一个具体的 IP 地址和端口上,便于客户端寻找。(3)listen监听,监听绑定的地址和端口。

2024-04-20 14:06:55 1136 1

原创 进程调度—主动调度

调度程序主要涉及4个方面,分别是主动调度、周期调度、高精度时钟调度、进程唤醒时调度,本次分析主动调度。

2024-04-01 21:03:30 685 1

原创 中断

workqueue工作流程(1)workqueue由一个或多个worker线程池组成,每个worker线程都会不断地从workqueue中获取需要执行的工作项。(2)如果此时有延迟的work,将多个work组装成工作项添加到workqueue工作队列中。(3)工作者线程worker在空闲状态下可以从workqueue工作队列中取出一个work放在自己的私有队列等待执行。(4)当工作者线程worker完成当前的工作项,将会处理自己私有队列的下一个工作项。

2023-12-05 19:09:00 353 1

原创 工作队列workqueue

workqueue工作流程(1)workqueue由一个或多个worker线程池组成,每个worker线程都会不断地从workqueue中获取需要执行的工作项。(2)如果此时有延迟的work,将多个work组装成工作项添加到workqueue工作队列中。(3)工作者线程worker在空闲状态下可以从workqueue工作队列中取出一个work放在自己的私有队列等待执行。(4)当工作者线程worker完成当前的工作项,将会处理自己私有队列的下一个工作项。

2023-12-03 17:06:08 292 1

原创 TASK机制

tasklet的禁用可启用可能存在于不同的上下文,有可能在中断上下文中禁用tasklet但是在其他上下文中会重新启用tasklet,如果被禁用后在链表中将其移除,那么可能在重新启用它时会导致丢失某些需要延迟处理的任务,所以通常情况下会通常会保留禁用状态的。简单来说就是缩短task的工作时间。,该软中断会被特定的函数进行处理,执行所有的已经调度的tasklet,tasklet核心处理过程就是循环遍历获得链表上的每一个待处理的tasklet,进行一系列检查最终判定tasklet处于。tasklet的触发是在。

2023-11-28 21:27:37 166

原创 伙伴算法学习笔记

当程序在运行的时候需要更多的内存空间来存储数据,操作系统会根据请求给程序动态分配内存空间,分配的过程中可能会导致内存碎片,而且内核在频繁的请求和释放不同大小的一组连续页框的过程中肯定会导致在已经分配的块内分散许多小块的空闲页框,那么内存空间将会浪费,所以需要尽量避免产生内存碎片,所以引入伙伴算法对内存进行管理。

2023-10-28 21:21:23 251 1

原创 缺页异常处理-ebpf统计缺页时间

当一个进程执行时,如果cpu访问到一个有效的虚地址,但是此地址对应的物理页没有在内存中,那么cpu就会产生缺页异常。可能引起的情况:(1)访问用户栈的时,超出了当前用户栈的范围,需要扩大用户栈(2)当进程申请虚拟内存区域的时候,没有分配物理页,进程第一次访问的时候触发页错误异常(3)内存不足的时候,采用交换机制内存将会把进程的匿名页换出到交换区。

2023-10-24 10:25:30 789

原创 实验三:系统调用

系统调用中使用int 0x80来切换到内核态,使用内核中的系统函数来完成系统调用,我们进行系统调用的时候需要通过~/Desktop/tt/oslab/linux-0.11/lib目录下的close.c进入到system_call。返回值是拷贝的字符数。在linux-0.11/kernel下修改系统调用号的个数,系统调用号从0开始,我们将72修改成74,系统调用号增加两个,所以我们在后期要添加两个函数。解决方法:重新开启挂载,进入到~/oslab/hdc/usr/include/unistd.h进行宏定义。

2023-10-11 10:40:54 270 1

原创 实验二:操作系统的启动

bootsect.s与setup.s均位于linux-0.11内核源码boot目录下,setup.s和bootsect.s一样都是操作系统进入system的准备工作,其主要功能就是获取各种硬件参数,并将这些数据保存到内存0x90000处,也就是覆盖bootsect程序所在的空间,然后我们就可以进入保护模式啦,那么如何进入保护模式呢?

2023-10-11 10:15:27 228 1

原创 实验一:编译Linux0.11内核并在Bochs虚拟环境上运行

本机上搭建oslab实验环境,所需压缩文件分别为gcc-3.4.tar.gz以及hit-oslab-linux-20110823.tar.gz,并将文件下载到ubuntu系统内部,进行解压。基本环境Bochs+gcc-3.4+ Linux 0.11 源代码+ubuntu搭建hit-oslab集成环境。本次实验代码程序均在实模式下完成,所以需要8086汇编编译器以及连接器as86和ld86,我们需要进行安装。//在oslab/hdc/user/root下创建.c文件实现挂载。

2023-10-11 09:54:36 626 1

原创 打印进程控制块PCB相关信息

每当进程从用户态进入内核态都要使用进程内核栈,一旦进程进入内核态,cpu就会自动设置该进程的内核栈(内核的数据段),为了节省空间,我们把内核栈和thread_info放在一起,因为从用户态切换到内核态以后,内核态是空的,所以ESP堆栈寄存器直接指向内存区顶端,当我们向栈中写入数据时,ESP就会递减,而task_struct和thread_info都有一个域指向对方,由于PCB的内容越来越大,所以仅将thread_info放在内核栈空间中。(D不可中断的睡眠状态、R运行、S睡眠、T=跟踪、 Z僵尸进程);

2023-10-06 17:28:43 111 1

原创 体验进程的生命周期

通过调试可得,没有创建新进程fork之前只有父进程在执行,其PID为8136,直到进fork系统调用,产生子进程pid为8247,当pid大于0时候我们向下执行父进程操作遇到wait()函数,用status保存收集子进程8247退出时的一些状态,而子进程8247中加入exec函数族里面的excelp()进行进程替换,将其替换成/bin/ls程序,打印当前目录下的文件信息,父进程等待子进程执行完毕,进入sleep阶段,暂停4秒,exit退出程序。原型:void exit(int status);

2023-10-04 10:25:24 61 1

原创 QEMU+GDB调试内核环境

主要步骤:虚拟机(Parrales Desktop,vmware等均可)中安装Ubuntu下载linux kernel,编译生成bzImage配置busybox安装QemuGDB调试内核实现宿主机与qemu文件挂载,进行文件共享。

2023-09-27 18:26:52 960 3

原创 ubuntu22.04中搭建eBPF环境

Python及其开发头文件:如果计划使用BCC的Python绑定,请确保已安装Python及其开发头文件(python-dev或python3-dev软件包)。内核头文件:通常需要安装与使用的Linux内核版本相对应的内核头文件,因为BCC依赖于内核的内部结构,以正确地编译和与eBPF程序进行交互。分析python库版本不一致,解决复制已编译的bcc库中的python bcc库到python3的库中。分析 python默认是没有安装setuptools这个模块的,进行安装。Ubuntu环境下构建依赖关系。

2023-09-13 22:39:36 725 1

空空如也

空空如也

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

TA关注的人

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