.sa_flags = SA_SIGINFO,
 };
 
-static void walk_file(const char *name, const struct stat *st)
+static void walk_file_range(const char *name, int fd,
+                           unsigned long off, unsigned long end)
 {
        uint8_t vec[PAGEMAP_BATCH];
        uint64_t buf[PAGEMAP_BATCH], flags;
        uint64_t cgroup = 0;
        uint64_t mapcnt = 0;
        unsigned long nr_pages, pfn, i;
-       off_t off, end = st->st_size;
-       int fd;
        ssize_t len;
        void *ptr;
        int first = 1;
 
-       fd = checked_open(name, O_RDONLY|O_NOATIME|O_NOFOLLOW);
-
-       for (off = 0; off < end; off += len) {
+       for (; off < end; off += len) {
                nr_pages = (end - off + page_size - 1) / page_size;
                if (nr_pages > PAGEMAP_BATCH)
                        nr_pages = PAGEMAP_BATCH;
                                 flags, cgroup, mapcnt, buf[i]);
                }
        }
+}
+
+static void walk_file(const char *name, const struct stat *st)
+{
+       int i;
+       int fd;
+
+       fd = checked_open(name, O_RDONLY|O_NOATIME|O_NOFOLLOW);
+
+       if (!nr_addr_ranges)
+               add_addr_range(0, st->st_size / page_size);
+
+       for (i = 0; i < nr_addr_ranges; i++)
+               walk_file_range(name, fd, opt_offset[i] * page_size,
+                               (opt_offset[i] + opt_size[i]) * page_size);
 
        close(fd);
 }