- 博客(14)
- 收藏
- 关注
原创 linux内存管理——虚拟地址转换为物理地址实战
当然上面的分析中有一个问题,我们是通过pgd的虚拟地址来读取内存的,而其它的pud、pmd、pte等都是通过物理地址来读取内存,pgd的虚拟地址对应的物理地址该怎么计算呢,很明显它是一个内核空间的虚拟地址,通过init_mm.pgd(即swapper_pg_dir)按照上面的方法可以找到物理地址,然后init_mm.pgd也是个虚拟地址,它的物理地址又怎么得到呢,有可能是内核初始化的早期通过固定映射的方式将虚拟地址和物理地址关联起来(后面再看看相关代码吧)。说明字符串a的虚拟地址是0x402004。
2024-01-11 13:34:31
1499
原创 linux scsi子系统 ----相关数据结构在内存中的联系
bus_subsys_private和class_subsys_private指的都是内核中的subsys_private,但为了区分所以分开表示。简单记录,不是标准类图,只是为了将相关数据结构联系起来。首先是基本的设备——总线——驱动模型。接下来是scsi相关数据结构的关系。下图截取自《存储技术原理》下图截取自《存储技术原理》
2024-01-03 17:00:09
462
原创 linux内存管理----伙伴系统初始化
内核:X86 openeuler4.19内存大小3G,采用的是sparse vmemmap内存模型,相关config如下。
2023-12-12 15:52:33
1294
原创 linux zram
使用zram的第一步是加载zram模块:modprobe zram(可通过添加num_devices参数指定zram设备的数量,默认一个zram0)。
2023-11-19 16:41:46
493
原创 linux cgroup (4)----attach task
当向一个cgroup目录的tasks节点写入一个pid时,调用该cftype对应的write方法cgroup1_tasks_write,该方法找到pid对应的struct task,将其作为参数调用cgroup_attach_task.
2023-11-05 16:55:01
291
原创 linux cgroup (3)----mkdir
通过这个流程可以看出来,cgroup树的层级关系由cgroup_subsys_state维护,每个cgroup包含一个css用于维护这个树,另外还有数个css,其由对应子系统的css_alloc函数分配,其ss指向对应的子系统。子系统的css_alloc函数会分配一个各子系统对应的cgroup结构(如mem_cgroup、blkcg等),其第一个成员就是一个css结构。
2023-11-05 13:13:36
130
原创 linux cgroup (2)----mount
cgroup的mount首先创建一个cgroup_root,然后将指定子系统从源cgroup_root迁移到新创建的cgroup_root。
2023-11-05 12:23:02
191
原创 linux cgroup (1)----初始化
init_css_set 和init_cgroup(cgrp_dfl_root->cgrp)的subsys数组前三项被填充,因为cpuset cpu cpuacct三个子系统在这个阶段需要初始化经过cgroup_init后,各个子系统被初始化,init_css_set 和cgrp_dfl_root->cgrp的subsys数组被填充,两者之间通过一个cgrp_cset_link建立连接。此时系统中仅有一个cgroup_root: cgrp_dfl_root。
2023-11-04 22:00:35
262
原创 linux cgroup (0) ----cgroup子系统
内核定义的cgroup子系统在include/linux/cgroup_subsys.h中声明,可通过全局变量cgroup_subsys数组访问。包括cpuset、 cpu、 cpuacct、 io、 memory、 devices、 freezer、 net_cls、 perf_event、 net_prio、 hugetlb、 pids、 rdma、 debug。由宏控制是否启用IS_ENABLEDIS_ENABLEDIS_ENABLEDIS_ENABLEDIS_ENABLED。
2023-11-04 21:59:03
144
原创 linux IO
arm64 kernel5.0一、数据结构一)generic block layergendiskstruct gendisk { /* major, first_minor and minors are input parameters only, * don't use directly. Use disk_devt() and disk_max_parts(). */ int major; /* major number of driver */ int first_min
2023-04-20 14:24:09
364
1
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人