free()関数の仕組みを教えてください

malloc()やrealloc()でメモリを確保するじゃないですか
その後free()で開放するとき、バッファのサイズを指定せずに
どうやって正確にメモリを開放しているのでしょうか?
特殊な変数にでも値を保存しているんですか?