首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何从具有内核读写能力的ARM64程序中获取swapper_pg_dir地址?

从具有内核读写能力的ARM64程序中获取swapper_pg_dir地址的方法如下:

  1. 首先,了解swapper_pg_dir的概念:swapper_pg_dir是Linux内核中用于管理页表的数据结构,它存储了整个内核的页表信息。
  2. 在ARM64架构中,swapper_pg_dir的地址可以通过读取特定寄存器来获取。在ARM64中,swapper_pg_dir的地址存储在TTBR0_EL1寄存器中。
  3. 在ARM64程序中,可以使用汇编语言或内联汇编的方式来读取TTBR0_EL1寄存器的值,从而获取swapper_pg_dir的地址。
  4. 下面是一个示例的C代码片段,展示了如何使用内联汇编来获取swapper_pg_dir的地址:
代码语言:txt
复制
#include <stdio.h>

unsigned long long get_swapper_pg_dir_address() {
    unsigned long long swapper_pg_dir_address;
    asm volatile("mrs %0, ttbr0_el1" : "=r" (swapper_pg_dir_address));
    return swapper_pg_dir_address;
}

int main() {
    unsigned long long address = get_swapper_pg_dir_address();
    printf("swapper_pg_dir address: 0x%llx\n", address);
    return 0;
}
  1. 编译并运行上述代码,即可获取到swapper_pg_dir的地址。

需要注意的是,获取swapper_pg_dir地址需要在具有内核读写能力的ARM64程序中进行,因此需要在特权模式下执行该程序。同时,获取swapper_pg_dir地址可能涉及到系统的安全机制,因此在实际应用中需要谨慎操作,并遵循相关的安全规范和法律法规。

关于腾讯云相关产品和产品介绍链接地址,由于要求不提及具体品牌商,无法提供相关链接。但腾讯云提供了一系列云计算相关的产品和服务,可以根据具体需求在腾讯云官网进行查找和了解。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

启动期间内存管理之pagging_init初始化分页机制--Linux内存管理(十四)

可用虚拟地址空间按3:1比例划分给用户空间和内核空间, 虚拟地址空间低端3GB 用于用户状态应用程序, 而高端1GB则专用于内核....这些划分主要动机如下所示 在用户应用程序执行切换到核心态时(这总是会发生,例如在使用系统调用或发生周期性时钟中断时),内核必须装载在一个可靠环境。...如果所有物理内存页都映射到用户空间进程能访问地址空间中, 如果在系统上有几个应用程序在运行, 将导致严重安全问题. 每个应用程序都能够读取和修改其他进程在物理内存内存区....由于内核地址空间偏移量0xC0000000开始,即经常提到3 GiB,每个虚拟地址x都对应于物理地址x—0xC0000000,因此这是一个简单线性平移。...由于内核虚拟地址空间只有1 GiB,最多只能映射1 GiB物理内存。IA-32系统(没有PAE)最大内存配置可以达到4 GiB,引出一个问题是,如何处理剩下内存? 这里有个坏消息。

1.3K20

Linux内核页表管理-那些鲜为人知秘密

1)应用程序 访问虚拟内存即可如执行指令、读写内存, 没有权限管理页表 不管虚拟内存如何转换为物理内存,对应用来说透明。...2.找到L0级转换表,然后虚拟地址获得L0索引,通过L0索引找到相应表项(arm64称为L0表描述符,内核叫做PGD表项),表项获得L1转换表基地址。...3.找到L1级转换表,然后虚拟地址获得L1索引,通过L1索引找到相应表项(arm64称为L1表描述符,内核叫做PUD表项),表项获得L2转换表基地址。...4.找到L2级转换表,然后虚拟地址获得L2索引,通过L2索引找到相应表项(arm64称为L2表描述符,内核叫做PUD表项),表项获得L3转换表基地址。...5.找到L3级转换表,然后虚拟地址获得L3索引,通过L3索引找到页表项(arm64称为页描述符,内核叫做页表项)。

1.9K22
  • copy_{to, from}_user()思考

    其背后思想是:在内核态,如果程序试图访问一个尚未被提交物理页面的用户空间地址内核必须对此保持警惕而不能像用户空间那样毫无察觉。...如果用户空间copy数据到内核空间,用户空间地址to及to加上copy字节长度n必须位于用户空间地址空间。 如果内核空间copy数据到用户空间,当然也需要检查地址合法性。...因此,ARM64进程切换时候,只需要改变ttbr0_el1值即可。ttbr1_el1可以选择不需要改变,因为所有的进程共享相同内核空间地址。...当进程切换到内核态(中断,异常,系统调用等)后,如何才能避免内核态访问用户态地址空间呢?其实不难想出,改变ttbr0_el1值即可,指向一段非法映射即可。...__uaccess_ttbr0_disable对应C语言实现可以参考这里。如何允许内核态访问用户空间地址呢?

    80710

    Linux内存初始化(下)

    前两步在linux里分别对应如下操作: fixed map 加载dtb :Uboot会将kernel image和dtb拷贝到内存,并且将dtb物理地址告知kernel 系统解析dtb里内存参数:...map_mem(pgd):将memblock子系统添加物理内存进行映射(将物理地址映射到线性区域) 主要是完成通过memblock_add添加到系统物理内存映射,注意如果memblock设置了MEMBLOCK_NOMAP...「Linux是如何组织物理内存?」...,内核会将整个struct page映射到内核虚拟地址空间vmemmap区域,所以我们可以简单认为struct page地址是vmemmap,则: vmemmap+pfn地址就是此struct...最后 至此linux对物理内存初始化和虚拟地址和物理地址映射关系算是告一段落,相信你已经知道 linux 虚拟寻址空间layout来龙去脉,以及如何把物理内存通过node, zone, page

    3.1K31

    深入理解Linux内核之主调度器(下)

    ,如果是则不需要进行地址空间切换(实际上指的是用户地址空间),因为内核线程总是运行在内核态访问内核地址空间,而内核地址空间是所有的进程共享。...在arm64架构内核地址空间是通过ttbr1_el1来访问,而它内核页表在内核初始化时候已经填充好了,也就是我们常说swapper_pg_dir页表,后面所有对内核地址空间访问,无论是内核线程也好还是用户任务...,统统通过swapper_pg_dir页表来访问,而在内核初始化期间swapper_pg_dir页表地址已经加载到ttbr1_el1。...会就将prev进程 x19-x28,fp,sp,lr保存到prev进程tsk.thread.cpu_context,next进程这些寄存器值next进程tsk.thread.cpu_context...4.3 精美图示 这里给出了进程切换图示(以arm64处理器为例),这里prev进程切换到next进程。 ? 5.进程再次被调度 当进程重新被调度时候,原来调度现场恢复执行。

    1.2K20

    深入理解Linux内核内核线程(上)

    1.开场白 环境: 处理器架构:arm64 内核源码:linux-5.11 ubuntu版本:20.04.1 代码阅读工具:vim+ctags+cscope 在linux系统, 我们接触最多莫过于用户空间任务...本文力求与完整介绍完内核线程整个生命周期,如内核线程创建、调度等等,当然本文还是主要从内存管理和进程调度两个维度来解析,且不会涉及到具体内核线程如kswapd实现,最后我们会以一个简单内核模块来说明如何在驱动代码来创建使用内核线程...3.内核线性是没有地址空间概念,准确来说是没有用户地址空间概念,使用是所有进程共享内核地址空间,但是调度时候会借用前一个进程地址空间。...实际上,kthreadd创建内核线程就是请求创建内核线程外壳,只不过创建完成之后并没有马上执行线程执行函数,这和用户空间执行程序很相似:一般在shell执行程序,首先shell进程通过fork...创建一个子进程,然后子进程调用exec来加载新程序

    2.4K20

    Linux内存管理与KSMA攻击

    KSMA全称是Kernel Space Mirror Attack,即内核镜像攻击。本文主要记录对该攻击方法原理分析以及Linux内核相关内存管理部分。...虚拟地址[63:39]用来区分用户空间和内核空间,从而在不同TTBR(Translation Table Base Register)寄存器获取Level1页表基址,内核地址用TTBR1(代表EL1...代码中看Linux启动过程(arch/arm64/kernel/head.S): ENTRY(stext) bl preserve_boot_args bl el2_setup...操作系统PGD分为两个部分,一部分是内核PGD,保存在swapper_pg_dir(TTBR1),用户PGD则独立存放。...size是256GB,但实际上一般只用了1G左右,其余部分没有物理地址映射,因此访问会产生段错误,我们可以利用这些虚拟地址去映射内核物理地址,假设映射va=0xffffffc200000000开始,则

    1.4K40

    ARM64 Kernel Image Mapping变化

    . += IDMAP_DIR_SIZE;swapper_pg_dir = .;. += SWAPPER_DIR_SIZE; 链接脚本可以看到预留6个页面存储页表项。紧跟在bss段后面。...如何填充页表页表项 链接脚本vmlinux.lds.S文件可以找到kernel代码起始代码段是".head.text"段,因此kernel代码起始位置位于arch/arm64/kernel/head.S...另外我们同样链接脚本得到_text和_end两个变量,分别是kernel代码链接开始和结束地址。编译器链接地址实际上就是最后代码期望运行地址。...virt_to_phys宏作用是将内核虚拟地址转换成物理地址(针对线性映射区域)。...因此获取运行地址虽然是虚拟地址,但是它和实际运行物理地址相等。 x4寄存器保存是kernel image运行虚拟地址。你是不是又好奇这个地方为什么获取运行地址和物理地址不相等呢?

    2.3K40

    armv8arm64 PAN深入分析

    1、armv8 PAN指的是内核态不能访问用户态数据,如果内核态想访问用户态数据,需要copy_from_user,copy_to_user。 2、那么PAN是如何实现呢?...,原理是将ttbr0_el1寄存器置为0,ttbr0_el1实际上保存是一级页表地址,所以ttbr0_el1被置零以后,内存页寻址失败,PAN生效。...uaccess_ttbr0_enablethread_info读取正确用户态页表机制,然后恢复ttbr0_el1,这样就可以访问用户态页表了,PAN失效。 3、什么时候调用这两个函数呢?...因为已经返回了用户态,用户态当然可以访问用户态页表了。 2)当内核态发生中断、系统调用kernel_entry时;返回内核态kernel_exit时。...如上面代码,kernel_entry,此时el为1,此时如果已经设置了PAN生效(用户态到内核态时设置),则不会重新设置。且spsrPAN标志位置1。

    4.2K50

    通过fork来剖析Linux内核内存管理和进程管理(上)

    _el1(只考虑阶段1el0和el1地址转换),内核在初始化时候会将主内核页表swapper_pg_dir地址存放在ttbr1_el1,进程切换时候将进程tsk->mm->pgd存放在ttbr0...说完了内核线程我们来看看用户任务是如何切换地址空间。...,那么就从ttbr0_el1获取这个地址,然后就会根据ttbr0_el1找到属于当前进程在fork时创建pgd页,然后结合虚拟地址就可以遍历各级页表表项(当然会由缺页异常来分配各级页表并填充相应表项...2)访问内核空间虚拟地址 访问内核空间虚拟地址,也会首先从tlb查找对应表项,找不到就会ttbr1_el1开始遍历各级页表,然后最终将叶子表项(即是最后一级页表表项)填充到tlb,并返回物理地址...没有找到就要接受系统惩罚,需要遍历多级页表项然后获得所需要表项表项获得物理地址,这个过程呢需要根据是用户空间虚拟地址还是内核空间虚拟地址ttbr0_el1或 ttbr1_el1开始遍历多级页表

    1.9K32

    如何用扫描仪控制恶意程序隔离网络获取数据(含攻击演示视频)

    近期,一群来自以色列安全研究专家发明了一种能够物理隔离网络窃取数据新技术。研究人员表示,他们可以通过扫描仪来控制目标主机恶意软件,然后从这台物理隔离网络计算机提取出目标数据。...研究人员在他们发表研究报告说到: “攻击者首先需要向一台平板扫描仪发送光脉冲信号,当平板扫描仪接收到了这些信号之后,目标主机恶意软件会将信号携带控制命令提取出来。...在真实攻击场景,攻击者甚至还可以利用一架配备了激光枪无人机(办公室窗户外向扫描仪发射光信号)来发动攻击。...这也就意味着,一个64位消息块则需要大约3秒钟时间,而恶意软件可以实时读取光信号携带数据。 在研究人员所进行另一项测试,他们通过这项技术发动了一次勒索攻击。...当时,他们身处一台停在停车场汽车,并在车内通过光脉冲信号加密了目标主机数据。

    5.3K90

    Linux内存初始化(上)

    identity map:是指把idmap_text区域物理地址映射到相等虚拟地址上,这种映射完成后,其虚拟地址等于物理地址。idmap_text区域都是一些打开MMU相关代码。...在执行setup_arch,会最先进行early_fixmap_init(),这个函数就是用来map dtb,但是它只会建立dtb对应这段物理地址中间level页表entry,而最后一个level...系统内存布局: 完成dtbmap之后,内核可以访问这一段内存了,通过解析dtb内容,内核可以勾勒出整个内存布局情况,为后续内存管理初始化奠定基础。...该节点有一个bootargs属性,该属性定义了内核启动参数,比如mem= xx,此外,还处理initrd相关property,并保存在initrd_start和initrd_end这两个全局变量。......... } reserve内核代码、数据区等(_text到_end那一段,具体内容可以参考内核链接脚本) 保留initital ramdisk image区域(initrd_start到initrd_end

    2.7K31

    Linux内存初始化

    identity map:是指把idmap_text区域物理地址映射到相等虚拟地址上,这种映射完成后,其虚拟地址等于物理地址。idmap_text区域都是一些打开MMU相关代码。...在执行setup_arch,会最先进行early_fixmap_init(),这个函数就是用来map dtb,但是它只会建立dtb对应这段物理地址中间level页表entry,而最后一个level...系统内存布局: 完成dtbmap之后,内核可以访问这一段内存了,通过解析dtb内容,内核可以勾勒出整个内存布局情况,为后续内存管理初始化奠定基础。...该节点有一个bootargs属性,该属性定义了内核启动参数,比如mem= xx,此外,还处理initrd相关property,并保存在initrd_start和initrd_end这两个全局变量。.........} reserve内核代码、数据区等(_text到_end那一段,具体内容可以参考内核链接脚本) 保留initital ramdisk image区域(initrd_start到initrd_end

    2.9K21

    详解Android内核安全

    TSYNC功能可以实现从多线程程序中使用Seccomp-BPF。这种能力仅限具有seccomp支持上游架构:ARM、ARM64、x86 和 x86_64。...在以下上游补丁程序集中实现了对此项要求支持: arm64 已标记地址 ABI arm64:对传递给内核用户指针取消标记 mm:避免在 brk()/mmap()/mremap() 创建虚拟地址别名...arm64:验证内核线程调用 access_ok() 已标记地址 Android-4.14及更高分支通用Android内核以向后移植形式提供这些补丁程序,但 Android 10专属分支...TBI需要一个兼容内核,以便正确处理用户空间传递已加标记指针。4.14(Pixel 4) 及更高版本Android通用内核具有必需TBI补丁程序。...返回地址也存储在常规堆栈,以便与展开程序兼容,但除此之外就没有用处。这样可以确保攻击行为(修改常规堆栈上返回地址)不会对程序控制流造成任何影响。

    1.5K30

    Linux内存描述之高端内存--Linux内存管理(五)

    物理地址0开始,那么程序逻辑地址从一开始也是0开始 对于任何用户进程,0~3G映射都是不同,但是所有用户进程3~4G映射都是相同 一个进程用户态切入到内核态,MMU映射不需要变。...那么如内核如何借助128MB高端内存地址空间是如何实现访问可以所有物理内存?...当创建一个新进程时,都要为新进程创建一个新页面目录PGD,并从内核页面目录swapper_pg_dir复制内核区间页面目录项至新建进程页面目录PGD相应位置,具体过程如下: do_fork()...在该情景我们势必涉及到用户空间向内核空间传递数据问题,name是用户空间中地址,它要通过系统调用设置到内核某个地址。...内核页全局目录在编译时静态地定义为swapper_pg_dir数组,该数组物理内存地址0x101000处开始存放。

    12.5K23

    Fixmap机制深入分析

    页表切换等。...3.1.2 FIXMAP地址空间拓扑 Kernel对Fixmap区域做了进一步划分,各区间是在enum fixed_addresses 枚举类型定义(/arch/arm64/include/asm/...)获取虚拟地址,物理地址为UART在SOC实际分配地址(该物理地址来自于command lineearlycon=XXX),然后通过向bm_pte写入页表,即可以完成映射。...5~圈7代码将暂存页表内容拷贝到swapper_pg_dir,同时切换ttbr寄存器,此后CPU发出虚拟地址就可以通过这套新建页表进行虚实转换了; 圈8清除pgdp映射; 圈9代码释放刚才申请物理页...; 3.5.2 paging_initfixmap 上图 圈6代码是把临时页表拷贝到swapper_pg_dir,临时页表物理页是memblock分配器获得物理地址

    1.8K41

    ARM64 SMP多核启动(下)- PSCI

    ,其中会为其他特权级别提供服务,也就是说提供了在EL3服务手段,我们本文介绍PSCI实现就是在这里面,本文不会过多讲解(注:其实本文只会涉及到atf如何响应服务el1smc发过来psci服务请求...分析到这atf分析到此为止,atf主要是响应内核snc请求,然后做开核处理,也就是实际开核动作,但是处理器最后还是要回到内核执行,下面分析内核处理:注意流程如下: init/main.c...pscicpu操作集cpu_psci_cpu_boot函数,会调用上面的psci_cpu_on,最终调用smc,传递第一个参数为cpuid标识启动哪个cpu,第二个参数为处理器启动后进入内核执行地址...继续执行处理器初始化 744 ENDPROC(__secondary_switched) __cpu_up设置了secondary_data结构一些成员: arch/arm64/kernel...,然后处理器进入内核后需要自身做一些必要初始化,就进入idle状态等待有任务来 调度,我们主要以分析源代码方式讲解了spin-table和psci两种方式来启动多核,而arm64平台使用psci更为广泛

    2.8K20

    Linux:页表PGD、PUD、PMD等概念介绍

    1、PGD: Page Global Directory Linux系统每个进程对应用户空间pgd是不一样,但是linux内核 pgd是一样。...当创建一个新进程时,都要为新进程创建一个新页面目录PGD,并从内核页面目录swapper_pg_dir复制内核区间页面目录项至新建进程页面目录PGD相应位置,具体过程如下:do_fork()...用户空间”,用来映射其整个进程空间(0x0000 0000-0xBFFF FFFF)即3G字节虚拟地址;第二部分为“系统空间”,用来映射(0xC000 0000-0xFFFF FFFF)1G字节虚拟地址...可以看出Linux系统每个进程页面目录第二部分是相同,所以进程角度来看,每个进程有4G字节虚拟空间,较低3G字节是自己用户空间,最高1G字节则为与所有进程以及内核共享系统空间。...PUD地址,PUD包含若干PMD地址,PMD又包含若干PT地址

    3.5K30
    领券