簡體   English   中英

在Linux中從一個進程到另一個進程的地址映射

[英]address mapping from one process to another in Linux

能做到嗎? 進程A執行x = malloc(...) x是進程A的地址空間(堆)中的虛擬地址。 我想要一個系統調用,該調用將x並從進程A的地址空間中取消映射,並將其映射到進程B的虛擬地址空間virt_to_phys()phys_to_virt()工作? virt_to_phys()將在進程A的上下文中完成,而phys_to_virt()在進程B的上下文中完成。 我說得通嗎 我沒有深入研究Linux內核中的地址映射機制。

您可以使用POSIX共享內存來執行此操作

流程1

#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>

int main()
{
        unsigned char *shared_byte;
        int shmfd = shm_open("/test_object", O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
        ftruncate(shmfd, 1);
        shared_byte = mmap(NULL, 1, PROT_READ | PROT_WRITE, MAP_SHARED, shmfd, 0);
        *shared_byte = 123;
        for(;;);
}

編譯並運行:

$ cc proc1.c -o proc1 -lrt
$ ./proc1 &
[1] 5381

檢查流程圖:

$ pmap 5381
5381:   ./proc1
08048000      4K r-x-- proc1
08049000      4K rw--- proc1
b7540000      8K rw---   [ anon ]
b7542000    100K r-x-- libpthread-2.22.so
b755b000      4K r---- libpthread-2.22.so
b755c000      4K rw--- libpthread-2.22.so
b755d000      8K rw---   [ anon ]
b755f000   1728K r-x-- libc-2.22.so
b770f000      4K ----- libc-2.22.so
b7710000      8K r---- libc-2.22.so
b7712000      4K rw--- libc-2.22.so
b7713000     12K rw---   [ anon ]
b7716000     28K r-x-- librt-2.22.so
b771d000      4K r---- librt-2.22.so
b771e000      4K rw--- librt-2.22.so
b7724000      4K rw-s- test_object
b7725000      4K rw---   [ anon ]
b7726000      8K r----   [ anon ]
b7728000      4K r-x--   [ anon ]
b7729000    136K r-x-- ld-2.22.so
b774b000      4K r---- ld-2.22.so
b774c000      4K rw--- ld-2.22.so
bfe7f000    132K rw---   [ stack ]
 total     2220K

注意,有一個4k test_object映射到進程1的虛擬地址空間。

工程2

#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h>
#include <stdio.h>

int main()
{
        unsigned char *shared_byte;
        int shmfd = shm_open("/test_object", O_RDONLY, 0);
        shared_byte = mmap(NULL, 1, PROT_READ, MAP_SHARED, shmfd, 0);
        printf("%d\n", *shared_byte);
        for(;;);
}

編譯並運行:

$ cc proc2.c -o proc2 -lrt
$ ./proc2 &
[2] 5397
123

注意第一個程序的“ 123”值在那里。

檢查流程圖:

$ pmap 5397
5397:   ./proc2
08048000      4K r-x-- proc2
08049000      4K rw--- proc2
b7555000      8K rw---   [ anon ]
b7557000    100K r-x-- libpthread-2.22.so
b7570000      4K r---- libpthread-2.22.so
b7571000      4K rw--- libpthread-2.22.so
b7572000      8K rw---   [ anon ]
b7574000   1728K r-x-- libc-2.22.so
b7724000      4K ----- libc-2.22.so
b7725000      8K r---- libc-2.22.so
b7727000      4K rw--- libc-2.22.so
b7728000     12K rw---   [ anon ]
b772b000     28K r-x-- librt-2.22.so
b7732000      4K r---- librt-2.22.so
b7733000      4K rw--- librt-2.22.so
b7738000      4K rw---   [ anon ]
b7739000      4K r--s- test_object
b773a000      4K rw---   [ anon ]
b773b000      8K r----   [ anon ]
b773d000      4K r-x--   [ anon ]
b773e000    136K r-x-- ld-2.22.so
b7760000      4K r---- ld-2.22.so
b7761000      4K rw--- ld-2.22.so
bffbf000    132K rw---   [ stack ]
 total     2224K

請注意,有一個4k test_object映射到進程2的虛擬地址空間。

清理

$ killall proc1
[1]-  Terminated              ./proc1
$ killall proc2
[2]+  Terminated              ./proc2
$ cat > clean.c << EOF
#include <sys/mman.h>
#include <sys/stat.h>
#include <fcntl.h>

int main()
{
        shm_unlink("/test_object");
}
EOF
$ cc clean.c -o clean -lrt
$ ./clean

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM