England had a good start to the day as Anderson picked up his second wicket, that of nightwatchman Paul Harris.
Smith fell cheaply for the second time in the match as he dragged one from Onions onto the stumps.
Stuart Broad got the big wicket of Kallis as the South African top-edged a pull to fine leg where Cook completed a well-judged catch as SA were reduced to 46/4.
Amla and de Villiers held firm to help SA rebuild. Amla was solid without being flamboyant as he completed his fifty.
AB de Villiers provided good support and was the more aggressive of the two partners, scoring his runs at a brisk pace as he reached his 18th Test fifty.
Stuart Broad returned and got rid of de Villiers, ending the 119-run partnership for the 5th wicket.
Duminy failed to contribute, falling for 11 as he unsuccessfully reviewed the umpire's decision.
Boucher looked in good touch, playing some attractive shots en route to his 30th Test fifty.
Hashim Amla's dogged effort at the crease paid off as he reached his 7th ton in style, before being dismissed by one that shot through at ankle height.
Morkel did his job to perfection, scoring quick runs towards the end, including 4 fours off one Broad over as SA declared on 301/7.
Anderson was the best bowler for England, ending with figures of 4/73.
Chasing 364 to win, Morkel got rid of Strauss for 1 before England finished the day at 11/1.