disks cannot be mmapped.
Tinker wrote:
> Hi tech@,
>
> (I post it here as this is a low level tech question. Any extended talk
> should be moved to misc@..)
>
> Any way I try to mmap /dev/rsd0c , I get EINVAL (22).
>
> Neither http://man.openbsd.org/mmap nor http://man.openbsd.org/sd gives
> any hint.
>
> "ls -l /dev/rsd0c; ls -l /dev/sd0c" shows that sd0c is a block device
> and rsd0c is a character device, and mmap's man page says that
> "character special files" are OK.
>
> read() speed on /dev/rsd0c is way higher than on /dev/sd0c (in the
> ballpark of >>100% faster), that's why I was interested in this in the
> first place.
>
> Is it possible to do any way?
>
> Thanks,
> Tinker
>
>
> Example trymap.c below:
>
> # gcc -o trymap trymap.c
> # ./trymap /dev/sd0c
> Opened /dev/sd0c with handle 3.
> mmap succeeded.
> # ./trymap /dev/rsd0c
> Opened /dev/rsd0c with handle 3.
> mmap failed, errno 22: Invalid argument.
>
> Changing to O_RDWR and PROT_READ | PROT_WRITE changes nothing.
>
> Changing flags to MAP_FILE | MAP_SHARED also changes nothing.
>
>
> trymap.c:
>
> #include <stdio.h>
> #include <fcntl.h>
> #include <sys/mman.h>
> #include <errno.h>
> #include <string.h>
>
> int main(int argc, char *argv[]) {
> if (argc != 2) { printf("Use: trymap filename\n"); return 0; }
> char* filename = argv[1];
> int f = open(filename,O_RDONLY);
> if (f == -1) {
> printf("Failed to open file %s!\n",filename);
> return -1;
> }
> printf("Opened %s with handle %i.\n",filename,f);
> void* mmaparea = mmap(NULL, /* addr - we don't provide any suggestion.
> */
> 1 * 1024 * 1024 * 1024, // 1GB
> PROT_READ,
> 0, /* flags - MAP_FILE implied */
> f,
> 0 // offset
> );
> if (mmaparea == MAP_FAILED) {
> printf("mmap failed, errno %i: %s.\n",errno,strerror(errno));
> return -1;
> }
> printf("mmap succeeded.\n");
> return 0;
> }
>