Well, I still think you are almost there.  I went through this same frustration a few months ago so I feel your pain :)

From the code you sent, I gather that you get the "i" out the serial port.  But that it fails to get to the start_kernel routine.  This is just what I encountered.  I spent several days pulling out my hair until I discovered that I did not have the protected mode of the processor set up correctly.  The problem I found was that I had not set the code segment to the proper value. 

Well after all that hair pulling (of course) I found the kernel/arch/i386/boot/setup.S file.  This is the code which jumps to Linux from a floppy boot.  Take a look in there especially the code preceding the code32: label.  Your jump to 0x101000 has to have the 0x66 prefix or the last bit of protected mode will not truly be set up.  What that means essentially, is that the code segment register will not be pointing to the appropriate location in the GDT.  While some of the code may run, as soon as head.S trys to jump to another segment the processor will generate a GPF. 

I hope this helps.  The explanation in the setup.S file is more eloquent that I.  There is also a book "Protected Mode Software Architecture" by Tom Shanley published by Addison Wesley.  I don't own a copy yet, but I have heard it contains much information about this issue. 

Most importantly, don't panic I still think you are 3/4 of the way there!  Good luck.
        Gary



P.S. I don't want to panic you, but does your system use the PCI bus?  Have you properly set that up yet?