problem with pm

Question about which tools to use, bugs, the best way to implement a function, etc should go here. Don't forget to see if your question is answered in the wiki first! When in doubt post here.
Post Reply
Thomas Sendelbach

problem with pm

Post by Thomas Sendelbach »

I have a bootloader which switches to protected mode
and than jmps to a c-programm (my kernel)
the kernel creates some descriptors
one of them is a video_descriptor he points to the
address 0xb8000.
So how can I access this memory
char *video=(char*)0xb8000;
or
char *video=(char*)descriptornumber;

p.s. i am from german so my english is quite bad
Thomas Sendelbach

RE:problem with pm

Post by Thomas Sendelbach »

>On 2001-08-11 02:59:42, Thomas Sendelbach wrote:
>I have a bootloader which switches to protected mode
>and than jmps to a c-programm (my kernel)
>the kernel creates some descriptors
>one of them is a video_descriptor he points to the
>address 0xb8000.
>So how can I access this memory
>char *video=(char*)0xb8000;
>or
>char *video=(char*)descriptornumber;
>
>p.s. i am from german so my english is quite bad

the bootloader created the gdt and a code and a data descriptor
and now the kernel creates the videodescriptor
so now the post is complete
Guest

RE:problem with pm

Post by Guest »

>char *video=(char*)0xb8000;
>or
>char *video=(char*)descriptornumber;

Try 'em both... :)

Actually, what you have to do is load a segment
register with your new descriptor.

In assembly:
mov es, VIDEO_SEG

And then you can access video memory as es:offset
(es:di, for example).

You're getting into far pointers though... it'll
be faster just to define one segment for everything,
starting at 0x0, with a length of 0xfffff pages
and then you can access video memory like this:

char *video = (char *)0x000b8000;
video[offset] = data;

>p.s. i am from german so my english is quite bad

No problem... I just hope I didn't make any
"hang-over" mistakes :)
Guest

RE:problem with pm

Post by Guest »

>On 2001-08-11 15:27:11, Anonymous wrote:
>>char *video=(char*)0xb8000;
>>or
>>char *video=(char*)descriptornumber;

pokeb(video_selector, 0, 'A');
or maybe
pokeb(linear_memory_selector, 0xB8000, 'A');

>char *video = (char *)0x000b8000;
>video[offset] = data;

That only works with paging, or if the kernel
data segment has base address 0. If the base
address is not 0, you must subtract it:

char *video = (char *)(0xB8000 - kernel_ds_base);
video[0] = 'A';
video[1] = 0x1F; /* white on blue */
Post Reply