2012年1月9日 星期一

mmap -- mapped memory

mapped memory 的行程間通訊機制,是透過「shared file」來做訊息的傳遞;將 shared file mapping 到 process address space 的 system call 為 'mmap()'。以下是其中一個簡單的程式範例


#include
#include
#include
#include
#include
#define FILE_LENGTH 0x400

int main(int argc, char *argv[])
{
   int fd;
   void *map_memory;

   /* Open a file to be mapped. */
   fd = open("/tmp/shared_file", O_RDWR | O_CREAT, S_IRUSR | S_IWUSR);
   lseek(fd, FILE_LENGTH+1, SEEK_SET);
   write(fd, "", 1);
   lseek(fd, 0, SEEK_SET);

   /* Create map memory. */
   map_memory = mmap(0, FILE_LENGTH, PROT_WRITE, MAP_SHARED, fd, 0);
   close(fd);

   /* Write to mapped memory. */
   if (strlen(argv[1]) < FILE_LENGTH)
      sprintf((char *)map_memory, "%s", argv[1]);

   sleep(10000);

   exit(0);
}
Linux允許將檔案對映到記憶體中。如此可以產生一個在檔案資料及記憶體資料一對一的對映。
當程式將檔案 mapping 到自己的記憶體空間(process address space)時,mmap system call 便會建立相對應的 VMA 區段;觀念上來說,只要透過 mmap system call 將檔案 mapping 到記憶體,便會產生對應的 VMA。
修改一下範例程式,讓程式在結束前暫停 10000 秒鍾,並做觀察
$ ./my_mmp hello&
[1]   xxxx
$ cat /proc/xxxx/maps
就可以看到結果



引用

How to repair and clone disk with ddrescue

  ddrescue  is a tool that can be used to repair and clone disks on a  Linux system . This includes hard drives, partitions, DVD discs, flas...