- 博客(25)
- 收藏
- 关注
原创 进程与cgroup
int level;//当前 cgroup 在层次结构中的深度//分别表示当前 cgroup 子树中存活的和正在销毁的 cgroup 数量//这是一个数组,资源列表//指向当前 cgroup 所属的 cgroup_root//关联的 css_set//存储与当前 cgroup 关联的 PID 列表。//存储当前 cgroup 的所有祖先...//表示该 cgroup 层次结构在内核文件系统中的根节点。
2025-03-09 10:08:28
596
原创 Linux6.1内核中maple_tree的应用--find_vma
在Linux6.1版本之前,内核中对于虚拟地址空间(VMA)是基于红黑树+双向链表进行实现的,之所以选取两种数据结构组织,是因为红黑树的查询效率较高,但遍历的时间复杂度也高,而双向链表适合遍历,但查询的效率低下。因此内核采用这两种数据结构进行管理,来取长补短。红黑树的修改需要同步到双向链表红黑树的平衡操作,会影响多个节点。在Linux6.1版本,对VMA的管理被替换成maple_tree。这种数据结构按照无锁的方式进行设计,使用Linux中的线程安全RCU无锁编程来实现。union {
2024-12-06 21:09:51
1242
1
原创 内存规整部分源码学习笔记
页面分配器按照zone的水位线来管理,zone的水位分为3个等级,分别是High、low、min。最低水位下的内存是系统预留的内存,通常情况下,普通优先级的请求是不能访问系统预留内存的,只有在特殊情况下,这些系统预留的内存才能被使用。
2024-10-15 11:56:42
852
原创 虚拟内存管理之进程地址空间
当一个程序经过编译链接之后,使用的是虚拟地址。其形成的虚拟地址空间由该mm_struct数据结构进行抽象。在64位的系统中,用户进程的虚拟地址空间最多可以是256TB,为了有效管理整个虚拟地址空间,内核中采用数据结构来描述,简称 VMA,在mm_strut数据结构中有相应的成员来组织管理每个用户进程的 VMA。下面将从一个程序,来通过来查看该程序的VMA。
2024-10-10 17:07:33
1030
原创 伙伴系统之内存碎片化管理
本文从开始分析,到rmqueue()及其相关函数,并对于伙伴系统中处理碎片化的原理进行介绍。源码注释链接:https://github.com/gaoyixiang1/Linux_SourceCode。
2024-07-18 20:37:10
896
原创 页面分配之快速路径及慢速路径
分配物理页面涉及到页面回收、内存规整、直接回收内存等,这里分析在内存充足下的快递路径分配以及内存不充足的情况下的慢速路径分配。
2024-07-15 14:10:07
658
原创 报错:Could not get lock /var/lib/dpkg/lock-frontend解决
在安装软件包的时候出现如下错误。重新运行刚刚的命令,成功运行!
2024-07-01 22:47:08
553
原创 记一次报错:prog failed to find kernel BTF type ID of -3 && 动态挂载fentry和fexit
在eBPF中,fentry和fexit通常用于监控和追踪内核函数的入口和出口。fentry和fexit,类似于kprobe和kretprobe。
2024-05-17 20:29:49
618
原创 CPU负载
在内核启动阶段,每个cpu的cpu_load数组会被初始化为0,在运行过程中,一般每个时钟节拍都会在scheduler_tick中通过__update_cpu_load更新cpu_load数组。对于单核CPU来说,当数值低于1时,表示负载良好,对于CPU的利用率为0-100%,如果负载高于1,则表示CPU利用率100%,但会有可运行的进程在排队。但如果CPU处理能力处于过饱和状态(如图3),那么有一部分的可运行进程不能及时获取CPU资源,此时CPU利用率为100%,但CPU负载则超过100%。
2024-05-02 21:30:00
4268
2
原创 进程及进程主动调度
进程 = 程序 + 执行,进程可以说是某种类型的活动,它包含程序、输入、输出及状态等线程是操作系统调度(资源及时间片)的最小单元。一个进程可以拥有多个线程。进程和线程的区别在于进程拥有独立的资源空间,即进程地址空间,而同一进程的线程则共享进程地址空间。在Linux内核中,对于进程及线程都使用相同的数据结构。进程是资源分配的最小单位,而线程是CPU调度的的最小单位。进程的虚拟地址空间分为用户虚拟地址空间和内核虚拟地址空间,所有进程共享内核虚拟地址空间,没有用户虚拟地址空间的进程称为内核线程。
2024-04-26 13:16:32
669
1
原创 eBPF挂载函数小结
在C或C++应用程序中,可以使用DTrace或SystemTap的API定义USDT探针,如下通过安装之后,就能通过使用宏来定义usdt,最多可以包含有12个参数。// 触发 USDT 跟踪点return 0;
2024-04-25 14:19:26
706
原创 记一次usdt报错:Fail to attach [Bad file descriptor]
并且在我的用户态文件中被正确挂载了,再看了一下函数,没有返回值,没有return,于是猜想会不会因为是没有return值,导致在attach_usdt中,path路径的文件无效了。经过本次遇到的错误,以后在写代码的时候,要注意函数的返回值类型,及必要返回。,猜测是文件描述符有问题,再仔细看看用户态代码,打印了链接库路径。编译并运行上述测试文件pth,其进程号为90281,于是打开了。于是我重新看了一下我的bpf.c文件,发现我在bpf.c中有两个。文件,该文件包含了进程地址空间的内存映射信息。
2024-04-25 14:13:44
314
原创 奔跑吧Linux内核---第6章简单的字符设备驱动(2)
1.用户空间进程调用read() 方法2.通过系统调用进入驱动程序的read() 方法3.若缓冲区有数据,则把数据复制到用户空间的缓冲区中4.若缓冲区没有数据,则需要把数据从设备中读出来,硬件IO设备是一个慢速设备,不知道什么时候会将数据准备好,因此此时进程需要睡眠等待5.当硬件数据准备好,唤醒正在等待的进程来读取数据非阻塞IO类型:进程发起IO系统调用后,如果设备驱动的缓冲区没有数据的话,那么进程返回错误而不会被阻塞。如果设备驱动的缓冲区中有数据,则设备驱动把数据直接返回给用户进程。
2023-11-23 09:11:53
161
原创 奔跑吧Linux内核---第6章简单的字符设备驱动(1)
Linux设备驱动模型是一种抽象,为内核建立起统一的设备模型。其目的是:提供一个对系统结构的一般性抽象描述。Linux设备模型跟踪所有系统所知道的设备,以便让设备驱动模型的核心程序协调驱动与新设备之间的关系。,设备也是如此,Linux操作系统把设备纳入文件系统的范畴来管理。第一、每个设备都对应一个文件名,在内核中也就对应一个索引节点。第二、对文件操作的系统调用大都适用于设备文件。第三、从应用程序的角度看,设备文件逻辑上的空间是一个线性空间(起始地址为0,每读取一个字节加1)。
2023-11-18 14:27:24
195
1
原创 哈工大李治军OS实验3-系统调用
为了唯一的标识每一个系统调用,Linux为每-一个系统调用定义了一个唯一的编号,此编号称为系统调用号。系统调用号的另一个目的是作为系统调用表的下标,当用户空间的进程执行一个系统调用的时候,这个系统调用号就被用来指明到底是要执行哪个系统调用。 每一个系统调用foo()在内核态都有一个对应的内核函数sys_ foo(),这个内核函数就是系统调用foo()的实现,也就是说在用户态调用foo(),最终会由内核函数sys_ foo()为用户服务,这里的sys_foo()就是系统调用服务例程。
2023-10-11 14:04:47
325
2
原创 进程控制块学习
其次学习了进程相关的代码,对书写代码方面有很大提升,在传参部分我遇到了问题,用了find__task_by_pid()这个函数后编译的时候发现报错,于是在源码里面搜索这个函数也没找到,然后问了chatgpt,大概的解释就是版本问题或者操作系统,然后chatgpt又推荐了相关函数,我在源码里面找到之后学习了相关函数并应用到代码之中,最终能实现从给定的pid号找到对应的PCB,这次实验收获很大!因此可以通过以前学习的链表的相关知识,遍历系统中的进程链表,进而访问每一个进程的PCB,从而打印进程的相关信息。
2023-10-07 13:33:54
179
1
原创 Ubuntu20.04安装Docker
来查看,我的虚拟机内核版本是5.15.0,是Ubuntu20.04版本。这是一个测试例子,由docker自动下载执行的。要求内核的版本高于3.10,这个内核版本可以用。1.设置存储库,以便于Doker可以正常运行。2.添加 Docker 官方 GPG 密钥。,查看docker服务是否已经启动。我怀疑是源的问题,于是更换了阿里源。3.添加 Docker 软件源。4.安装Docker。
2023-09-29 17:41:19
683
原创 虚地址到物理地址的转换
MMU的转换分为两部分,分段机制和分页机制,如果没有打开分页机制的话,默认就是分段机制,则得出的线性地址就是物理地址。如果打开了分页机制,就需要引入页表的概念。
2023-09-29 17:36:09
2532
原创 操作系统真相还原--第三章--完善MBR
由于loader会加载一些段描述符等数据结构,而这些段描述符在以后也会用到,因此loader在加载到内存之后不能被覆盖,并且,我们希望给内核留足够多的空间,所以尽量把loader放在低处,由表2-1可知道,0x500~0x7BFF 和 0x7E00~9FBFF 这两段内存区域都是可用区域,于是我们选取0x900。如图所示,0xb8000是用于文本模式显示适配器,在这里,显示器显示每个字符需要占两个连续的字节,低字节是字符的ASCII码,高字节是字符的属性,如下图所示。回车启动之后,输入c即可看见。
2023-06-27 19:00:21
164
1
原创 vscode远程连接deepin出错:过程试图写入的管道不存在的解决方法
背景:昨天我用vscode使用ssh远程开发还处于正常状态,今天刚打开电脑,并启动deepin,再次使用vscode重新连接就出现异常。意思就是22号默认端口连接被拒绝,所以要先确定ssh是否连接。3.重新进入vscode里面,重新连接,如图成功连接。,查看port后面的端口号是不是22号。1.检查sshd是否启动。
2023-06-26 18:05:36
2619
1
原创 操作系统真相还原--第2章-编写MBR主引导记录,让我们开始掌权
首先,DOS1.0要求的最小内存为32KB,其次mbr大小512B,在为mbr所用的栈分配空间,估计1KB够用,最后mbr要留出足够多的空间,防止自己被破坏,因此放在32KB的最后1KB,即32KB-1KB=0x7c00。这个规定,作者的理解是mbr是主引导程序,如果不事先告诉BIOS mbr位于哪里,BIOS会花费时间去检测mbr,而0盘0道1扇区是磁盘的第一个扇区(CHS方法),也是BIOS第一个检测的扇区,如果mbr存放在这里,就能很快找到mbr,然后BIOS就可以把接力棒交给mbr了。
2023-06-25 13:42:24
207
原创 操作系统真相还原--第1章--部署工作环境
下载完成之后,放在虚拟机的某位置(我在Desktop上放着),然后使用。然后在输入框依次输入以下,输入一个,按一次回车。,在bochs目录里面即将安装bochs。⑤在bochs目录下配置。,并写入修改相关路径信息。至此,bochs安装完成。② 准备一个空目录,
2023-06-25 13:36:12
195
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人