The tourists collapsed to 93-5 before tea, but had recovered to 211-5 when bad light forced an early close.
That left Sri Lanka 114 runs adrift of an England first-innings total of 325 built on Ollie Pope's 154 -- his first century as England captain.
De Silva was 64 not out and Kamindu Mendis 54 not out in an undefeated stand of 118 as Sri Lanka looked to salvage some pride at 2-0 down in a three-match series.
For left-handed batsman Mendis, currently boasting a staggeringly high Test batting average of over 85, this was the seventh time in six matches at this level the 25-year-old had passed 50 -- a run that also includes three centuries.
De Silva, however, should have been out for 23 but Test debutant Josh Hull dropped a simple catch at mid-on, the ball bursting through the towering fast bowler's giant hands following a miscued drive off spinner Shoaib Bashir.
Sri Lanka had gifted England an early breakthrough when Dimuth Karunaratne (nine) was run out by Olly Stone's direct hit from short cover after Pathum Nissanka set off for a non-existent single.
Nissanka completed a fine fifty when he punched the 20-year-old Hull for four through mid-off, his seventh boundary in 40 balls.
But it was not long before the collapse continued.
Stone, in just his second Test in three years after the injury-plagued paceman returned in England's 190-run win at Lord's last week, had veteran all-rounder Angelo Mathews (three) edging to Pope in the gully.
Hull strikes
The 6ft 7 inch (2 metres) tall Hull then took his first wicket in Test cricket, the left-arm quick removing Nissanka for 64 when the opener's drive was well caught by a diving Woakes at cover.
And 91-4 became 93-5 when Stone had Dinesh Chandimal lbw for a duck.
Kamindu Mendis again came in at No 7 after Sri Lanka decided against promoting him up the order and he once more remained calm in a crisis.
Beneath an increasingly gloomy sky, England bowled spin from both ends immediately after tea, Bashir and part-time bowler Dan Lawrence operating in tandem, rather than risk the umpires halting the match for bad light.
De Silva celebrated his reprieve by late-cutting Lawrence for four to complete an 81-ball fifty, while the stylish Kamindu Mendis reached the landmark in a mere 60 balls.
Joe Root was also given a couple of overs with his occasional off-breaks, before bad light ended play for the day with Sri Lanka having scored 69 runs without loss in 17 overs of all spin bowling after tea.
Earlier, England lost their last six wickets for 35 runs after resuming on 221-3.
At the start of the day, Pope was 103 not out, after managing a mere 30 runs in four previous innings since succeeding the injured Ben Stokes as skipper at the start of this series.
Sri Lanka's wayward four-man pace attack had failed to make the most of overcast conditions and a green-tinged pitch after De Silva won the toss.
Their performance improved on Saturday, fast bowler Milan Rathnayake finishing with 3-56 in 13.1 overs.
Left-arm quick Vishwa Fernando removed Pope when the 26-year-old hooked to deep square leg to end a 156-ball innings including 19 fours and two sixes.
His exit still left Pope with a colossal first-class average of over 84 on his Surrey home ground.
England, who whitewashed the West Indies 3-0 earlier this season, are chasing their first home Test clean sweep since 2004, when Michael Vaughan oversaw seven successive wins.