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

如何从具有内核读写能力的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.4K20
  • 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语言实现可以参考这里。如何允许内核态访问用户空间地址呢?

    84210

    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.2K31

    深入理解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.3K20

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

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

    2.5K20

    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.5K50

    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_enable从thread_info中读取正确的用户态页表机制,然后恢复ttbr0_el1,这样就可以访问用户态的页表了,PAN失效。 3、什么时候调用这两个函数呢?...因为已经返回了用户态,用户态当然可以访问用户态的页表了。 2)当内核态发生中断、系统调用kernel_entry时;返回内核态kernel_exit时。...如上面代码,kernel_entry,此时el为1,此时如果已经设置了PAN生效(用户态到内核态时设置的),则不会重新设置。且spsr的PAN标志位置1。

    4.3K50

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

    _el1(只考虑阶段1的el0和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开始遍历多级页表

    2K32

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

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

    5.3K90

    Linux的内存初始化

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

    2.9K21

    Linux内存初始化(上)

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

    2.7K31

    详解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.7K24

    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.6K30

    Fixmap机制深入分析

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

    1.9K41

    ARM64 SMP多核启动(下)- PSCI

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

    2.9K20
    领券