I have available a TB-sized database. There should be plenty of GAM pages to find.
Let's first examine the strides from those documents. 4GB is 524,288 pages. Adding this offset to 2 for the 1st page, and using DBCC PAGE, does not return a GAM page. Hunting a couple of extents either side does not return a GAM page either.
64,000 extents is 512,000 pages. Looking at page 512,002 and its neighbours does not return a GAM page either. It seems these are both rough approximations rather than hard facts about the file structure.
Let's examine the header of the first GAM page again.
dbcc traceon(3604);
dbcc page('Sandbox', 1, 2, 0);
m_prevPage and m_nextPage both are zero. There is no chain of pages to follow.
m_slotCnt is 2, though. I wonder what the different records represent? Using dbcc page('Sandbox', 1, 2, 1);
shows the first record has length 94 and the second has length 7,992. Since each GAM bit represents one extent 7992 bytes represents 511,488 pages. Sadly there are no GAM pages in the vacinity of that offset either. More on this later.
Now this blog suggests that allocations bitmaps may not have slot arrays. So maybe DBCC was confused when I asked for per-row information and the two "records" are actually one continuous bitmap. Doing the sums gives 517,504 pages but, unfortunately, no second GAM page.
Looking again at page 2, but this time at the detailed per-row interpretation (option 3) I see
(1:0) - (1:369568) = ALLOCATED
(1:369576) - = NOT ALLOCATED
(1:369584 - (1:511224) = ALLOCATED
I found a description here (under section 3.GAM) which says "[511224] is the first page of last extent in this range." So the first page of the next extent would be 511232. Since that would be the start of a new GAM range I'd expect to find another GAM page thereabouts. And there it is at page 511232.
Repeating this I find further GAM pages at 1022464, 1533696 & 2044928. There is a consistent interval of 511232 between these. This, I conclude, is the stride for a GAM interval. To check I take an arbitrary multiple 511232 * 127 = 64926464 and, sure enough, it is also a GAM page.
Working backward 511232 pages is 63,904 extents which is 7,988 bytes in a GAM page map. This is 4 short of the 7,992 I found for the record in slot 2. Which just happens to be the length of a record header. I should have realised.