arm64 page size的设置

在arch/arm64/include/asm/page-def.h路径中有如下定义, 通过CONFIG_ARM64_PAGE_SHIFT来指定
/* PAGE_SHIFT determines the page size */
#define PAGE_SHIFT      CONFIG_ARM64_PAGE_SHIFT
#define PAGE_SIZE       (_AC(1, UL) << PAGE_SHIFT)
#define PAGE_MASK       (~(PAGE_SIZE-1))
可以在build/include/generated/autoconf.h看到代码里生成的page shift的大小,具体配置在arch/arm64/Kconfig中, 默认为12,也就是默认页面大小为4KiB
choice
    prompt "Page size"
    default ARM64_4K_PAGES
    help
      Page size (translation granule) configuration.
config ARM64_4K_PAGES
    bool "4KB"
    help
      This feature enables 4KB pages support.

config ARM64_16K_PAGES
    bool "16KB"
    help
      The system will use 16KB pages support. AArch32 emulation
      requires applications compiled with 16K (or a multiple of 16K)
      aligned segments.

config ARM64_64K_PAGES
    bool "64KB"
    help
      This feature enables 64KB pages support (4KB by default)
      allowing only two levels of page tables and faster TLB
      look-up. AArch32 emulation requires applications compiled
      with 64K aligned segments.

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
由于 ARM64 的指令集比较复杂,ROP 的实现也比较复杂。下面是一个简单的 ARM64 ROP 实现的 C 代码示例: ```c #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/mman.h> #define PAGE_SIZE 4096 void gadget1(void) { // 这是一个 gadget,用于返回到 main 函数 __asm__("ret"); } void gadget2(void) { // 这是另一个 gadget,用于将 x0 寄存器的值设置为 0 __asm__("mov x0, #0\nret"); } void gadget3(void) { // 这是第三个 gadget,用于将 x0 和 x1 寄存器的值相加并存储到 x0 中 __asm__("add x0, x0, x1\nret"); } int main(int argc, char **argv) { // 分配一个可执行内存页 void *mem = mmap(NULL, PAGE_SIZE, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); if (mem == MAP_FAILED) { perror("mmap"); exit(1); } // 把 gadget1、gadget2 和 gadget3 的地址存储到内存页中 memcpy(mem, &gadget1, sizeof(void *)); memcpy(mem + sizeof(void *), &gadget2, sizeof(void *)); memcpy(mem + sizeof(void *) * 2, &gadget3, sizeof(void *)); // 构造 ROP 链 void **rop_chain = (void **)mem; rop_chain[0] = mem + sizeof(void *); // 将 x0 设置为 0 rop_chain[1] = mem + sizeof(void *) * 2; // 将 x0 和 x1 相加 rop_chain[2] = mem; // 返回到 main 函数 // 跳转到 ROP 链 ((void (*)(void))mem)(); return 0; } ``` 这个代码示例中,我们定义了三个 gadget 函数,分别用于返回到 main 函数、将 x0 寄存器的值设置为 0,以及将 x0 和 x1 寄存器的值相加并存储到 x0 中。然后,我们使用 mmap 函数分配了一个可执行内存页,并将 gadget 函数的地址存储到内存页中。接着,我们构造了一个 ROP 链,这个 ROP 链先调用 gadget2 将 x0 设置为 0,然后调用 gadget3 将 x0 和 x1 相加,最后返回到 main 函数。最后,我们跳转到 ROP 链。 需要注意的是,这个代码示例只是一个简单的 ARM64 ROP 实现示例,实际上,ROP 的实现比这个要复杂得多。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值