sorry, my answer cannot answer all of your request. however if you are willing to use multiboot as you are using grub, it is possible to setup the graphics. so if you have a boot.S file, you need to push %ebx. it contains the address of the multiboot structure. this structure includes framebuffer information. make a struct multiboot_info, and put a pointer to it into the parameters of your main function e.g. kmain (multiboot_struct *multiptr)
more here
https://www.gnu.org/software/grub/manual/multiboot/multiboot.html