|
|
1.1 ! root 1: notes on mapping Unix disk to DiskObject ! 2: ! 3: OBSOLETE as of 25 Oct 91.. ! 4: ! 5: * block devices map to LogicalDisks. All they can do is open, close, ! 6: and strategy (readAsync, writeAsync). One per partition. ! 7: ! 8: sd0a <==> lsd0a etc. ! 9: ! 10: * raw devices other than live partition also map onto LogicalDisks to ! 11: handle DEV_BSIZE mapping. They can do open, close, read, write, ioctl. ! 12: One per disk. ! 13: ! 14: * live partitions map onto DiskObjects (SCSIDisk, FloppyDisk). They can do ! 15: read, write (maybe ioctl). One per disk. ! 16: ! 17: * some kind of disk with n partitions has: ! 18: n LDs for block devices (lsd0a, lsd0b, lsd0c) ! 19: one LD for raw device (rsd0a) ! 20: one DiskObject subclass for live device (sd0) ! 21: ! 22: * Unix level needs to be able to map a dev_t to an id. ! 23: DiskObject and LogicalDisk should register with Unix-level code via: ! 24: ! 25: typedef enum { ! 26: DISK_TYPE_RAW, ! 27: DISK_TYPE_BLOCK, ! 28: DISK_TYPE_LIVE ! 29: } diskType_t; ! 30: ! 31: - (void)registerUnixDisk : (int) Unit ! 32: partition : (int) partition ! 33: diskType : (diskType_t)diskType; ! 34: ! 35: ! 36: Unix level will keep a bunch of structs doing this mapping around, ! 37: probably as an array, not a list, to simplify lookup: ! 38: ! 39: one per Unix unit (one for sd0, one for sd1, etc) ! 40: ! 41: typedef { ! 42: id raw_dev_id; // LogicalDisk for raw device ! 43: id live_part_id; // DiskObject/SCSIDisk (etc) for live partition ! 44: id block_id[NPART]; // for block devices ! 45: } struct dev_to_id_map_t; ! 46: ! 47: These are allocated statically, and a pointer to the array is kept in ! 48: each DiskObject's idMapArray instance variable. ! 49: ! 50: * SCSIDisk init sequence (# indicates not currently implemented) ! 51: ! 52: from somewhere { ! 53: probe and init SCSIController object; ! 54: SCSIDisk probe:controllerId { ! 55: foreach target and lun { ! 56: if it's a disk we can snag { ! 57: registerDevice; ==> IODevice ! 58: registerDisk; ==> DiskObject ! 59: } ! 60: } ! 61: } ! 62: } ! 63: ! 64: DiskObject registerDisk { ! 65: log raw device info; ! 66: [registerUnixDisk DISK_TYPE_LIVE]; ! 67: [LogicalDisk probe:self] ! 68: enable disk insert detection; ! 69: } ! 70: ! 71: ! 72: ! 73: Two level config: ! 74: ! 75: go thru all dev_type registers; mark as in use those which we have ! 76: internal drivers for; ! 77: run Config, give it a chance to hand out dev_types to user-level driver ! 78: (only dev_types which we don't have internal drivers for will be ! 79: reported; dev_numbers for devices with internal drivers ! 80: will be reported as DEV_TYPE_NULL). ! 81: ! 82: statically generate array of these at config time: ! 83: ! 84: typedef { ! 85: int (*probe_fcn)(void *regptr); ! 86: dev_type_t dev_type; ! 87: } internal_device_driver; ! 88: ! 89: note "probe_fcn" might be replaced by some objC enumeration of ! 90: class names to allow something like [*classname probe]...if not ! 91: possible, each driver will just have a little C fcn to do this. ! 92: ! 93: internal autoconfig { ! 94: for each device page { ! 95: get internal_device_driver * for this dev_type; ! 96: if non-null { ! 97: dev_port_create() a dev_port; ! 98: (*probe_fcn)(device_page_ptr, dev_port); ! 99: } ! 100: } ! 101: } ! 102: ! 103: in SCSIDiskUnix: ! 104: ! 105: internal: ! 106: sd_probe(device_page_ptr, dev_port) ! 107: sd_dev_to_id(dev) ! 108: ! 109: exported via cdevsw[]: ! 110: sd_raw_open(dev, flag) ! 111: sd_raw_close(dev) ! 112: sd_read(dev, uiop) ! 113: sd_write(dev, uiop) ! 114: sd_ioctl(dev, cmd, data, flag) ! 115: ! 116: exported via bdevsw[]: ! 117: sd_block_open(dev, flag) ! 118: sd_block_close(dev) ! 119: sd_strategy(bp) ! 120: ! 121: misc todo: ! 122: maybe SCSIController probe: should do probes of all known SCSI devices? ! 123: iostats needs to work!
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.