地址空間是否不使用上的第一位macos/arm6 4?

我使用的是ARM64系統(tǒng)(M1)。

$ uname -m
arm64

這是我用來(lái)查找系統(tǒng)上虛擬地址空間范圍的C程序。

#include <stdlib.h>
#include <stdio.h>
#define _GNU_SOURCE
#include <assert.h>
#include <unistd.h>
#include <sys/time.h>
#include <sys/resource.h>

int main(void) {
    printf("Page size = %d\n", getpagesize());
    
    struct rlimit x;

    getrlimit(RLIMIT_AS, &x);
    printf("Current maximum size = %llx\n", x.rlim_cur);
    printf("Limit on maximum size = %llx\n", x.rlim_max);

    unsigned long long int value = 0;
    value -= 1;
    printf("Maximum float = %llx", value);
    return 0;
}

Output:

Current maximum size = 7fffffffffffffff // 9223372036854775807
Limit on maximum size = 7fffffffffffffff // 9223372036854775807
Maximum float = ffffffffffffffff // 18446744073709551615

最大大小似乎是2^63-1。最后一位根本沒(méi)有被使用。

為什么會(huì)出現(xiàn)這種情況?在64位系統(tǒng)上,虛擬內(nèi)存地址范圍應(yīng)為2^64- 1正確的

我知道地址只使用48位,但這似乎與地址空間的范圍無(wú)關(guān)(為什么32位和64位的地址有兩種不同的長(zhǎng)度?)

? 最佳回答:

就arm64硬件而言,EL0和EL1共享一個(gè)轉(zhuǎn)換機(jī)制,TTBR0_EL1TTBR1_EL1分別控制地址空間的下半部分和上半部分。通常下半部分用于userland,上半部分用于內(nèi)核。

但首先要注意的是,rlimit與硬件無(wú)關(guān)。這是關(guān)于操作系統(tǒng)的。

XNU有這個(gè)(它也被復(fù)制到蘋果的SDK中):

#define RLIM_INFINITY   (((__uint64_t)1 << 63) - 1)     /* no limit */

所以這只是“無(wú)限制”的值。

作為第二個(gè)注意事項(xiàng),盡管有RLIMIT_AS的描述,但這與地址空間大小無(wú)關(guān)。這大約是流程中所有現(xiàn)有映射的總和。

arm64 XNU允許映射內(nèi)存的實(shí)際最大地址是0x00007ffffe000000。這個(gè)值只是對(duì)macOS進(jìn)行了硬編碼。還有一個(gè)最小地址,在進(jìn)程初始化時(shí)設(shè)置為進(jìn)程中主二進(jìn)制的基地址(通常為0x100000000)加上ASLR幻燈片。

在macOS以外的蘋果操作系統(tǒng)上,最大地址的規(guī)則更為復(fù)雜,但以下是相關(guān)的代碼位:

osfmk/mach/arm/vm_param.h:

#if defined(XNU_PLATFORM_MacOSX) || defined(XNU_PLATFORM_DriverKit)
#define MACH_VM_MAX_ADDRESS_RAW 0x00007FFFFE000000ULL
#else
#define MACH_VM_MAX_ADDRESS_RAW 0x0000000FC0000000ULL
#endif

osfmk/mach/shared_region.h:

#define SHARED_REGION_BASE_ARM64                0x180000000ULL
#define SHARED_REGION_SIZE_ARM64                0x100000000ULL

osfmk/arm/pmap/pmap.c:

/* end of shared region + 512MB for various purposes */
#define ARM64_MIN_MAX_ADDRESS (SHARED_REGION_BASE_ARM64 + SHARED_REGION_SIZE_ARM64 + 0x20000000)

// Max offset is 13.375GB for devices with "large" memory config
#define ARM64_MAX_OFFSET_DEVICE_LARGE (ARM64_MIN_MAX_ADDRESS + 0x138000000)
// Max offset is 9.375GB for devices with "small" memory config
#define ARM64_MAX_OFFSET_DEVICE_SMALL (ARM64_MIN_MAX_ADDRESS + 0x38000000)

vm_map_offset_t
pmap_max_64bit_offset(
    __unused unsigned int option)
{
    vm_map_offset_t max_offset_ret = 0;

#if defined(__arm64__)
    const vm_map_offset_t min_max_offset = ARM64_MIN_MAX_ADDRESS; // end of shared region + 512MB for various purposes
    if (option == ARM_PMAP_MAX_OFFSET_DEFAULT) {
        max_offset_ret = arm64_pmap_max_offset_default;
    } else if (option == ARM_PMAP_MAX_OFFSET_MIN) {
        max_offset_ret = min_max_offset;
    } else if (option == ARM_PMAP_MAX_OFFSET_MAX) {
        max_offset_ret = MACH_VM_MAX_ADDRESS;
    } else if (option == ARM_PMAP_MAX_OFFSET_DEVICE) {
        if (arm64_pmap_max_offset_default) {
            max_offset_ret = arm64_pmap_max_offset_default;
        } else if (max_mem > 0xC0000000) {
            // devices with > 3GB of memory
            max_offset_ret = ARM64_MAX_OFFSET_DEVICE_LARGE;
        } else if (max_mem > 0x40000000) {
            // devices with > 1GB and <= 3GB of memory
            max_offset_ret = ARM64_MAX_OFFSET_DEVICE_SMALL;
        } else {
            // devices with <= 1 GB of memory
            max_offset_ret = min_max_offset;
        }
    } else if (option == ARM_PMAP_MAX_OFFSET_JUMBO) {
        if (arm64_pmap_max_offset_default) {
            // Allow the boot-arg to override jumbo size
            max_offset_ret = arm64_pmap_max_offset_default;
        } else {
            max_offset_ret = MACH_VM_MAX_ADDRESS;     // Max offset is 64GB for pmaps with special "jumbo" blessing
        }
    } else {
        panic("pmap_max_64bit_offset illegal option 0x%x", option);
    }

    assert(max_offset_ret <= MACH_VM_MAX_ADDRESS);
    assert(max_offset_ret >= min_max_offset);
#else
    panic("Can't run pmap_max_64bit_offset on non-64bit architectures");
#endif

    return max_offset_ret;
}

因此,在iOS和其他non-macOS配置上,如果您有“jumbo”映射(您可以使用com.apple.developer.kernel.extended-virtual-addressing權(quán)限獲得,或者在一些具有com.apple.developer.kernel.increased-memory-limit的設(shè)備上獲得),則地址大小限制為0x0000000fc0000000,否則為0x00000002a0000000、0x00000002b8000000或0x00000003b8000000,具體取決于設(shè)備的物理內(nèi)存量。

請(qǐng)注意,后三個(gè)大小可能會(huì)發(fā)生變化,因?yàn)樗鼈兪歉鶕?jù)共享緩存區(qū)域邊界的大小計(jì)算的,而共享緩存區(qū)域本身也會(huì)發(fā)生變化。"9.375GB"和"13.375GB"的評(píng)論在今天也是錯(cuò)誤的,因?yàn)樗鼈冊(cè)从?code>SHARED_REGION_SIZE_ARM64是0xa0000000的時(shí)候。

主站蜘蛛池模板: 一区二区免费国产在线观看| 中文字幕一区二区三区精华液 | 无码人妻品一区二区三区精99| 无码乱人伦一区二区亚洲一| 一区二区国产在线播放| 久久精品免费一区二区| 精品成人av一区二区三区| 玩弄放荡人妻一区二区三区| 日本内射精品一区二区视频 | 日韩精品久久一区二区三区| 无码国产精品一区二区免费vr| 国产亚洲自拍一区| 精品日韩在线视频一区二区三区 | 色屁屁一区二区三区视频国产| 在线播放国产一区二区三区 | 日韩一区二区三区在线| 男女久久久国产一区二区三区| 中文字幕一区在线播放| 国产精品区一区二区三| 在线观看日韩一区| 成人区人妻精品一区二区三区 | 亚洲AV无码一区二三区| 福利一区二区三区视频午夜观看| 久久精品国内一区二区三区| 精品人妻中文av一区二区三区| 无码一区二区三区老色鬼| 精品视频一区二区三区在线观看 | 国产一区二区不卡老阿姨| 亚洲日本va一区二区三区 | 精品一区二区三区影院在线午夜| 人妻少妇精品视频三区二区一区| 97久久精品无码一区二区| 天堂va在线高清一区| 久久中文字幕无码一区二区 | 国产成人精品日本亚洲专一区| 韩国福利影视一区二区三区| 精品黑人一区二区三区| 国产乱人伦精品一区二区在线观看| 亚洲国产精品一区二区三区在线观看 | 成人欧美一区二区三区在线视频| 日韩成人无码一区二区三区 |