kernel-learn:源码解析

cpp 复制代码
void kfree(const void *x)
{
	struct page *page;
	void *object = (void *)x;

	trace_kfree(_RET_IP_, x);

	if (unlikely(ZERO_OR_NULL_PTR(x)))
		return;

	page = virt_to_head_page(x);
	if (unlikely(!PageSlab(page))) {
		unsigned int order = compound_order(page);

		BUG_ON(!PageCompound(page));
		kfree_hook(object);
		mod_lruvec_page_state(page, NR_SLAB_UNRECLAIMABLE_B,
				      -(PAGE_SIZE << order));
		__free_pages(page, order);
		return;
	}
	slab_free(page->slab_cache, page, object, NULL, 1, _RET_IP_);
}
EXPORT_SYMBOL(kfree);

kfree源码,virt_to_head_page 是一个将虚拟地址转换为 struct page 结构的函数。会根据给定的x查找出相应的page结构体。

PageSlab(page) 是 Linux 内核中的一个宏,用于判断给定的 struct page 是否属于 slab 分配器(slab allocator)管理的内存。

unlikely是编译预测分支优化,不用管。

所以说,当我们释放一个object的时候,kernel判断它属于的page是否属于slab分配器管理。

从kernel pwn的角度,我们不能释放一个无效地址,至少对于slab管理器而言,但是我们可以释放slab管理器管理的页的任意地址(或许有对齐,但笔者还没看到)。

相关推荐
计算机魔术师几秒前
Fable 5.1 来了,智能体任务成本降 45%——Anthropic 这次为何降价这么狠
前端
Csvn1 分钟前
现代 CSS 新特性深度:container query、:has()、@scope 与 subgrid
前端
计算机魔术师6 分钟前
Anthropic 自己承认:模型越来越难管住了
前端
两只羊ovo15 分钟前
Agent 干活的底层地基:path 路径 + fs 文件系统,一次讲透
前端
一用书生16 分钟前
我给 ChatGPT、DeepSeek、Kimi 都加了一个「保存为笔记」按钮
前端·ai编程·vibecoding
咖啡无伴侣18 分钟前
1. 从零搭建企业级 Monorepo 工程化模板:初始化、应用创建与共享 TypeScript 配置
前端·前端框架
moonsims19 分钟前
再议AiBrainBox-V的前左右三目布局-满足多目SLAM算法;对比单下视VIO(低空、地面纹理丰富、飞行速度适中无人机 )&多目VIO
前端·人工智能·量子计算
AI编程实验室20 分钟前
Agent Handoff 自动跟踪 Skill:安装、事件映射与证据分级
前端·ai编程
KoPa20 分钟前
HeySmart:事件总线——异步解耦的艺术
前端·后端
金花顺21 分钟前
ndroid 音频系统:AudioTrack 源码深度解析(从 Java 构造到 Native 启动)
前端·架构