当前位置: 首页 > news >正文

linux内核符号表

内核镜像的虚拟地址

不管内核被加载到什么物理地址 ,在虚拟地址转物理地址函数里面,都会根据实际的offset来转换

__virt_to_phys

1.通过判断最高有效位如果为1,则表示是(memory)DRAM的地址;直接虚拟地址偏移 + 物理内存起始地址

2.如果为0,则表示是kernel image的地址;直接虚拟地址 - (内核镜像起始虚拟地址 - 内核镜像起始物理地址);也即内核的虚拟地址偏移 + 内核镜像的物理内存起始地址

#define __virt_to_phys(x) ({						\
phys_addr_t __x = (phys_addr_t)(x);				\
__x & BIT(VA_BITS - 1) ? (__x & ~PAGE_OFFSET) + PHYS_OFFSET :	\(__x - kimage_voffset); })

符号表概念

符号表是记录了Linux内核中的符号列表以及对应符号在内存中的虚拟地址,符号其实就是Linux内核镜像中的变量和函数名称

静态和动态符号表

内核在编译过程中生成的System.map与proc/kallsyms的区别在于System.map是在编译阶段生成的内核符号表,我们可以称为静态Linux内核符号表,而proc/kallsyms方式看到的是在内核启动后生成的动态符号表。

符号表用来做什么

1.自己编写的内核模块中EXPORT_SYMBOL函数,其他的内核模块也可以通过extern声明后,能找到对应函数的地址,并进行调用

2.内核panic时,往往都会打印出调用栈,这个调用栈会打印一系列地址,通过使用符号表,会将这些地址转换为函数名

3.同样dump_stack也是通过符号表的查询,打印的对应函数名。

4.根据名称查到对应地址(内核中相关API),进行hook函数,实现更高级的debug功能,kprobe hook函数时就是利用符号表进行查询的对应地址。

模块的符号地址空间

通过adb shell cat proc/kallsyms > sys.txt导出动态符号表,可以看到编译时产生的静态符号,和加载模块产生的动态符号;

对于ARM构架的设备,模块挂载后,模块中包含的函数和静态变量的虚拟地址不在3G(0xC0000000)以上,而是3G以下一点的位置,可能以0xBF000000开始

......
c063df58 T setup_zone_pagesetc063df78 T init_currently_empty_zonec063dfcc T init_per_zone_wmark_minc063e024 T zone_pcp_updatec063e048 T _einittextbfe63000 t $t	[mfp]bfe63000 t fastpath_debug_store	[mfp]
......

insmod模块会调用sys_init_module

SYSCALL_DEFINE3(init_module, void __user *, umod,unsigned long, len, const char __user *, uargs)
{int err;struct load_info info = { };err = may_init_module();if (err)return err;pr_debug("init_module: umod=%p, len=%lu, uargs=%p\n",umod, len, uargs);err = copy_module_from_user(umod, len, &info);if (err)return err;return load_module(&info, uargs, 0);
}

load_module会调用module_alloc来分配虚拟地址给模块镜像,而且这个虚拟地址的范围就应该在:  MODULES_VADDR----MODULES_END

void *module_alloc(unsigned long size)
{gfp_t gfp_mask = GFP_KERNEL;void *p;/* Silence the initial allocation */if (IS_ENABLED(CONFIG_ARM_MODULE_PLTS))gfp_mask |= __GFP_NOWARN;p = __vmalloc_node_range(size, 1, MODULES_VADDR, MODULES_END,gfp_mask, PAGE_KERNEL_EXEC, 0, NUMA_NO_NODE,__builtin_return_address(0));if (!IS_ENABLED(CONFIG_ARM_MODULE_PLTS) || p)return p;return __vmalloc_node_range(size, 1,  VMALLOC_START, VMALLOC_END,GFP_KERNEL, PAGE_KERNEL_EXEC, 0, NUMA_NO_NODE,__builtin_return_address(0));
}

在/arch/arm/include/asm/memory.h;所以arm架构,如果是1/3的内核和用户空间的分配的话 ;模块的符号地址空间(MODULES_VADDR,MODULES_END)= (0xBF000000,0xC0000000)

#ifndef CONFIG_THUMB2_KERNEL
#define MODULES_VADDR		(PAGE_OFFSET - SZ_16M)
#else
/* smaller range for Thumb-2 symbols relocation (2^24)*/
#define MODULES_VADDR		(PAGE_OFFSET - SZ_8M)
#endif#if TASK_SIZE > MODULES_VADDR
#error Top of user space clashes with start of module space
#endif/** The highmem pkmap virtual space shares the end of the module area.*/
#ifdef CONFIG_HIGHMEM
#define MODULES_END		(PAGE_OFFSET - PMD_SIZE)
#else
#define MODULES_END		(PAGE_OFFSET)
#endif

相关文章:

  • 踩坑——纪实
  • VUE 页面生命周期基本知识点
  • 瑞芯微RV1126——ffmpeg环境搭建
  • 国产linux系统(银河麒麟,统信uos)使用 PageOffice 国产版在线编辑word文件,同时保存数据和文件
  • Springboot 自定义线程池 ThreadPoolTaskExecutor
  • 标准库算法
  • Android 观察者模式(OBSERVER)应用详解
  • Spring与Netty底层源码解析
  • 一个基于HOOK机制的微信机器人
  • 论文阅读--ViLD
  • 力扣226. 翻转二叉树(DFS的两种思路)
  • 开源模型应用落地-模型量化-Qwen1.5-7B-Chat-GPTQ-Int8(一)
  • 初见flyway
  • MongoDB 和 MySQL 的对比
  • Flutter 页面布局 Flex Expanded弹性布局
  • 【面试系列】之二:关于js原型
  • 78. Subsets
  • chrome扩展demo1-小时钟
  • Invalidate和postInvalidate的区别
  • iOS高仿微信项目、阴影圆角渐变色效果、卡片动画、波浪动画、路由框架等源码...
  • java架构面试锦集:开源框架+并发+数据结构+大企必备面试题
  • jquery cookie
  • mysql中InnoDB引擎中页的概念
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • Vue2 SSR 的优化之旅
  • vue-router的history模式发布配置
  • Vue官网教程学习过程中值得记录的一些事情
  • WebSocket使用
  • yii2中session跨域名的问题
  • 分布式任务队列Celery
  • 快速体验 Sentinel 集群限流功能,只需简单几步
  • 如何优雅地使用 Sublime Text
  • 学习笔记DL002:AI、机器学习、表示学习、深度学习,第一次大衰退
  • const的用法,特别是用在函数前面与后面的区别
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • 第二十章:异步和文件I/O.(二十三)
  • 扩展资源服务器解决oauth2 性能瓶颈
  • 通过调用文摘列表API获取文摘
  • ​LeetCode解法汇总2182. 构造限制重复的字符串
  • ​埃文科技受邀出席2024 “数据要素×”生态大会​
  • #LLM入门|Prompt#2.3_对查询任务进行分类|意图分析_Classification
  • $nextTick的使用场景介绍
  • ()、[]、{}、(())、[[]]命令替换
  • (26)4.7 字符函数和字符串函数
  • (4.10~4.16)
  • (java)关于Thread的挂起和恢复
  • (草履虫都可以看懂的)PyQt子窗口向主窗口传递参数,主窗口接收子窗口信号、参数。
  • (二)windows配置JDK环境
  • (力扣题库)跳跃游戏II(c++)
  • (四)七种元启发算法(DBO、LO、SWO、COA、LSO、KOA、GRO)求解无人机路径规划MATLAB
  • (贪心) LeetCode 45. 跳跃游戏 II
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (一)模式识别——基于SVM的道路分割实验(附资源)
  • (原创)攻击方式学习之(4) - 拒绝服务(DOS/DDOS/DRDOS)