Is it possible to erase the middle of a file, causing the system to free these blocks on disk?
, Linux fallocate (2); , (, NFS, VFAT,...), . . lseek (2) SEEK_HOLE, posix_fadvise (2), madvise (2), memfd_create (2) ..
(, USB- SSD) ( mmap ). - .
1 ,
. , ( - , ). shm_overview (7), ( mmap (2)). , , paging, MMU, , , , mmap, , copy-on-write, , ELF, ... cat /proc/$$/maps (. proc (5)...).
, , . Linux mmap (2).
, mmap MAP_NORESERVE
size_t onegiga = 1L<<30;
void* startad = mmap(NULL, onegiga, PROT_NONE,
MAP_ANONYMOUS|MAP_NORESERVE|MAP_SHARED,
-1, 0);
if (startad==MAP_FAILED) { perror("mmap MAP_NORESERVE"); exit(EXIT_FAILURE); }
void* endad = (char*)startad + onegiga;
MAP_NORESERVE (.. , , , ). , mmap ( MAP_FIXED) ( munmap ).
- ( 4 ), MAP_FIXED ,
size_t segoff = 1024*1024;
assert (segoff >=0 && segoff < onegiga && segoff % sysconf(_SC_PAGESIZE)==0);
size_t segsize = 65536;
assert (segsize > 0 && segsize % sysconf(_SC_PAGESIZE)==0
&& startad + segoffset + segsize < endad);
void* segmentad = mmap(startad + segoffset, segsize,
PROT_READ|PROT_WRITE,
MAP_FIXED | MAP_PRIVATE,
-1, 0);
if (segmentad == MAP_FAILED) { perror("mmap MAP_FIXED"); exit(EXIT_FAILURE); }
MAP_FIXED (, ).
IIRC, SBCL .
Linux syscalls (2) .
. Linux, (, proc (5)).
BTW, Linux . kernel.org . . , .