uBoot and kernel partition

I have some questions, on which I'm cracking my head since few days.

  1. How uBoot know partition localization in memory? Is this hard-coded for particular Flash memory?
  2. How kernel know partitions? Is this related to environment variable passed to kernel, when uBoot is running it? But how it knows, how decode path to actuall byte offset on SPI flash chip?
  3. How uBoot (and kernel) know partition size?
  4. How kernel know how to read/write data from partitions? I.e. that it have to send some data on SPI or SATA? This is probably related somehow to driver etc, but what is actually send to it? Raw bytes which should be stored? Other things (i.e. compressing or erasing Flash page) are done on driver level? How it knows, at which offset is desired data?
  5. How kernel know which driver use to get data from partition (in case that one is on SPI flash and second i.e. on SATA disk)?
  6. How can I prepare own driver to i.e. save and read data using UART from other device? Sending data 'on wire' etc is simple, but how kernel is actually using this driver?
  7. What is the maximum size of partition? On kernel level it should not be a problem, right? The only problem which I see is the primary bootloader and uBoot itsels - both have to be able to get data from SPI Flash, but when kernel is running it should be able to use i.e. custom driver to get access to other drive etc?
  8. Does kernel use ART partition during runtime, or it is just used by uBoot?