Hardware breakpoints are registers in the MDM that are compared to the Program Counter (PC) in hardware. You configure the MDM to support the number of breakpoints that you require. Hardware breakpoints are a hard compare and more robust than software breakpoints.
Software breakpoints require GDB to perform a bit more work. The basic theory is that GDB replaces a program instruction with a trap, illegal divide, or other instruction that causes an exception, so that when it is encountered, GDB reads the exception and stops the program. When you want to continue, GDB restores the original instruction, single-steps, reinserts the trap, and continues.
Since it overwrites the program that is being tested, the program area must be writable, so this technique does not work on programs in ROM. This method can also distort the behavior of programs that examine themselves, although such a situation is very unusual.
For more information, see:
http://www.delorie.com/gnu/docs/gdb/gdbint_8.html