Gregg C Levine wrote:
Hello from Gregg C Levine Steve, now I am completely confused. Can you elaborate on the term "gdt"? I am familiar with its use, on the PC, during the time period that covers the pre-Linux era. Namely working in assembler for the IBM-PC, itself, during the 1980s to the 1990s.
The gdt is one of a number of registers in the IA-32 model used for protected mode memory management (ie, for 32-bit mode). Typically, it is loaded to point to a data structure that defines a flat (ie, 4 GB) data segment, and an identical code segment, although you can in reality have many segments defined. These segments are referenced by their offset into the gdt data structure, for example in linux startup, 0x18 defines the data segment, and you would put this into the %ds register. This means the segment is defined 24 bytes into the gdt table. This is very different, of course, from how you use the %ds in real or 16-bit mode.
Originally in linuxbios, the gdt was defined in flash, and not changed until jumping to linux. However, linux will hang if the gdt is located above 1M (not sure why, but I have tested this many times). So if you setup biosbase=0xffff0000, this would put the gdt high, and it has to be loaded low so linux will work. However, recently, Eric setup a gdt reload in c_start.S, which is relocated into ram below 1M, and so this will work fine for linux. This makes some gdt reload code I put into the sis630 area unnecessary.
But the bottom line is you have to setup the gdt to point to a compatible (read that identical) gdt table to linux, before jumping to linux. Linux expects to be in 32-bit mode with the gdt data structure a certain way. You can see it at the bottom of linux/arch/i386/boot/setup.S in the kernel source tree.
Anytime you go into protected mode, you have to setup the gdt, and usually also the idt, which handles interrupts.
You can find more that you would ever want to know about it in the Intel reference manuals, but most folks just copy the table data from someone else. It is very painful code to debug, many bytes of the entries in the table requiring bit by bit settings.
-Steve