1# test making a FAT filesystem on a very large block device 2 3try: 4 import uos 5except ImportError: 6 print("SKIP") 7 raise SystemExit 8 9try: 10 uos.VfsFat 11except AttributeError: 12 print("SKIP") 13 raise SystemExit 14 15 16class RAMBDevSparse: 17 18 SEC_SIZE = 512 19 20 def __init__(self, blocks): 21 self.blocks = blocks 22 self.data = {} 23 24 def readblocks(self, n, buf): 25 # print("readblocks(%s, %x(%d))" % (n, id(buf), len(buf))) 26 assert len(buf) == self.SEC_SIZE 27 if n not in self.data: 28 self.data[n] = bytearray(self.SEC_SIZE) 29 buf[:] = self.data[n] 30 31 def writeblocks(self, n, buf): 32 # print("writeblocks(%s, %x)" % (n, id(buf))) 33 mv = memoryview(buf) 34 for off in range(0, len(buf), self.SEC_SIZE): 35 s = n + off // self.SEC_SIZE 36 if s not in self.data: 37 self.data[s] = bytearray(self.SEC_SIZE) 38 self.data[s][:] = mv[off : off + self.SEC_SIZE] 39 40 def ioctl(self, op, arg): 41 # print("ioctl(%d, %r)" % (op, arg)) 42 if op == 4: # MP_BLOCKDEV_IOCTL_BLOCK_COUNT 43 return self.blocks 44 if op == 5: # MP_BLOCKDEV_IOCTL_BLOCK_SIZE 45 return self.SEC_SIZE 46 47 48try: 49 bdev = RAMBDevSparse(4 * 1024 * 1024 * 1024 // RAMBDevSparse.SEC_SIZE) 50 uos.VfsFat.mkfs(bdev) 51except MemoryError: 52 print("SKIP") 53 raise SystemExit 54 55vfs = uos.VfsFat(bdev) 56uos.mount(vfs, "/ramdisk") 57 58print("statvfs:", vfs.statvfs("/ramdisk")) 59 60f = open("/ramdisk/test.txt", "w") 61f.write("test file") 62f.close() 63 64print("statvfs:", vfs.statvfs("/ramdisk")) 65 66f = open("/ramdisk/test.txt") 67print(f.read()) 68f.close() 69 70uos.umount(vfs) 71