public void mount(TaskMonitor monitor) throws IOException, MachException, CancelledException {
		splitDyldCache = new SplitDyldCache(provider, false, new MessageLog(), monitor);
		RangeSet<Long> allDylibRanges = TreeRangeSet.create();

		// Find the DYLIB's and add them as files
		monitor.initialize(splitDyldCache.size(), "Find DYLD DYLIBs...");
		for (int i = 0; i < splitDyldCache.size(); i++) {
			monitor.increment();
			DyldCacheHeader header = splitDyldCache.getDyldCacheHeader(i);
			ByteProvider p = splitDyldCache.getProvider(i);
			for (DyldCacheImage mappedImage : header.getMappedImages()) {
				MachHeader machHeader =
					new MachHeader(p, mappedImage.getAddress() - header.getBaseAddress());
				RangeSet<Long> rangeSet = TreeRangeSet.create();
				for (SegmentCommand segment : machHeader.parseSegments()) {
					Range<Long> range = Range.openClosed(segment.getVMaddress(),
						segment.getVMaddress() + segment.getVMsize());
					rangeSet.add(range);
				}
				DyldCacheEntry entry =
					new DyldCacheEntry(mappedImage.getPath(), i, rangeSet, null, null, -1);
				rangeSet.asRanges().forEach(r -> rangeMap.put(r, entry));
				allDylibRanges.addAll(rangeSet);
				fsIndex.storeFile(mappedImage.getPath(), fsIndex.getFileCount(), false, -1, entry);
			}
		}

		// Find and store all the mappings for all of the subcaches. We need to remove the DYLIB's
		// that we just found so we don't account for any bytes more than once.  This will result
		// in the mappings being broken up into a lot of small chunks, each being its own file.
		monitor.initialize(splitDyldCache.size(), "Find DYLD mapping ranges...");
		for (int i = 0; i < splitDyldCache.size(); i++) {
			monitor.increment();
			DyldCacheHeader header = splitDyldCache.getDyldCacheHeader(i);
			String name = splitDyldCache.getName(i);
			List<DyldCacheMappingInfo> mappingInfos = header.getMappingInfos();
			List<DyldCacheMappingAndSlideInfo> mappingAndSlideInfos =
				header.getCacheMappingAndSlideInfos();
			for (int j = 0; j < mappingInfos.size(); j++) {
				DyldCacheMappingInfo mappingInfo = mappingInfos.get(j);
				DyldCacheMappingAndSlideInfo mappingAndSlideInfo =
					!mappingAndSlideInfos.isEmpty() ? mappingAndSlideInfos.get(j) : null;
				Range<Long> mappingRange = Range.openClosed(mappingInfo.getAddress(),
					mappingInfo.getAddress() + mappingInfo.getSize());
				RangeSet<Long> reducedRangeSet = TreeRangeSet.create();
				reducedRangeSet.add(mappingRange);
				reducedRangeSet.removeAll(allDylibRanges);
				for (Range<Long> range : reducedRangeSet.asRanges()) {
					String path =
						getComponentPath(name, mappingInfo, mappingAndSlideInfo, j, range);
					DyldCacheEntry entry = new DyldCacheEntry(path, i,
						TreeRangeSet.create(CollectionUtils.asIterable(range)), mappingInfo,
						mappingAndSlideInfo, j);
					rangeMap.put(range, entry);
					fsIndex.storeFile(path, fsIndex.getFileCount(), false, -1, entry);
				}
			}
		}
	}
Mounts this file system

@param monitor {@link TaskMonitor}
@throws IOException If there was an issue mounting the file system
@throws MachException if there was an error parsing a DYLIB header
@throws CancelledException If the user cancelled the operation
Ghidra/Features/FileFormats/src/main/java/ghidra/file/formats/ios/dyldcache/DyldCacheFileSystem.java