an I/O port
Imagine an office where memory is one big numbered filing cabinet, but the machines (the photocopier, the fax) each have their own separate little numbered mailboxes on a different wall. To work a machine you do not file a document in the cabinet; you reach for its mailbox by number using a different gesture. An I/O port is one of those separate numbered mailboxes: a small numbered slot, living in a special address space distinct from memory, through which the CPU exchanges bytes with a device controller's registers.
Concretely, on architectures like the x86 family there are two parallel address spaces. Ordinary loads and stores (mov to a memory address) reach RAM. But to touch a device port you must use special instructions — IN to read a byte from a port number, OUT to write one. So a driver might do OUT 0x3F8, 0x41 to send the byte 0x41 to the serial port at port number 0x3F8. The port numbers form their own small space (commonly only 65536 ports), entirely separate from the gigabytes of memory addresses, which is why this scheme is also called port-mapped I/O. This is the historical alternative to the other approach, memory-mapped I/O, where device registers instead appear as ordinary memory addresses.
Why it matters: port-mapped I/O keeps device registers from eating into the precious memory address space, and the special IN/OUT instructions are naturally privileged, so a user program cannot poke a device directly — only the kernel can. The trade-off is that you cannot use the rich ordinary memory instructions on ports; you are limited to the few special I/O instructions. Modern systems lean heavily toward memory-mapped I/O, and many architectures (such as ARM) have no separate I/O port space at all.
The legacy PC keyboard controller answers at I/O ports 0x60 (data) and 0x64 (status/command). A driver reads IN 0x64 to check the status, and when a key is ready, reads the scan code with IN 0x60.
Port numbers are a separate address space reached only by special I/O instructions.
I/O ports are not memory: a port number like 0x60 and a memory address 0x60 are completely different places. Confusing the two address spaces is a classic beginner mistake.