A lot of it is internal and hidden from program access, or irrelevant for normal use.
The UART has a small FIFO (first-in, first-out) buffer, probably from two to four characters depending on the device.
All you need to see from the program is that it has data available; if so, read the data and check again within one character time.
The FIFO behind that just means that the new character check timing is less critical, so occasionally being a bit late does not mean a character lost or overrun, as long as you usually check in less that the character-to-character time at whatever baud rate is in use.
[Think of it as a bucket line - an unbuffered UART has one bucket man; you have to take it before the next character is received and passed to him.
With the FIFO, there are 1, 2, 3 or whatever additional bucket men, but you only deal with the last.
As long as the line does not fill up, you can eg. miss one time then take two the next.]