34
Computer Labs: Lab5 Video Card in Graphics Mode 2 o MIEIC Pedro F. Souto ([email protected]) November 11, 2016

Computer Labs: Lab5 Video Card in Graphics Mode - 2º MIEICpfs/aulas/lcom2016/at/13vbe.pdf · Computer Labs: Lab5 Video Card in Graphics Mode 2o MIEIC Pedro F. Souto ([email protected])

  • Upload
    others

  • View
    0

  • Download
    0

Embed Size (px)

Citation preview

Page 1: Computer Labs: Lab5 Video Card in Graphics Mode - 2º MIEICpfs/aulas/lcom2016/at/13vbe.pdf · Computer Labs: Lab5 Video Card in Graphics Mode 2o MIEIC Pedro F. Souto (pfs@fe.up.pt)

Computer Labs Lab5Video Card in Graphics Mode

2o MIEIC

Pedro F Souto (pfsfeuppt)

November 11 2016

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Graphics AdapterVideo Card

GraphicsProcessing Unit

(GPU)

BIOSROMFlash

Video RAM

Bus

Adapter

GPU Earlier known as the Graphics ControllerI Controls the display hardware (CRT vs LCD)I Performs 2D and 3D rendering algorithms offloading the

CPU and accelerating graphics applicationsBIOS ROMFlash ROMFlash Memory with firmware Includes

code that performs some standardized basic video IOoperations such as the Video BIOS Extension (VBE)

Video RAM Stores the data that is rendered on the screenI It is acessible also by the CPU (at least part of it)

Video Modes

Text Mode

I Mode used by Minix 318 by default

Graphics Mode

I Mode you will use in Lab 5

PCrsquos Graphics Adapter Text Modes

I Used to render mostly textI Abstracts the screen as a matrix of characters (row x cols)

I Eg 25x80 25x40 50x80 25x132I Black and white vs color (16 colors)

80 columns

25

lines

He l l o Wor l d

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Video Card in Graphics Mode

I The screen is abstracted as a matrix of points or pixelsI With HRES pixels per lineI With VRES pixels per column

I For each pixel the VRAM holds its colorHRES pixels

VRES

pixels

VRAM

How Are Colors Encoded (12)

I Most electronic display devices use the RGB color modelI A color is obtained by adding 3 primary colors ndash red green blue ndash

each of which with its own intensityI This model is related to the physiology of the human eye

I One way to represent a color is to use a triple with a givenintensity per primary color

I Depending on the number of bits used to represent the intensity ofeach primary color we have a different number of colors

I Eg if we use 8 bits per primary color we are able to represent224 = 16777216 colors

How Are Colors Encoded (22)Direct-color mode Store the color of each pixel in the VRAM

I For 8 bits per primary color if we use a resolution of1024 times 768 we need a little bit more than 2 MB per screen

Indexed color Rather than store the color per pixel store an index intoa table ndash the palettecolor map ndash with the color definition ie theintensity of the 3 primary colors

I With an 8 bit index we can represent 256 colors each of whichmay have 8 bits or more per primary color

I By changing the palette it is possible to render more than 256colors

I In the lab yoursquoll use a palette with up to 256 colors whose defaultinitialization on both VMware Player and VirtualBoxI Uses only the first 64 of the 256

elementsI The first time it switches to the

mode the colors are not asbright ndash donrsquot ask me why

Memory ModelsI The memory model determines the way the value of each

pixel is stored in VRAMI Different graphics modes use different memory models

I The simplest mode and the one that will be used in thelab is the linear mode

HRES pixels

V

R

E

S

p

i

x

e

l

scolor (00)

color (10)

color (Hres0)

color (01)

All we need to know isI The base address of the frame bufferI The coordinates of the pixelI The number of bytes used to encode the color

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Lab5 Video Card in Graphics Mode

I Write a set of functionsvoid test_init(unsigned short mode unsigned short delay)int test_square(unsigned short x unsigned short y )int test_line(unsigned short xi unsigned short yi )int test_xpm(unsigned short xi unsigned short yi )int test_move(unsigned short xi unsigned short yi )int test_controller()

to set the screen to graphics mode and to change the display inthat mode

I The goal for the first class is to implemente the first 3 functionsI Essentially you have to

1 Configure the video card for the desired graphics modeI Minix 3 boots in text mode not in graphics mode

2 Write to VRAM to display on the screen what is requestedI Map VRAM to the processrsquo address space

3 Reset the video card to the text mode used by MinixI You need only to call a function that we provide you

Video Card Configuration (test_init())

Problem How do you configure the desired graphics modeNO Solution Readwrite directly the GPU registers

I GPU manufacturers usually do not provide the detailsnecessary for that level of programming

Solution Use the VESA Video Bios Extension (VBE)

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

PC BIOS

I Basic Input-Output System isI A firmware interface for accessing PC HW resourcesI The implementation of this interfaceI The non-volatile memory (ROM more recently flash-RAM)

containing that implementationI It is used mostly when a PC starts up

I It is 16-bits even IA-32 processors start in real-modeI It is used essentially to load the OS (or part of it)I Once the OS is loaded it usually uses its own code to

access the HW not the BIOS

BIOS Calls

I Access to BIOS services is via the SW interrupt instructionINT xx

I The xx is 8 bit and specifies the serviceI Any arguments required are passed via the processor

registersI Standard BIOS services

Interrupt vector (xx) Service10h video card11h PC configuration12h memory configuration16h keyboard

BIOS Call Example

I Set Video Mode INT 10h function 00h set video mode

MOV AH 0 functionMOV AL 3 text 25 lines X 80 columns 16 colorsINT 10h

How to make a BIOS Call in Minix 31x

ProblemI The previous example is in real address modeI Minix 3 uses protected mode with 32-bit

SolutionI Use Minix 3 kernel call SYS_INT86

ldquoMake a real-mode BIOS on behalf of a user-space devicedriver This temporarily switches from 32-bit protectedmode to 16-bit real-mode to access the BIOS callsrdquo

BIOS Call in Minix 3 Exampleinclude ltmachineint86hgt usrsrcincludearchi386int vg_exit() struct reg86u reg86

reg86ubintno = 0x10reg86ubah = 0x00reg86ubal = 0x03

if( sys_int86(ampreg86) = OK ) printf(vg_exit() sys_int86() failed n)return 1

return 0

I struct reg86u is a struct with a union of structsb is the member to access 8-bit registersw is the member to access 16-bit registersl is the member to access 32-bit registers

I The names of the members of the structs are the standardnames of IA-32 registers

Video BIOS Extension (VBE)

I The BIOS specification supports only VGA graphics modes

I VGA stands for Video Graphics AdapterI Specifies very low resolution 640x480 16 colors and

320x240 256 colorsI The Video Electronics Standards Association (VESA)

developed the Video BIOS Extension (VBE) standards inorder to make programming with higher resolutionsportable

I Early VBE versions specify only a real-mode interfaceI Later versions added a protected-mode interface but

I In version 2 only for some time-critical functionsI In version 3 supports more functions but they are optional

VBE INT 0x10 Interface

I VBE still uses INT 0x10 but to distinguish it from basicvideo BIOS services

I AH = 4Fh - BIOS uses AH for the functionI AL = function

I VBE graphics mode 105h 1024x768256 linear modestruct reg86u rruwax = 0x4F02 VBE call function 02 -- set VBE moderuwbx = 1ltlt14|0x105 set bit 14 linear framebufferrubintno = 0x10if( sys_int86(ampr) = OK )

printf(set_vbe_mode sys_int86() failed n)return 1

You should use symbolic constants

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Mapping the Linear Frame BufferI Before you can write to the frame buffer

HRES pixels

V

R

E

S

p

i

x

e

l

scolor (00)

color (10)

color (Hres0)

color (01)

1 Obtain the physical memory address11 Using a hard-coded address (0xE0000000) first

I This address may depend on the VM used So I provide aprogram that allows you to find out this address

12 Using Function 0x01 Return VBE Mode Information onceeverything else has been completed

2 Map the physical memory region into the processrsquo addressspace

Virtual and Physical Address Spaces

Issue Most computer architectures support a virtual addressspace that is decoupled from the physical address space

I Processes can access (physical) memory using alogical address that is independent of the physicaladdress (determined by the address bus decodingcircuitry)

I Most modern operating systems including Minix takeadvantage of this feature to simplify memorymanagement

Mapping Physical Memory to Virtual Address Space

I Each process has its own virtual address space whosesize is usually determined by the processor architecture(32-bit for IA-32)

I The operating system maps regions of the physicalmemory in the computer to the virtual address spaces ofthe different processes

I The details of how this is done are studied in the OperatingSystems course

Mapping VRAM in Minix (12)int rstruct mem_range mrunsigned int vram_base VRAMrsquos physical addresss unsigned int vram_size VRAMrsquos size but you can use

the frame-buffer size instead void video_mem frame-buffer VM address

Allow memory mapping

mrmr_base = (phys_bytes) vram_basemrmr_limit = mrmr_base + vram_size

if( OK = (r = sys_privctl(SELF SYS_PRIV_ADD_MEM ampmr)))panic(sys_privctl (ADD_MEM) failed dn r)

Map memory

video_mem = vm_map_phys(SELF (void )mrmr_base vram_size)

if(video_mem == MAP_FAILED)panic(couldnrsquot map video memory)

Mapping VRAM in Minix (22)

Question What is the following code about Allow memory mapping

mrmr_base = (phys_bytes) vram_basemrmr_limit = mrmr_base + vram_size

if( OK = (r = sys_privctl(SELF SYS_PRIV_ADD_MEM ampmr)))panic(sys_privctl (ADD_MEM) failed dn r)

Answer In modern operating systems user-level processescannot access directly HW resources including physicalmemory and VRAM

I Minix 3 handles this by allowing to grant privilegeduser-level processes the permissions they require toperform their tasks

Lab 5 - Part 1 Key Programming Issue

Issue Given a virtual address how can a program accessthe physical memory mapped to that virtual address

Solution Use C pointers

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Finding the Physical Memory Address with VBE (15)

I VBE Function 01h - Return VBE Mode InformationInput

AX = 4F01h Return VBE Mode InformationCX = Mode numberESDI = Pointer to ModeInfoBlock structure

OuputAX = VBE return status

I The ModeInfoBlock includes among other information1 The mode attributes which comprise a set of bits that

describe some general characteristics of the modeincluding whether

I it is supported by the adapterI the linear frame buffer is available

2 The screen resolution of the mode3 The physical address of the linear frame buffer

Finding the Physical Memory Address with VBE (25)

ProblemI The ModeInfoBlock structure must be accessible both in

protected mode and in real modeI VBE Function 01h is a real mode functionI Real mode addresses are only 20-bit long (must be in the

lower 1MiB)

SolutionI Use liblma library

I Provides a simple interface for applicationslm_init()lm_alloc()lm_free()

I Hides some non-documented functions provided by Minix 3I The mmap_t (already used in Lab 1) includes both

I The physical address for use by VBEI The virtual address for use in Minix 3

Finding the Physical Memory Address with VBE (35)

phys_bytes bufstruct reg86u r

[]

ruwax = 0x4F01 VBE get mode info translate the buffer linear address to a far pointer ruwes = PB2BASE(buf) set a segment base ruwdi = PB2OFF(buf) set the offset accordingly ruwcx = moderubintno = 0x10if( sys_int86(ampr) = OK ) call BIOS

PB2BASE Is a macro for computing the base of a segment a16-bit value given a 32-bit linear address

PB2OFF Is a macro for computing the offset with respect to thebase of a segment a 16-bit value given a 32-bit linearaddress

Finding the Physical Memory Address with VBE (45)

Problem The parameters contained in the buffer returned byVBE function 0x01 are layed out sequentially with no holesbetween them

I Simply defining a C struct with one member perparameter with an appropriate type is not enough

I C compilers layout the members of a struct in order andplace them in memory positions whose address isaligned according to their type

Solution Use GCCrsquos __attribute__((packed))I In principle this should be handled by thepragma pack directives but it is not supported by thisversion of GCC

Note that this attribute must appear immediately after the otherwise it has no effect

I You need not do anything as Irsquove already defined thestruct in vbeh

Finding the Physical Memory Address with VBE (55)

include ltstdinthgt

typedef struct

uint16_t ModeAttributes[]uint16_t XResolutionuint16_t YResolution[]uint8_t BitsPerPixel[]uint32_t PhysBasePtr[]

__attribute__((packed)) vbe_mode_info_t

  • Graphics AdapterVideo Card
  • Video Card in Graphics Mode
  • Lab 5
  • BIOS and VBE
  • Accessing VRAM
  • VBE Function 0x01
Page 2: Computer Labs: Lab5 Video Card in Graphics Mode - 2º MIEICpfs/aulas/lcom2016/at/13vbe.pdf · Computer Labs: Lab5 Video Card in Graphics Mode 2o MIEIC Pedro F. Souto (pfs@fe.up.pt)

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Graphics AdapterVideo Card

GraphicsProcessing Unit

(GPU)

BIOSROMFlash

Video RAM

Bus

Adapter

GPU Earlier known as the Graphics ControllerI Controls the display hardware (CRT vs LCD)I Performs 2D and 3D rendering algorithms offloading the

CPU and accelerating graphics applicationsBIOS ROMFlash ROMFlash Memory with firmware Includes

code that performs some standardized basic video IOoperations such as the Video BIOS Extension (VBE)

Video RAM Stores the data that is rendered on the screenI It is acessible also by the CPU (at least part of it)

Video Modes

Text Mode

I Mode used by Minix 318 by default

Graphics Mode

I Mode you will use in Lab 5

PCrsquos Graphics Adapter Text Modes

I Used to render mostly textI Abstracts the screen as a matrix of characters (row x cols)

I Eg 25x80 25x40 50x80 25x132I Black and white vs color (16 colors)

80 columns

25

lines

He l l o Wor l d

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Video Card in Graphics Mode

I The screen is abstracted as a matrix of points or pixelsI With HRES pixels per lineI With VRES pixels per column

I For each pixel the VRAM holds its colorHRES pixels

VRES

pixels

VRAM

How Are Colors Encoded (12)

I Most electronic display devices use the RGB color modelI A color is obtained by adding 3 primary colors ndash red green blue ndash

each of which with its own intensityI This model is related to the physiology of the human eye

I One way to represent a color is to use a triple with a givenintensity per primary color

I Depending on the number of bits used to represent the intensity ofeach primary color we have a different number of colors

I Eg if we use 8 bits per primary color we are able to represent224 = 16777216 colors

How Are Colors Encoded (22)Direct-color mode Store the color of each pixel in the VRAM

I For 8 bits per primary color if we use a resolution of1024 times 768 we need a little bit more than 2 MB per screen

Indexed color Rather than store the color per pixel store an index intoa table ndash the palettecolor map ndash with the color definition ie theintensity of the 3 primary colors

I With an 8 bit index we can represent 256 colors each of whichmay have 8 bits or more per primary color

I By changing the palette it is possible to render more than 256colors

I In the lab yoursquoll use a palette with up to 256 colors whose defaultinitialization on both VMware Player and VirtualBoxI Uses only the first 64 of the 256

elementsI The first time it switches to the

mode the colors are not asbright ndash donrsquot ask me why

Memory ModelsI The memory model determines the way the value of each

pixel is stored in VRAMI Different graphics modes use different memory models

I The simplest mode and the one that will be used in thelab is the linear mode

HRES pixels

V

R

E

S

p

i

x

e

l

scolor (00)

color (10)

color (Hres0)

color (01)

All we need to know isI The base address of the frame bufferI The coordinates of the pixelI The number of bytes used to encode the color

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Lab5 Video Card in Graphics Mode

I Write a set of functionsvoid test_init(unsigned short mode unsigned short delay)int test_square(unsigned short x unsigned short y )int test_line(unsigned short xi unsigned short yi )int test_xpm(unsigned short xi unsigned short yi )int test_move(unsigned short xi unsigned short yi )int test_controller()

to set the screen to graphics mode and to change the display inthat mode

I The goal for the first class is to implemente the first 3 functionsI Essentially you have to

1 Configure the video card for the desired graphics modeI Minix 3 boots in text mode not in graphics mode

2 Write to VRAM to display on the screen what is requestedI Map VRAM to the processrsquo address space

3 Reset the video card to the text mode used by MinixI You need only to call a function that we provide you

Video Card Configuration (test_init())

Problem How do you configure the desired graphics modeNO Solution Readwrite directly the GPU registers

I GPU manufacturers usually do not provide the detailsnecessary for that level of programming

Solution Use the VESA Video Bios Extension (VBE)

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

PC BIOS

I Basic Input-Output System isI A firmware interface for accessing PC HW resourcesI The implementation of this interfaceI The non-volatile memory (ROM more recently flash-RAM)

containing that implementationI It is used mostly when a PC starts up

I It is 16-bits even IA-32 processors start in real-modeI It is used essentially to load the OS (or part of it)I Once the OS is loaded it usually uses its own code to

access the HW not the BIOS

BIOS Calls

I Access to BIOS services is via the SW interrupt instructionINT xx

I The xx is 8 bit and specifies the serviceI Any arguments required are passed via the processor

registersI Standard BIOS services

Interrupt vector (xx) Service10h video card11h PC configuration12h memory configuration16h keyboard

BIOS Call Example

I Set Video Mode INT 10h function 00h set video mode

MOV AH 0 functionMOV AL 3 text 25 lines X 80 columns 16 colorsINT 10h

How to make a BIOS Call in Minix 31x

ProblemI The previous example is in real address modeI Minix 3 uses protected mode with 32-bit

SolutionI Use Minix 3 kernel call SYS_INT86

ldquoMake a real-mode BIOS on behalf of a user-space devicedriver This temporarily switches from 32-bit protectedmode to 16-bit real-mode to access the BIOS callsrdquo

BIOS Call in Minix 3 Exampleinclude ltmachineint86hgt usrsrcincludearchi386int vg_exit() struct reg86u reg86

reg86ubintno = 0x10reg86ubah = 0x00reg86ubal = 0x03

if( sys_int86(ampreg86) = OK ) printf(vg_exit() sys_int86() failed n)return 1

return 0

I struct reg86u is a struct with a union of structsb is the member to access 8-bit registersw is the member to access 16-bit registersl is the member to access 32-bit registers

I The names of the members of the structs are the standardnames of IA-32 registers

Video BIOS Extension (VBE)

I The BIOS specification supports only VGA graphics modes

I VGA stands for Video Graphics AdapterI Specifies very low resolution 640x480 16 colors and

320x240 256 colorsI The Video Electronics Standards Association (VESA)

developed the Video BIOS Extension (VBE) standards inorder to make programming with higher resolutionsportable

I Early VBE versions specify only a real-mode interfaceI Later versions added a protected-mode interface but

I In version 2 only for some time-critical functionsI In version 3 supports more functions but they are optional

VBE INT 0x10 Interface

I VBE still uses INT 0x10 but to distinguish it from basicvideo BIOS services

I AH = 4Fh - BIOS uses AH for the functionI AL = function

I VBE graphics mode 105h 1024x768256 linear modestruct reg86u rruwax = 0x4F02 VBE call function 02 -- set VBE moderuwbx = 1ltlt14|0x105 set bit 14 linear framebufferrubintno = 0x10if( sys_int86(ampr) = OK )

printf(set_vbe_mode sys_int86() failed n)return 1

You should use symbolic constants

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Mapping the Linear Frame BufferI Before you can write to the frame buffer

HRES pixels

V

R

E

S

p

i

x

e

l

scolor (00)

color (10)

color (Hres0)

color (01)

1 Obtain the physical memory address11 Using a hard-coded address (0xE0000000) first

I This address may depend on the VM used So I provide aprogram that allows you to find out this address

12 Using Function 0x01 Return VBE Mode Information onceeverything else has been completed

2 Map the physical memory region into the processrsquo addressspace

Virtual and Physical Address Spaces

Issue Most computer architectures support a virtual addressspace that is decoupled from the physical address space

I Processes can access (physical) memory using alogical address that is independent of the physicaladdress (determined by the address bus decodingcircuitry)

I Most modern operating systems including Minix takeadvantage of this feature to simplify memorymanagement

Mapping Physical Memory to Virtual Address Space

I Each process has its own virtual address space whosesize is usually determined by the processor architecture(32-bit for IA-32)

I The operating system maps regions of the physicalmemory in the computer to the virtual address spaces ofthe different processes

I The details of how this is done are studied in the OperatingSystems course

Mapping VRAM in Minix (12)int rstruct mem_range mrunsigned int vram_base VRAMrsquos physical addresss unsigned int vram_size VRAMrsquos size but you can use

the frame-buffer size instead void video_mem frame-buffer VM address

Allow memory mapping

mrmr_base = (phys_bytes) vram_basemrmr_limit = mrmr_base + vram_size

if( OK = (r = sys_privctl(SELF SYS_PRIV_ADD_MEM ampmr)))panic(sys_privctl (ADD_MEM) failed dn r)

Map memory

video_mem = vm_map_phys(SELF (void )mrmr_base vram_size)

if(video_mem == MAP_FAILED)panic(couldnrsquot map video memory)

Mapping VRAM in Minix (22)

Question What is the following code about Allow memory mapping

mrmr_base = (phys_bytes) vram_basemrmr_limit = mrmr_base + vram_size

if( OK = (r = sys_privctl(SELF SYS_PRIV_ADD_MEM ampmr)))panic(sys_privctl (ADD_MEM) failed dn r)

Answer In modern operating systems user-level processescannot access directly HW resources including physicalmemory and VRAM

I Minix 3 handles this by allowing to grant privilegeduser-level processes the permissions they require toperform their tasks

Lab 5 - Part 1 Key Programming Issue

Issue Given a virtual address how can a program accessthe physical memory mapped to that virtual address

Solution Use C pointers

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Finding the Physical Memory Address with VBE (15)

I VBE Function 01h - Return VBE Mode InformationInput

AX = 4F01h Return VBE Mode InformationCX = Mode numberESDI = Pointer to ModeInfoBlock structure

OuputAX = VBE return status

I The ModeInfoBlock includes among other information1 The mode attributes which comprise a set of bits that

describe some general characteristics of the modeincluding whether

I it is supported by the adapterI the linear frame buffer is available

2 The screen resolution of the mode3 The physical address of the linear frame buffer

Finding the Physical Memory Address with VBE (25)

ProblemI The ModeInfoBlock structure must be accessible both in

protected mode and in real modeI VBE Function 01h is a real mode functionI Real mode addresses are only 20-bit long (must be in the

lower 1MiB)

SolutionI Use liblma library

I Provides a simple interface for applicationslm_init()lm_alloc()lm_free()

I Hides some non-documented functions provided by Minix 3I The mmap_t (already used in Lab 1) includes both

I The physical address for use by VBEI The virtual address for use in Minix 3

Finding the Physical Memory Address with VBE (35)

phys_bytes bufstruct reg86u r

[]

ruwax = 0x4F01 VBE get mode info translate the buffer linear address to a far pointer ruwes = PB2BASE(buf) set a segment base ruwdi = PB2OFF(buf) set the offset accordingly ruwcx = moderubintno = 0x10if( sys_int86(ampr) = OK ) call BIOS

PB2BASE Is a macro for computing the base of a segment a16-bit value given a 32-bit linear address

PB2OFF Is a macro for computing the offset with respect to thebase of a segment a 16-bit value given a 32-bit linearaddress

Finding the Physical Memory Address with VBE (45)

Problem The parameters contained in the buffer returned byVBE function 0x01 are layed out sequentially with no holesbetween them

I Simply defining a C struct with one member perparameter with an appropriate type is not enough

I C compilers layout the members of a struct in order andplace them in memory positions whose address isaligned according to their type

Solution Use GCCrsquos __attribute__((packed))I In principle this should be handled by thepragma pack directives but it is not supported by thisversion of GCC

Note that this attribute must appear immediately after the otherwise it has no effect

I You need not do anything as Irsquove already defined thestruct in vbeh

Finding the Physical Memory Address with VBE (55)

include ltstdinthgt

typedef struct

uint16_t ModeAttributes[]uint16_t XResolutionuint16_t YResolution[]uint8_t BitsPerPixel[]uint32_t PhysBasePtr[]

__attribute__((packed)) vbe_mode_info_t

  • Graphics AdapterVideo Card
  • Video Card in Graphics Mode
  • Lab 5
  • BIOS and VBE
  • Accessing VRAM
  • VBE Function 0x01
Page 3: Computer Labs: Lab5 Video Card in Graphics Mode - 2º MIEICpfs/aulas/lcom2016/at/13vbe.pdf · Computer Labs: Lab5 Video Card in Graphics Mode 2o MIEIC Pedro F. Souto (pfs@fe.up.pt)

Graphics AdapterVideo Card

GraphicsProcessing Unit

(GPU)

BIOSROMFlash

Video RAM

Bus

Adapter

GPU Earlier known as the Graphics ControllerI Controls the display hardware (CRT vs LCD)I Performs 2D and 3D rendering algorithms offloading the

CPU and accelerating graphics applicationsBIOS ROMFlash ROMFlash Memory with firmware Includes

code that performs some standardized basic video IOoperations such as the Video BIOS Extension (VBE)

Video RAM Stores the data that is rendered on the screenI It is acessible also by the CPU (at least part of it)

Video Modes

Text Mode

I Mode used by Minix 318 by default

Graphics Mode

I Mode you will use in Lab 5

PCrsquos Graphics Adapter Text Modes

I Used to render mostly textI Abstracts the screen as a matrix of characters (row x cols)

I Eg 25x80 25x40 50x80 25x132I Black and white vs color (16 colors)

80 columns

25

lines

He l l o Wor l d

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Video Card in Graphics Mode

I The screen is abstracted as a matrix of points or pixelsI With HRES pixels per lineI With VRES pixels per column

I For each pixel the VRAM holds its colorHRES pixels

VRES

pixels

VRAM

How Are Colors Encoded (12)

I Most electronic display devices use the RGB color modelI A color is obtained by adding 3 primary colors ndash red green blue ndash

each of which with its own intensityI This model is related to the physiology of the human eye

I One way to represent a color is to use a triple with a givenintensity per primary color

I Depending on the number of bits used to represent the intensity ofeach primary color we have a different number of colors

I Eg if we use 8 bits per primary color we are able to represent224 = 16777216 colors

How Are Colors Encoded (22)Direct-color mode Store the color of each pixel in the VRAM

I For 8 bits per primary color if we use a resolution of1024 times 768 we need a little bit more than 2 MB per screen

Indexed color Rather than store the color per pixel store an index intoa table ndash the palettecolor map ndash with the color definition ie theintensity of the 3 primary colors

I With an 8 bit index we can represent 256 colors each of whichmay have 8 bits or more per primary color

I By changing the palette it is possible to render more than 256colors

I In the lab yoursquoll use a palette with up to 256 colors whose defaultinitialization on both VMware Player and VirtualBoxI Uses only the first 64 of the 256

elementsI The first time it switches to the

mode the colors are not asbright ndash donrsquot ask me why

Memory ModelsI The memory model determines the way the value of each

pixel is stored in VRAMI Different graphics modes use different memory models

I The simplest mode and the one that will be used in thelab is the linear mode

HRES pixels

V

R

E

S

p

i

x

e

l

scolor (00)

color (10)

color (Hres0)

color (01)

All we need to know isI The base address of the frame bufferI The coordinates of the pixelI The number of bytes used to encode the color

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Lab5 Video Card in Graphics Mode

I Write a set of functionsvoid test_init(unsigned short mode unsigned short delay)int test_square(unsigned short x unsigned short y )int test_line(unsigned short xi unsigned short yi )int test_xpm(unsigned short xi unsigned short yi )int test_move(unsigned short xi unsigned short yi )int test_controller()

to set the screen to graphics mode and to change the display inthat mode

I The goal for the first class is to implemente the first 3 functionsI Essentially you have to

1 Configure the video card for the desired graphics modeI Minix 3 boots in text mode not in graphics mode

2 Write to VRAM to display on the screen what is requestedI Map VRAM to the processrsquo address space

3 Reset the video card to the text mode used by MinixI You need only to call a function that we provide you

Video Card Configuration (test_init())

Problem How do you configure the desired graphics modeNO Solution Readwrite directly the GPU registers

I GPU manufacturers usually do not provide the detailsnecessary for that level of programming

Solution Use the VESA Video Bios Extension (VBE)

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

PC BIOS

I Basic Input-Output System isI A firmware interface for accessing PC HW resourcesI The implementation of this interfaceI The non-volatile memory (ROM more recently flash-RAM)

containing that implementationI It is used mostly when a PC starts up

I It is 16-bits even IA-32 processors start in real-modeI It is used essentially to load the OS (or part of it)I Once the OS is loaded it usually uses its own code to

access the HW not the BIOS

BIOS Calls

I Access to BIOS services is via the SW interrupt instructionINT xx

I The xx is 8 bit and specifies the serviceI Any arguments required are passed via the processor

registersI Standard BIOS services

Interrupt vector (xx) Service10h video card11h PC configuration12h memory configuration16h keyboard

BIOS Call Example

I Set Video Mode INT 10h function 00h set video mode

MOV AH 0 functionMOV AL 3 text 25 lines X 80 columns 16 colorsINT 10h

How to make a BIOS Call in Minix 31x

ProblemI The previous example is in real address modeI Minix 3 uses protected mode with 32-bit

SolutionI Use Minix 3 kernel call SYS_INT86

ldquoMake a real-mode BIOS on behalf of a user-space devicedriver This temporarily switches from 32-bit protectedmode to 16-bit real-mode to access the BIOS callsrdquo

BIOS Call in Minix 3 Exampleinclude ltmachineint86hgt usrsrcincludearchi386int vg_exit() struct reg86u reg86

reg86ubintno = 0x10reg86ubah = 0x00reg86ubal = 0x03

if( sys_int86(ampreg86) = OK ) printf(vg_exit() sys_int86() failed n)return 1

return 0

I struct reg86u is a struct with a union of structsb is the member to access 8-bit registersw is the member to access 16-bit registersl is the member to access 32-bit registers

I The names of the members of the structs are the standardnames of IA-32 registers

Video BIOS Extension (VBE)

I The BIOS specification supports only VGA graphics modes

I VGA stands for Video Graphics AdapterI Specifies very low resolution 640x480 16 colors and

320x240 256 colorsI The Video Electronics Standards Association (VESA)

developed the Video BIOS Extension (VBE) standards inorder to make programming with higher resolutionsportable

I Early VBE versions specify only a real-mode interfaceI Later versions added a protected-mode interface but

I In version 2 only for some time-critical functionsI In version 3 supports more functions but they are optional

VBE INT 0x10 Interface

I VBE still uses INT 0x10 but to distinguish it from basicvideo BIOS services

I AH = 4Fh - BIOS uses AH for the functionI AL = function

I VBE graphics mode 105h 1024x768256 linear modestruct reg86u rruwax = 0x4F02 VBE call function 02 -- set VBE moderuwbx = 1ltlt14|0x105 set bit 14 linear framebufferrubintno = 0x10if( sys_int86(ampr) = OK )

printf(set_vbe_mode sys_int86() failed n)return 1

You should use symbolic constants

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Mapping the Linear Frame BufferI Before you can write to the frame buffer

HRES pixels

V

R

E

S

p

i

x

e

l

scolor (00)

color (10)

color (Hres0)

color (01)

1 Obtain the physical memory address11 Using a hard-coded address (0xE0000000) first

I This address may depend on the VM used So I provide aprogram that allows you to find out this address

12 Using Function 0x01 Return VBE Mode Information onceeverything else has been completed

2 Map the physical memory region into the processrsquo addressspace

Virtual and Physical Address Spaces

Issue Most computer architectures support a virtual addressspace that is decoupled from the physical address space

I Processes can access (physical) memory using alogical address that is independent of the physicaladdress (determined by the address bus decodingcircuitry)

I Most modern operating systems including Minix takeadvantage of this feature to simplify memorymanagement

Mapping Physical Memory to Virtual Address Space

I Each process has its own virtual address space whosesize is usually determined by the processor architecture(32-bit for IA-32)

I The operating system maps regions of the physicalmemory in the computer to the virtual address spaces ofthe different processes

I The details of how this is done are studied in the OperatingSystems course

Mapping VRAM in Minix (12)int rstruct mem_range mrunsigned int vram_base VRAMrsquos physical addresss unsigned int vram_size VRAMrsquos size but you can use

the frame-buffer size instead void video_mem frame-buffer VM address

Allow memory mapping

mrmr_base = (phys_bytes) vram_basemrmr_limit = mrmr_base + vram_size

if( OK = (r = sys_privctl(SELF SYS_PRIV_ADD_MEM ampmr)))panic(sys_privctl (ADD_MEM) failed dn r)

Map memory

video_mem = vm_map_phys(SELF (void )mrmr_base vram_size)

if(video_mem == MAP_FAILED)panic(couldnrsquot map video memory)

Mapping VRAM in Minix (22)

Question What is the following code about Allow memory mapping

mrmr_base = (phys_bytes) vram_basemrmr_limit = mrmr_base + vram_size

if( OK = (r = sys_privctl(SELF SYS_PRIV_ADD_MEM ampmr)))panic(sys_privctl (ADD_MEM) failed dn r)

Answer In modern operating systems user-level processescannot access directly HW resources including physicalmemory and VRAM

I Minix 3 handles this by allowing to grant privilegeduser-level processes the permissions they require toperform their tasks

Lab 5 - Part 1 Key Programming Issue

Issue Given a virtual address how can a program accessthe physical memory mapped to that virtual address

Solution Use C pointers

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Finding the Physical Memory Address with VBE (15)

I VBE Function 01h - Return VBE Mode InformationInput

AX = 4F01h Return VBE Mode InformationCX = Mode numberESDI = Pointer to ModeInfoBlock structure

OuputAX = VBE return status

I The ModeInfoBlock includes among other information1 The mode attributes which comprise a set of bits that

describe some general characteristics of the modeincluding whether

I it is supported by the adapterI the linear frame buffer is available

2 The screen resolution of the mode3 The physical address of the linear frame buffer

Finding the Physical Memory Address with VBE (25)

ProblemI The ModeInfoBlock structure must be accessible both in

protected mode and in real modeI VBE Function 01h is a real mode functionI Real mode addresses are only 20-bit long (must be in the

lower 1MiB)

SolutionI Use liblma library

I Provides a simple interface for applicationslm_init()lm_alloc()lm_free()

I Hides some non-documented functions provided by Minix 3I The mmap_t (already used in Lab 1) includes both

I The physical address for use by VBEI The virtual address for use in Minix 3

Finding the Physical Memory Address with VBE (35)

phys_bytes bufstruct reg86u r

[]

ruwax = 0x4F01 VBE get mode info translate the buffer linear address to a far pointer ruwes = PB2BASE(buf) set a segment base ruwdi = PB2OFF(buf) set the offset accordingly ruwcx = moderubintno = 0x10if( sys_int86(ampr) = OK ) call BIOS

PB2BASE Is a macro for computing the base of a segment a16-bit value given a 32-bit linear address

PB2OFF Is a macro for computing the offset with respect to thebase of a segment a 16-bit value given a 32-bit linearaddress

Finding the Physical Memory Address with VBE (45)

Problem The parameters contained in the buffer returned byVBE function 0x01 are layed out sequentially with no holesbetween them

I Simply defining a C struct with one member perparameter with an appropriate type is not enough

I C compilers layout the members of a struct in order andplace them in memory positions whose address isaligned according to their type

Solution Use GCCrsquos __attribute__((packed))I In principle this should be handled by thepragma pack directives but it is not supported by thisversion of GCC

Note that this attribute must appear immediately after the otherwise it has no effect

I You need not do anything as Irsquove already defined thestruct in vbeh

Finding the Physical Memory Address with VBE (55)

include ltstdinthgt

typedef struct

uint16_t ModeAttributes[]uint16_t XResolutionuint16_t YResolution[]uint8_t BitsPerPixel[]uint32_t PhysBasePtr[]

__attribute__((packed)) vbe_mode_info_t

  • Graphics AdapterVideo Card
  • Video Card in Graphics Mode
  • Lab 5
  • BIOS and VBE
  • Accessing VRAM
  • VBE Function 0x01
Page 4: Computer Labs: Lab5 Video Card in Graphics Mode - 2º MIEICpfs/aulas/lcom2016/at/13vbe.pdf · Computer Labs: Lab5 Video Card in Graphics Mode 2o MIEIC Pedro F. Souto (pfs@fe.up.pt)

Video Modes

Text Mode

I Mode used by Minix 318 by default

Graphics Mode

I Mode you will use in Lab 5

PCrsquos Graphics Adapter Text Modes

I Used to render mostly textI Abstracts the screen as a matrix of characters (row x cols)

I Eg 25x80 25x40 50x80 25x132I Black and white vs color (16 colors)

80 columns

25

lines

He l l o Wor l d

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Video Card in Graphics Mode

I The screen is abstracted as a matrix of points or pixelsI With HRES pixels per lineI With VRES pixels per column

I For each pixel the VRAM holds its colorHRES pixels

VRES

pixels

VRAM

How Are Colors Encoded (12)

I Most electronic display devices use the RGB color modelI A color is obtained by adding 3 primary colors ndash red green blue ndash

each of which with its own intensityI This model is related to the physiology of the human eye

I One way to represent a color is to use a triple with a givenintensity per primary color

I Depending on the number of bits used to represent the intensity ofeach primary color we have a different number of colors

I Eg if we use 8 bits per primary color we are able to represent224 = 16777216 colors

How Are Colors Encoded (22)Direct-color mode Store the color of each pixel in the VRAM

I For 8 bits per primary color if we use a resolution of1024 times 768 we need a little bit more than 2 MB per screen

Indexed color Rather than store the color per pixel store an index intoa table ndash the palettecolor map ndash with the color definition ie theintensity of the 3 primary colors

I With an 8 bit index we can represent 256 colors each of whichmay have 8 bits or more per primary color

I By changing the palette it is possible to render more than 256colors

I In the lab yoursquoll use a palette with up to 256 colors whose defaultinitialization on both VMware Player and VirtualBoxI Uses only the first 64 of the 256

elementsI The first time it switches to the

mode the colors are not asbright ndash donrsquot ask me why

Memory ModelsI The memory model determines the way the value of each

pixel is stored in VRAMI Different graphics modes use different memory models

I The simplest mode and the one that will be used in thelab is the linear mode

HRES pixels

V

R

E

S

p

i

x

e

l

scolor (00)

color (10)

color (Hres0)

color (01)

All we need to know isI The base address of the frame bufferI The coordinates of the pixelI The number of bytes used to encode the color

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Lab5 Video Card in Graphics Mode

I Write a set of functionsvoid test_init(unsigned short mode unsigned short delay)int test_square(unsigned short x unsigned short y )int test_line(unsigned short xi unsigned short yi )int test_xpm(unsigned short xi unsigned short yi )int test_move(unsigned short xi unsigned short yi )int test_controller()

to set the screen to graphics mode and to change the display inthat mode

I The goal for the first class is to implemente the first 3 functionsI Essentially you have to

1 Configure the video card for the desired graphics modeI Minix 3 boots in text mode not in graphics mode

2 Write to VRAM to display on the screen what is requestedI Map VRAM to the processrsquo address space

3 Reset the video card to the text mode used by MinixI You need only to call a function that we provide you

Video Card Configuration (test_init())

Problem How do you configure the desired graphics modeNO Solution Readwrite directly the GPU registers

I GPU manufacturers usually do not provide the detailsnecessary for that level of programming

Solution Use the VESA Video Bios Extension (VBE)

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

PC BIOS

I Basic Input-Output System isI A firmware interface for accessing PC HW resourcesI The implementation of this interfaceI The non-volatile memory (ROM more recently flash-RAM)

containing that implementationI It is used mostly when a PC starts up

I It is 16-bits even IA-32 processors start in real-modeI It is used essentially to load the OS (or part of it)I Once the OS is loaded it usually uses its own code to

access the HW not the BIOS

BIOS Calls

I Access to BIOS services is via the SW interrupt instructionINT xx

I The xx is 8 bit and specifies the serviceI Any arguments required are passed via the processor

registersI Standard BIOS services

Interrupt vector (xx) Service10h video card11h PC configuration12h memory configuration16h keyboard

BIOS Call Example

I Set Video Mode INT 10h function 00h set video mode

MOV AH 0 functionMOV AL 3 text 25 lines X 80 columns 16 colorsINT 10h

How to make a BIOS Call in Minix 31x

ProblemI The previous example is in real address modeI Minix 3 uses protected mode with 32-bit

SolutionI Use Minix 3 kernel call SYS_INT86

ldquoMake a real-mode BIOS on behalf of a user-space devicedriver This temporarily switches from 32-bit protectedmode to 16-bit real-mode to access the BIOS callsrdquo

BIOS Call in Minix 3 Exampleinclude ltmachineint86hgt usrsrcincludearchi386int vg_exit() struct reg86u reg86

reg86ubintno = 0x10reg86ubah = 0x00reg86ubal = 0x03

if( sys_int86(ampreg86) = OK ) printf(vg_exit() sys_int86() failed n)return 1

return 0

I struct reg86u is a struct with a union of structsb is the member to access 8-bit registersw is the member to access 16-bit registersl is the member to access 32-bit registers

I The names of the members of the structs are the standardnames of IA-32 registers

Video BIOS Extension (VBE)

I The BIOS specification supports only VGA graphics modes

I VGA stands for Video Graphics AdapterI Specifies very low resolution 640x480 16 colors and

320x240 256 colorsI The Video Electronics Standards Association (VESA)

developed the Video BIOS Extension (VBE) standards inorder to make programming with higher resolutionsportable

I Early VBE versions specify only a real-mode interfaceI Later versions added a protected-mode interface but

I In version 2 only for some time-critical functionsI In version 3 supports more functions but they are optional

VBE INT 0x10 Interface

I VBE still uses INT 0x10 but to distinguish it from basicvideo BIOS services

I AH = 4Fh - BIOS uses AH for the functionI AL = function

I VBE graphics mode 105h 1024x768256 linear modestruct reg86u rruwax = 0x4F02 VBE call function 02 -- set VBE moderuwbx = 1ltlt14|0x105 set bit 14 linear framebufferrubintno = 0x10if( sys_int86(ampr) = OK )

printf(set_vbe_mode sys_int86() failed n)return 1

You should use symbolic constants

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Mapping the Linear Frame BufferI Before you can write to the frame buffer

HRES pixels

V

R

E

S

p

i

x

e

l

scolor (00)

color (10)

color (Hres0)

color (01)

1 Obtain the physical memory address11 Using a hard-coded address (0xE0000000) first

I This address may depend on the VM used So I provide aprogram that allows you to find out this address

12 Using Function 0x01 Return VBE Mode Information onceeverything else has been completed

2 Map the physical memory region into the processrsquo addressspace

Virtual and Physical Address Spaces

Issue Most computer architectures support a virtual addressspace that is decoupled from the physical address space

I Processes can access (physical) memory using alogical address that is independent of the physicaladdress (determined by the address bus decodingcircuitry)

I Most modern operating systems including Minix takeadvantage of this feature to simplify memorymanagement

Mapping Physical Memory to Virtual Address Space

I Each process has its own virtual address space whosesize is usually determined by the processor architecture(32-bit for IA-32)

I The operating system maps regions of the physicalmemory in the computer to the virtual address spaces ofthe different processes

I The details of how this is done are studied in the OperatingSystems course

Mapping VRAM in Minix (12)int rstruct mem_range mrunsigned int vram_base VRAMrsquos physical addresss unsigned int vram_size VRAMrsquos size but you can use

the frame-buffer size instead void video_mem frame-buffer VM address

Allow memory mapping

mrmr_base = (phys_bytes) vram_basemrmr_limit = mrmr_base + vram_size

if( OK = (r = sys_privctl(SELF SYS_PRIV_ADD_MEM ampmr)))panic(sys_privctl (ADD_MEM) failed dn r)

Map memory

video_mem = vm_map_phys(SELF (void )mrmr_base vram_size)

if(video_mem == MAP_FAILED)panic(couldnrsquot map video memory)

Mapping VRAM in Minix (22)

Question What is the following code about Allow memory mapping

mrmr_base = (phys_bytes) vram_basemrmr_limit = mrmr_base + vram_size

if( OK = (r = sys_privctl(SELF SYS_PRIV_ADD_MEM ampmr)))panic(sys_privctl (ADD_MEM) failed dn r)

Answer In modern operating systems user-level processescannot access directly HW resources including physicalmemory and VRAM

I Minix 3 handles this by allowing to grant privilegeduser-level processes the permissions they require toperform their tasks

Lab 5 - Part 1 Key Programming Issue

Issue Given a virtual address how can a program accessthe physical memory mapped to that virtual address

Solution Use C pointers

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Finding the Physical Memory Address with VBE (15)

I VBE Function 01h - Return VBE Mode InformationInput

AX = 4F01h Return VBE Mode InformationCX = Mode numberESDI = Pointer to ModeInfoBlock structure

OuputAX = VBE return status

I The ModeInfoBlock includes among other information1 The mode attributes which comprise a set of bits that

describe some general characteristics of the modeincluding whether

I it is supported by the adapterI the linear frame buffer is available

2 The screen resolution of the mode3 The physical address of the linear frame buffer

Finding the Physical Memory Address with VBE (25)

ProblemI The ModeInfoBlock structure must be accessible both in

protected mode and in real modeI VBE Function 01h is a real mode functionI Real mode addresses are only 20-bit long (must be in the

lower 1MiB)

SolutionI Use liblma library

I Provides a simple interface for applicationslm_init()lm_alloc()lm_free()

I Hides some non-documented functions provided by Minix 3I The mmap_t (already used in Lab 1) includes both

I The physical address for use by VBEI The virtual address for use in Minix 3

Finding the Physical Memory Address with VBE (35)

phys_bytes bufstruct reg86u r

[]

ruwax = 0x4F01 VBE get mode info translate the buffer linear address to a far pointer ruwes = PB2BASE(buf) set a segment base ruwdi = PB2OFF(buf) set the offset accordingly ruwcx = moderubintno = 0x10if( sys_int86(ampr) = OK ) call BIOS

PB2BASE Is a macro for computing the base of a segment a16-bit value given a 32-bit linear address

PB2OFF Is a macro for computing the offset with respect to thebase of a segment a 16-bit value given a 32-bit linearaddress

Finding the Physical Memory Address with VBE (45)

Problem The parameters contained in the buffer returned byVBE function 0x01 are layed out sequentially with no holesbetween them

I Simply defining a C struct with one member perparameter with an appropriate type is not enough

I C compilers layout the members of a struct in order andplace them in memory positions whose address isaligned according to their type

Solution Use GCCrsquos __attribute__((packed))I In principle this should be handled by thepragma pack directives but it is not supported by thisversion of GCC

Note that this attribute must appear immediately after the otherwise it has no effect

I You need not do anything as Irsquove already defined thestruct in vbeh

Finding the Physical Memory Address with VBE (55)

include ltstdinthgt

typedef struct

uint16_t ModeAttributes[]uint16_t XResolutionuint16_t YResolution[]uint8_t BitsPerPixel[]uint32_t PhysBasePtr[]

__attribute__((packed)) vbe_mode_info_t

  • Graphics AdapterVideo Card
  • Video Card in Graphics Mode
  • Lab 5
  • BIOS and VBE
  • Accessing VRAM
  • VBE Function 0x01
Page 5: Computer Labs: Lab5 Video Card in Graphics Mode - 2º MIEICpfs/aulas/lcom2016/at/13vbe.pdf · Computer Labs: Lab5 Video Card in Graphics Mode 2o MIEIC Pedro F. Souto (pfs@fe.up.pt)

PCrsquos Graphics Adapter Text Modes

I Used to render mostly textI Abstracts the screen as a matrix of characters (row x cols)

I Eg 25x80 25x40 50x80 25x132I Black and white vs color (16 colors)

80 columns

25

lines

He l l o Wor l d

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Video Card in Graphics Mode

I The screen is abstracted as a matrix of points or pixelsI With HRES pixels per lineI With VRES pixels per column

I For each pixel the VRAM holds its colorHRES pixels

VRES

pixels

VRAM

How Are Colors Encoded (12)

I Most electronic display devices use the RGB color modelI A color is obtained by adding 3 primary colors ndash red green blue ndash

each of which with its own intensityI This model is related to the physiology of the human eye

I One way to represent a color is to use a triple with a givenintensity per primary color

I Depending on the number of bits used to represent the intensity ofeach primary color we have a different number of colors

I Eg if we use 8 bits per primary color we are able to represent224 = 16777216 colors

How Are Colors Encoded (22)Direct-color mode Store the color of each pixel in the VRAM

I For 8 bits per primary color if we use a resolution of1024 times 768 we need a little bit more than 2 MB per screen

Indexed color Rather than store the color per pixel store an index intoa table ndash the palettecolor map ndash with the color definition ie theintensity of the 3 primary colors

I With an 8 bit index we can represent 256 colors each of whichmay have 8 bits or more per primary color

I By changing the palette it is possible to render more than 256colors

I In the lab yoursquoll use a palette with up to 256 colors whose defaultinitialization on both VMware Player and VirtualBoxI Uses only the first 64 of the 256

elementsI The first time it switches to the

mode the colors are not asbright ndash donrsquot ask me why

Memory ModelsI The memory model determines the way the value of each

pixel is stored in VRAMI Different graphics modes use different memory models

I The simplest mode and the one that will be used in thelab is the linear mode

HRES pixels

V

R

E

S

p

i

x

e

l

scolor (00)

color (10)

color (Hres0)

color (01)

All we need to know isI The base address of the frame bufferI The coordinates of the pixelI The number of bytes used to encode the color

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Lab5 Video Card in Graphics Mode

I Write a set of functionsvoid test_init(unsigned short mode unsigned short delay)int test_square(unsigned short x unsigned short y )int test_line(unsigned short xi unsigned short yi )int test_xpm(unsigned short xi unsigned short yi )int test_move(unsigned short xi unsigned short yi )int test_controller()

to set the screen to graphics mode and to change the display inthat mode

I The goal for the first class is to implemente the first 3 functionsI Essentially you have to

1 Configure the video card for the desired graphics modeI Minix 3 boots in text mode not in graphics mode

2 Write to VRAM to display on the screen what is requestedI Map VRAM to the processrsquo address space

3 Reset the video card to the text mode used by MinixI You need only to call a function that we provide you

Video Card Configuration (test_init())

Problem How do you configure the desired graphics modeNO Solution Readwrite directly the GPU registers

I GPU manufacturers usually do not provide the detailsnecessary for that level of programming

Solution Use the VESA Video Bios Extension (VBE)

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

PC BIOS

I Basic Input-Output System isI A firmware interface for accessing PC HW resourcesI The implementation of this interfaceI The non-volatile memory (ROM more recently flash-RAM)

containing that implementationI It is used mostly when a PC starts up

I It is 16-bits even IA-32 processors start in real-modeI It is used essentially to load the OS (or part of it)I Once the OS is loaded it usually uses its own code to

access the HW not the BIOS

BIOS Calls

I Access to BIOS services is via the SW interrupt instructionINT xx

I The xx is 8 bit and specifies the serviceI Any arguments required are passed via the processor

registersI Standard BIOS services

Interrupt vector (xx) Service10h video card11h PC configuration12h memory configuration16h keyboard

BIOS Call Example

I Set Video Mode INT 10h function 00h set video mode

MOV AH 0 functionMOV AL 3 text 25 lines X 80 columns 16 colorsINT 10h

How to make a BIOS Call in Minix 31x

ProblemI The previous example is in real address modeI Minix 3 uses protected mode with 32-bit

SolutionI Use Minix 3 kernel call SYS_INT86

ldquoMake a real-mode BIOS on behalf of a user-space devicedriver This temporarily switches from 32-bit protectedmode to 16-bit real-mode to access the BIOS callsrdquo

BIOS Call in Minix 3 Exampleinclude ltmachineint86hgt usrsrcincludearchi386int vg_exit() struct reg86u reg86

reg86ubintno = 0x10reg86ubah = 0x00reg86ubal = 0x03

if( sys_int86(ampreg86) = OK ) printf(vg_exit() sys_int86() failed n)return 1

return 0

I struct reg86u is a struct with a union of structsb is the member to access 8-bit registersw is the member to access 16-bit registersl is the member to access 32-bit registers

I The names of the members of the structs are the standardnames of IA-32 registers

Video BIOS Extension (VBE)

I The BIOS specification supports only VGA graphics modes

I VGA stands for Video Graphics AdapterI Specifies very low resolution 640x480 16 colors and

320x240 256 colorsI The Video Electronics Standards Association (VESA)

developed the Video BIOS Extension (VBE) standards inorder to make programming with higher resolutionsportable

I Early VBE versions specify only a real-mode interfaceI Later versions added a protected-mode interface but

I In version 2 only for some time-critical functionsI In version 3 supports more functions but they are optional

VBE INT 0x10 Interface

I VBE still uses INT 0x10 but to distinguish it from basicvideo BIOS services

I AH = 4Fh - BIOS uses AH for the functionI AL = function

I VBE graphics mode 105h 1024x768256 linear modestruct reg86u rruwax = 0x4F02 VBE call function 02 -- set VBE moderuwbx = 1ltlt14|0x105 set bit 14 linear framebufferrubintno = 0x10if( sys_int86(ampr) = OK )

printf(set_vbe_mode sys_int86() failed n)return 1

You should use symbolic constants

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Mapping the Linear Frame BufferI Before you can write to the frame buffer

HRES pixels

V

R

E

S

p

i

x

e

l

scolor (00)

color (10)

color (Hres0)

color (01)

1 Obtain the physical memory address11 Using a hard-coded address (0xE0000000) first

I This address may depend on the VM used So I provide aprogram that allows you to find out this address

12 Using Function 0x01 Return VBE Mode Information onceeverything else has been completed

2 Map the physical memory region into the processrsquo addressspace

Virtual and Physical Address Spaces

Issue Most computer architectures support a virtual addressspace that is decoupled from the physical address space

I Processes can access (physical) memory using alogical address that is independent of the physicaladdress (determined by the address bus decodingcircuitry)

I Most modern operating systems including Minix takeadvantage of this feature to simplify memorymanagement

Mapping Physical Memory to Virtual Address Space

I Each process has its own virtual address space whosesize is usually determined by the processor architecture(32-bit for IA-32)

I The operating system maps regions of the physicalmemory in the computer to the virtual address spaces ofthe different processes

I The details of how this is done are studied in the OperatingSystems course

Mapping VRAM in Minix (12)int rstruct mem_range mrunsigned int vram_base VRAMrsquos physical addresss unsigned int vram_size VRAMrsquos size but you can use

the frame-buffer size instead void video_mem frame-buffer VM address

Allow memory mapping

mrmr_base = (phys_bytes) vram_basemrmr_limit = mrmr_base + vram_size

if( OK = (r = sys_privctl(SELF SYS_PRIV_ADD_MEM ampmr)))panic(sys_privctl (ADD_MEM) failed dn r)

Map memory

video_mem = vm_map_phys(SELF (void )mrmr_base vram_size)

if(video_mem == MAP_FAILED)panic(couldnrsquot map video memory)

Mapping VRAM in Minix (22)

Question What is the following code about Allow memory mapping

mrmr_base = (phys_bytes) vram_basemrmr_limit = mrmr_base + vram_size

if( OK = (r = sys_privctl(SELF SYS_PRIV_ADD_MEM ampmr)))panic(sys_privctl (ADD_MEM) failed dn r)

Answer In modern operating systems user-level processescannot access directly HW resources including physicalmemory and VRAM

I Minix 3 handles this by allowing to grant privilegeduser-level processes the permissions they require toperform their tasks

Lab 5 - Part 1 Key Programming Issue

Issue Given a virtual address how can a program accessthe physical memory mapped to that virtual address

Solution Use C pointers

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Finding the Physical Memory Address with VBE (15)

I VBE Function 01h - Return VBE Mode InformationInput

AX = 4F01h Return VBE Mode InformationCX = Mode numberESDI = Pointer to ModeInfoBlock structure

OuputAX = VBE return status

I The ModeInfoBlock includes among other information1 The mode attributes which comprise a set of bits that

describe some general characteristics of the modeincluding whether

I it is supported by the adapterI the linear frame buffer is available

2 The screen resolution of the mode3 The physical address of the linear frame buffer

Finding the Physical Memory Address with VBE (25)

ProblemI The ModeInfoBlock structure must be accessible both in

protected mode and in real modeI VBE Function 01h is a real mode functionI Real mode addresses are only 20-bit long (must be in the

lower 1MiB)

SolutionI Use liblma library

I Provides a simple interface for applicationslm_init()lm_alloc()lm_free()

I Hides some non-documented functions provided by Minix 3I The mmap_t (already used in Lab 1) includes both

I The physical address for use by VBEI The virtual address for use in Minix 3

Finding the Physical Memory Address with VBE (35)

phys_bytes bufstruct reg86u r

[]

ruwax = 0x4F01 VBE get mode info translate the buffer linear address to a far pointer ruwes = PB2BASE(buf) set a segment base ruwdi = PB2OFF(buf) set the offset accordingly ruwcx = moderubintno = 0x10if( sys_int86(ampr) = OK ) call BIOS

PB2BASE Is a macro for computing the base of a segment a16-bit value given a 32-bit linear address

PB2OFF Is a macro for computing the offset with respect to thebase of a segment a 16-bit value given a 32-bit linearaddress

Finding the Physical Memory Address with VBE (45)

Problem The parameters contained in the buffer returned byVBE function 0x01 are layed out sequentially with no holesbetween them

I Simply defining a C struct with one member perparameter with an appropriate type is not enough

I C compilers layout the members of a struct in order andplace them in memory positions whose address isaligned according to their type

Solution Use GCCrsquos __attribute__((packed))I In principle this should be handled by thepragma pack directives but it is not supported by thisversion of GCC

Note that this attribute must appear immediately after the otherwise it has no effect

I You need not do anything as Irsquove already defined thestruct in vbeh

Finding the Physical Memory Address with VBE (55)

include ltstdinthgt

typedef struct

uint16_t ModeAttributes[]uint16_t XResolutionuint16_t YResolution[]uint8_t BitsPerPixel[]uint32_t PhysBasePtr[]

__attribute__((packed)) vbe_mode_info_t

  • Graphics AdapterVideo Card
  • Video Card in Graphics Mode
  • Lab 5
  • BIOS and VBE
  • Accessing VRAM
  • VBE Function 0x01
Page 6: Computer Labs: Lab5 Video Card in Graphics Mode - 2º MIEICpfs/aulas/lcom2016/at/13vbe.pdf · Computer Labs: Lab5 Video Card in Graphics Mode 2o MIEIC Pedro F. Souto (pfs@fe.up.pt)

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Video Card in Graphics Mode

I The screen is abstracted as a matrix of points or pixelsI With HRES pixels per lineI With VRES pixels per column

I For each pixel the VRAM holds its colorHRES pixels

VRES

pixels

VRAM

How Are Colors Encoded (12)

I Most electronic display devices use the RGB color modelI A color is obtained by adding 3 primary colors ndash red green blue ndash

each of which with its own intensityI This model is related to the physiology of the human eye

I One way to represent a color is to use a triple with a givenintensity per primary color

I Depending on the number of bits used to represent the intensity ofeach primary color we have a different number of colors

I Eg if we use 8 bits per primary color we are able to represent224 = 16777216 colors

How Are Colors Encoded (22)Direct-color mode Store the color of each pixel in the VRAM

I For 8 bits per primary color if we use a resolution of1024 times 768 we need a little bit more than 2 MB per screen

Indexed color Rather than store the color per pixel store an index intoa table ndash the palettecolor map ndash with the color definition ie theintensity of the 3 primary colors

I With an 8 bit index we can represent 256 colors each of whichmay have 8 bits or more per primary color

I By changing the palette it is possible to render more than 256colors

I In the lab yoursquoll use a palette with up to 256 colors whose defaultinitialization on both VMware Player and VirtualBoxI Uses only the first 64 of the 256

elementsI The first time it switches to the

mode the colors are not asbright ndash donrsquot ask me why

Memory ModelsI The memory model determines the way the value of each

pixel is stored in VRAMI Different graphics modes use different memory models

I The simplest mode and the one that will be used in thelab is the linear mode

HRES pixels

V

R

E

S

p

i

x

e

l

scolor (00)

color (10)

color (Hres0)

color (01)

All we need to know isI The base address of the frame bufferI The coordinates of the pixelI The number of bytes used to encode the color

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Lab5 Video Card in Graphics Mode

I Write a set of functionsvoid test_init(unsigned short mode unsigned short delay)int test_square(unsigned short x unsigned short y )int test_line(unsigned short xi unsigned short yi )int test_xpm(unsigned short xi unsigned short yi )int test_move(unsigned short xi unsigned short yi )int test_controller()

to set the screen to graphics mode and to change the display inthat mode

I The goal for the first class is to implemente the first 3 functionsI Essentially you have to

1 Configure the video card for the desired graphics modeI Minix 3 boots in text mode not in graphics mode

2 Write to VRAM to display on the screen what is requestedI Map VRAM to the processrsquo address space

3 Reset the video card to the text mode used by MinixI You need only to call a function that we provide you

Video Card Configuration (test_init())

Problem How do you configure the desired graphics modeNO Solution Readwrite directly the GPU registers

I GPU manufacturers usually do not provide the detailsnecessary for that level of programming

Solution Use the VESA Video Bios Extension (VBE)

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

PC BIOS

I Basic Input-Output System isI A firmware interface for accessing PC HW resourcesI The implementation of this interfaceI The non-volatile memory (ROM more recently flash-RAM)

containing that implementationI It is used mostly when a PC starts up

I It is 16-bits even IA-32 processors start in real-modeI It is used essentially to load the OS (or part of it)I Once the OS is loaded it usually uses its own code to

access the HW not the BIOS

BIOS Calls

I Access to BIOS services is via the SW interrupt instructionINT xx

I The xx is 8 bit and specifies the serviceI Any arguments required are passed via the processor

registersI Standard BIOS services

Interrupt vector (xx) Service10h video card11h PC configuration12h memory configuration16h keyboard

BIOS Call Example

I Set Video Mode INT 10h function 00h set video mode

MOV AH 0 functionMOV AL 3 text 25 lines X 80 columns 16 colorsINT 10h

How to make a BIOS Call in Minix 31x

ProblemI The previous example is in real address modeI Minix 3 uses protected mode with 32-bit

SolutionI Use Minix 3 kernel call SYS_INT86

ldquoMake a real-mode BIOS on behalf of a user-space devicedriver This temporarily switches from 32-bit protectedmode to 16-bit real-mode to access the BIOS callsrdquo

BIOS Call in Minix 3 Exampleinclude ltmachineint86hgt usrsrcincludearchi386int vg_exit() struct reg86u reg86

reg86ubintno = 0x10reg86ubah = 0x00reg86ubal = 0x03

if( sys_int86(ampreg86) = OK ) printf(vg_exit() sys_int86() failed n)return 1

return 0

I struct reg86u is a struct with a union of structsb is the member to access 8-bit registersw is the member to access 16-bit registersl is the member to access 32-bit registers

I The names of the members of the structs are the standardnames of IA-32 registers

Video BIOS Extension (VBE)

I The BIOS specification supports only VGA graphics modes

I VGA stands for Video Graphics AdapterI Specifies very low resolution 640x480 16 colors and

320x240 256 colorsI The Video Electronics Standards Association (VESA)

developed the Video BIOS Extension (VBE) standards inorder to make programming with higher resolutionsportable

I Early VBE versions specify only a real-mode interfaceI Later versions added a protected-mode interface but

I In version 2 only for some time-critical functionsI In version 3 supports more functions but they are optional

VBE INT 0x10 Interface

I VBE still uses INT 0x10 but to distinguish it from basicvideo BIOS services

I AH = 4Fh - BIOS uses AH for the functionI AL = function

I VBE graphics mode 105h 1024x768256 linear modestruct reg86u rruwax = 0x4F02 VBE call function 02 -- set VBE moderuwbx = 1ltlt14|0x105 set bit 14 linear framebufferrubintno = 0x10if( sys_int86(ampr) = OK )

printf(set_vbe_mode sys_int86() failed n)return 1

You should use symbolic constants

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Mapping the Linear Frame BufferI Before you can write to the frame buffer

HRES pixels

V

R

E

S

p

i

x

e

l

scolor (00)

color (10)

color (Hres0)

color (01)

1 Obtain the physical memory address11 Using a hard-coded address (0xE0000000) first

I This address may depend on the VM used So I provide aprogram that allows you to find out this address

12 Using Function 0x01 Return VBE Mode Information onceeverything else has been completed

2 Map the physical memory region into the processrsquo addressspace

Virtual and Physical Address Spaces

Issue Most computer architectures support a virtual addressspace that is decoupled from the physical address space

I Processes can access (physical) memory using alogical address that is independent of the physicaladdress (determined by the address bus decodingcircuitry)

I Most modern operating systems including Minix takeadvantage of this feature to simplify memorymanagement

Mapping Physical Memory to Virtual Address Space

I Each process has its own virtual address space whosesize is usually determined by the processor architecture(32-bit for IA-32)

I The operating system maps regions of the physicalmemory in the computer to the virtual address spaces ofthe different processes

I The details of how this is done are studied in the OperatingSystems course

Mapping VRAM in Minix (12)int rstruct mem_range mrunsigned int vram_base VRAMrsquos physical addresss unsigned int vram_size VRAMrsquos size but you can use

the frame-buffer size instead void video_mem frame-buffer VM address

Allow memory mapping

mrmr_base = (phys_bytes) vram_basemrmr_limit = mrmr_base + vram_size

if( OK = (r = sys_privctl(SELF SYS_PRIV_ADD_MEM ampmr)))panic(sys_privctl (ADD_MEM) failed dn r)

Map memory

video_mem = vm_map_phys(SELF (void )mrmr_base vram_size)

if(video_mem == MAP_FAILED)panic(couldnrsquot map video memory)

Mapping VRAM in Minix (22)

Question What is the following code about Allow memory mapping

mrmr_base = (phys_bytes) vram_basemrmr_limit = mrmr_base + vram_size

if( OK = (r = sys_privctl(SELF SYS_PRIV_ADD_MEM ampmr)))panic(sys_privctl (ADD_MEM) failed dn r)

Answer In modern operating systems user-level processescannot access directly HW resources including physicalmemory and VRAM

I Minix 3 handles this by allowing to grant privilegeduser-level processes the permissions they require toperform their tasks

Lab 5 - Part 1 Key Programming Issue

Issue Given a virtual address how can a program accessthe physical memory mapped to that virtual address

Solution Use C pointers

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Finding the Physical Memory Address with VBE (15)

I VBE Function 01h - Return VBE Mode InformationInput

AX = 4F01h Return VBE Mode InformationCX = Mode numberESDI = Pointer to ModeInfoBlock structure

OuputAX = VBE return status

I The ModeInfoBlock includes among other information1 The mode attributes which comprise a set of bits that

describe some general characteristics of the modeincluding whether

I it is supported by the adapterI the linear frame buffer is available

2 The screen resolution of the mode3 The physical address of the linear frame buffer

Finding the Physical Memory Address with VBE (25)

ProblemI The ModeInfoBlock structure must be accessible both in

protected mode and in real modeI VBE Function 01h is a real mode functionI Real mode addresses are only 20-bit long (must be in the

lower 1MiB)

SolutionI Use liblma library

I Provides a simple interface for applicationslm_init()lm_alloc()lm_free()

I Hides some non-documented functions provided by Minix 3I The mmap_t (already used in Lab 1) includes both

I The physical address for use by VBEI The virtual address for use in Minix 3

Finding the Physical Memory Address with VBE (35)

phys_bytes bufstruct reg86u r

[]

ruwax = 0x4F01 VBE get mode info translate the buffer linear address to a far pointer ruwes = PB2BASE(buf) set a segment base ruwdi = PB2OFF(buf) set the offset accordingly ruwcx = moderubintno = 0x10if( sys_int86(ampr) = OK ) call BIOS

PB2BASE Is a macro for computing the base of a segment a16-bit value given a 32-bit linear address

PB2OFF Is a macro for computing the offset with respect to thebase of a segment a 16-bit value given a 32-bit linearaddress

Finding the Physical Memory Address with VBE (45)

Problem The parameters contained in the buffer returned byVBE function 0x01 are layed out sequentially with no holesbetween them

I Simply defining a C struct with one member perparameter with an appropriate type is not enough

I C compilers layout the members of a struct in order andplace them in memory positions whose address isaligned according to their type

Solution Use GCCrsquos __attribute__((packed))I In principle this should be handled by thepragma pack directives but it is not supported by thisversion of GCC

Note that this attribute must appear immediately after the otherwise it has no effect

I You need not do anything as Irsquove already defined thestruct in vbeh

Finding the Physical Memory Address with VBE (55)

include ltstdinthgt

typedef struct

uint16_t ModeAttributes[]uint16_t XResolutionuint16_t YResolution[]uint8_t BitsPerPixel[]uint32_t PhysBasePtr[]

__attribute__((packed)) vbe_mode_info_t

  • Graphics AdapterVideo Card
  • Video Card in Graphics Mode
  • Lab 5
  • BIOS and VBE
  • Accessing VRAM
  • VBE Function 0x01
Page 7: Computer Labs: Lab5 Video Card in Graphics Mode - 2º MIEICpfs/aulas/lcom2016/at/13vbe.pdf · Computer Labs: Lab5 Video Card in Graphics Mode 2o MIEIC Pedro F. Souto (pfs@fe.up.pt)

Video Card in Graphics Mode

I The screen is abstracted as a matrix of points or pixelsI With HRES pixels per lineI With VRES pixels per column

I For each pixel the VRAM holds its colorHRES pixels

VRES

pixels

VRAM

How Are Colors Encoded (12)

I Most electronic display devices use the RGB color modelI A color is obtained by adding 3 primary colors ndash red green blue ndash

each of which with its own intensityI This model is related to the physiology of the human eye

I One way to represent a color is to use a triple with a givenintensity per primary color

I Depending on the number of bits used to represent the intensity ofeach primary color we have a different number of colors

I Eg if we use 8 bits per primary color we are able to represent224 = 16777216 colors

How Are Colors Encoded (22)Direct-color mode Store the color of each pixel in the VRAM

I For 8 bits per primary color if we use a resolution of1024 times 768 we need a little bit more than 2 MB per screen

Indexed color Rather than store the color per pixel store an index intoa table ndash the palettecolor map ndash with the color definition ie theintensity of the 3 primary colors

I With an 8 bit index we can represent 256 colors each of whichmay have 8 bits or more per primary color

I By changing the palette it is possible to render more than 256colors

I In the lab yoursquoll use a palette with up to 256 colors whose defaultinitialization on both VMware Player and VirtualBoxI Uses only the first 64 of the 256

elementsI The first time it switches to the

mode the colors are not asbright ndash donrsquot ask me why

Memory ModelsI The memory model determines the way the value of each

pixel is stored in VRAMI Different graphics modes use different memory models

I The simplest mode and the one that will be used in thelab is the linear mode

HRES pixels

V

R

E

S

p

i

x

e

l

scolor (00)

color (10)

color (Hres0)

color (01)

All we need to know isI The base address of the frame bufferI The coordinates of the pixelI The number of bytes used to encode the color

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Lab5 Video Card in Graphics Mode

I Write a set of functionsvoid test_init(unsigned short mode unsigned short delay)int test_square(unsigned short x unsigned short y )int test_line(unsigned short xi unsigned short yi )int test_xpm(unsigned short xi unsigned short yi )int test_move(unsigned short xi unsigned short yi )int test_controller()

to set the screen to graphics mode and to change the display inthat mode

I The goal for the first class is to implemente the first 3 functionsI Essentially you have to

1 Configure the video card for the desired graphics modeI Minix 3 boots in text mode not in graphics mode

2 Write to VRAM to display on the screen what is requestedI Map VRAM to the processrsquo address space

3 Reset the video card to the text mode used by MinixI You need only to call a function that we provide you

Video Card Configuration (test_init())

Problem How do you configure the desired graphics modeNO Solution Readwrite directly the GPU registers

I GPU manufacturers usually do not provide the detailsnecessary for that level of programming

Solution Use the VESA Video Bios Extension (VBE)

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

PC BIOS

I Basic Input-Output System isI A firmware interface for accessing PC HW resourcesI The implementation of this interfaceI The non-volatile memory (ROM more recently flash-RAM)

containing that implementationI It is used mostly when a PC starts up

I It is 16-bits even IA-32 processors start in real-modeI It is used essentially to load the OS (or part of it)I Once the OS is loaded it usually uses its own code to

access the HW not the BIOS

BIOS Calls

I Access to BIOS services is via the SW interrupt instructionINT xx

I The xx is 8 bit and specifies the serviceI Any arguments required are passed via the processor

registersI Standard BIOS services

Interrupt vector (xx) Service10h video card11h PC configuration12h memory configuration16h keyboard

BIOS Call Example

I Set Video Mode INT 10h function 00h set video mode

MOV AH 0 functionMOV AL 3 text 25 lines X 80 columns 16 colorsINT 10h

How to make a BIOS Call in Minix 31x

ProblemI The previous example is in real address modeI Minix 3 uses protected mode with 32-bit

SolutionI Use Minix 3 kernel call SYS_INT86

ldquoMake a real-mode BIOS on behalf of a user-space devicedriver This temporarily switches from 32-bit protectedmode to 16-bit real-mode to access the BIOS callsrdquo

BIOS Call in Minix 3 Exampleinclude ltmachineint86hgt usrsrcincludearchi386int vg_exit() struct reg86u reg86

reg86ubintno = 0x10reg86ubah = 0x00reg86ubal = 0x03

if( sys_int86(ampreg86) = OK ) printf(vg_exit() sys_int86() failed n)return 1

return 0

I struct reg86u is a struct with a union of structsb is the member to access 8-bit registersw is the member to access 16-bit registersl is the member to access 32-bit registers

I The names of the members of the structs are the standardnames of IA-32 registers

Video BIOS Extension (VBE)

I The BIOS specification supports only VGA graphics modes

I VGA stands for Video Graphics AdapterI Specifies very low resolution 640x480 16 colors and

320x240 256 colorsI The Video Electronics Standards Association (VESA)

developed the Video BIOS Extension (VBE) standards inorder to make programming with higher resolutionsportable

I Early VBE versions specify only a real-mode interfaceI Later versions added a protected-mode interface but

I In version 2 only for some time-critical functionsI In version 3 supports more functions but they are optional

VBE INT 0x10 Interface

I VBE still uses INT 0x10 but to distinguish it from basicvideo BIOS services

I AH = 4Fh - BIOS uses AH for the functionI AL = function

I VBE graphics mode 105h 1024x768256 linear modestruct reg86u rruwax = 0x4F02 VBE call function 02 -- set VBE moderuwbx = 1ltlt14|0x105 set bit 14 linear framebufferrubintno = 0x10if( sys_int86(ampr) = OK )

printf(set_vbe_mode sys_int86() failed n)return 1

You should use symbolic constants

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Mapping the Linear Frame BufferI Before you can write to the frame buffer

HRES pixels

V

R

E

S

p

i

x

e

l

scolor (00)

color (10)

color (Hres0)

color (01)

1 Obtain the physical memory address11 Using a hard-coded address (0xE0000000) first

I This address may depend on the VM used So I provide aprogram that allows you to find out this address

12 Using Function 0x01 Return VBE Mode Information onceeverything else has been completed

2 Map the physical memory region into the processrsquo addressspace

Virtual and Physical Address Spaces

Issue Most computer architectures support a virtual addressspace that is decoupled from the physical address space

I Processes can access (physical) memory using alogical address that is independent of the physicaladdress (determined by the address bus decodingcircuitry)

I Most modern operating systems including Minix takeadvantage of this feature to simplify memorymanagement

Mapping Physical Memory to Virtual Address Space

I Each process has its own virtual address space whosesize is usually determined by the processor architecture(32-bit for IA-32)

I The operating system maps regions of the physicalmemory in the computer to the virtual address spaces ofthe different processes

I The details of how this is done are studied in the OperatingSystems course

Mapping VRAM in Minix (12)int rstruct mem_range mrunsigned int vram_base VRAMrsquos physical addresss unsigned int vram_size VRAMrsquos size but you can use

the frame-buffer size instead void video_mem frame-buffer VM address

Allow memory mapping

mrmr_base = (phys_bytes) vram_basemrmr_limit = mrmr_base + vram_size

if( OK = (r = sys_privctl(SELF SYS_PRIV_ADD_MEM ampmr)))panic(sys_privctl (ADD_MEM) failed dn r)

Map memory

video_mem = vm_map_phys(SELF (void )mrmr_base vram_size)

if(video_mem == MAP_FAILED)panic(couldnrsquot map video memory)

Mapping VRAM in Minix (22)

Question What is the following code about Allow memory mapping

mrmr_base = (phys_bytes) vram_basemrmr_limit = mrmr_base + vram_size

if( OK = (r = sys_privctl(SELF SYS_PRIV_ADD_MEM ampmr)))panic(sys_privctl (ADD_MEM) failed dn r)

Answer In modern operating systems user-level processescannot access directly HW resources including physicalmemory and VRAM

I Minix 3 handles this by allowing to grant privilegeduser-level processes the permissions they require toperform their tasks

Lab 5 - Part 1 Key Programming Issue

Issue Given a virtual address how can a program accessthe physical memory mapped to that virtual address

Solution Use C pointers

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Finding the Physical Memory Address with VBE (15)

I VBE Function 01h - Return VBE Mode InformationInput

AX = 4F01h Return VBE Mode InformationCX = Mode numberESDI = Pointer to ModeInfoBlock structure

OuputAX = VBE return status

I The ModeInfoBlock includes among other information1 The mode attributes which comprise a set of bits that

describe some general characteristics of the modeincluding whether

I it is supported by the adapterI the linear frame buffer is available

2 The screen resolution of the mode3 The physical address of the linear frame buffer

Finding the Physical Memory Address with VBE (25)

ProblemI The ModeInfoBlock structure must be accessible both in

protected mode and in real modeI VBE Function 01h is a real mode functionI Real mode addresses are only 20-bit long (must be in the

lower 1MiB)

SolutionI Use liblma library

I Provides a simple interface for applicationslm_init()lm_alloc()lm_free()

I Hides some non-documented functions provided by Minix 3I The mmap_t (already used in Lab 1) includes both

I The physical address for use by VBEI The virtual address for use in Minix 3

Finding the Physical Memory Address with VBE (35)

phys_bytes bufstruct reg86u r

[]

ruwax = 0x4F01 VBE get mode info translate the buffer linear address to a far pointer ruwes = PB2BASE(buf) set a segment base ruwdi = PB2OFF(buf) set the offset accordingly ruwcx = moderubintno = 0x10if( sys_int86(ampr) = OK ) call BIOS

PB2BASE Is a macro for computing the base of a segment a16-bit value given a 32-bit linear address

PB2OFF Is a macro for computing the offset with respect to thebase of a segment a 16-bit value given a 32-bit linearaddress

Finding the Physical Memory Address with VBE (45)

Problem The parameters contained in the buffer returned byVBE function 0x01 are layed out sequentially with no holesbetween them

I Simply defining a C struct with one member perparameter with an appropriate type is not enough

I C compilers layout the members of a struct in order andplace them in memory positions whose address isaligned according to their type

Solution Use GCCrsquos __attribute__((packed))I In principle this should be handled by thepragma pack directives but it is not supported by thisversion of GCC

Note that this attribute must appear immediately after the otherwise it has no effect

I You need not do anything as Irsquove already defined thestruct in vbeh

Finding the Physical Memory Address with VBE (55)

include ltstdinthgt

typedef struct

uint16_t ModeAttributes[]uint16_t XResolutionuint16_t YResolution[]uint8_t BitsPerPixel[]uint32_t PhysBasePtr[]

__attribute__((packed)) vbe_mode_info_t

  • Graphics AdapterVideo Card
  • Video Card in Graphics Mode
  • Lab 5
  • BIOS and VBE
  • Accessing VRAM
  • VBE Function 0x01
Page 8: Computer Labs: Lab5 Video Card in Graphics Mode - 2º MIEICpfs/aulas/lcom2016/at/13vbe.pdf · Computer Labs: Lab5 Video Card in Graphics Mode 2o MIEIC Pedro F. Souto (pfs@fe.up.pt)

How Are Colors Encoded (12)

I Most electronic display devices use the RGB color modelI A color is obtained by adding 3 primary colors ndash red green blue ndash

each of which with its own intensityI This model is related to the physiology of the human eye

I One way to represent a color is to use a triple with a givenintensity per primary color

I Depending on the number of bits used to represent the intensity ofeach primary color we have a different number of colors

I Eg if we use 8 bits per primary color we are able to represent224 = 16777216 colors

How Are Colors Encoded (22)Direct-color mode Store the color of each pixel in the VRAM

I For 8 bits per primary color if we use a resolution of1024 times 768 we need a little bit more than 2 MB per screen

Indexed color Rather than store the color per pixel store an index intoa table ndash the palettecolor map ndash with the color definition ie theintensity of the 3 primary colors

I With an 8 bit index we can represent 256 colors each of whichmay have 8 bits or more per primary color

I By changing the palette it is possible to render more than 256colors

I In the lab yoursquoll use a palette with up to 256 colors whose defaultinitialization on both VMware Player and VirtualBoxI Uses only the first 64 of the 256

elementsI The first time it switches to the

mode the colors are not asbright ndash donrsquot ask me why

Memory ModelsI The memory model determines the way the value of each

pixel is stored in VRAMI Different graphics modes use different memory models

I The simplest mode and the one that will be used in thelab is the linear mode

HRES pixels

V

R

E

S

p

i

x

e

l

scolor (00)

color (10)

color (Hres0)

color (01)

All we need to know isI The base address of the frame bufferI The coordinates of the pixelI The number of bytes used to encode the color

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Lab5 Video Card in Graphics Mode

I Write a set of functionsvoid test_init(unsigned short mode unsigned short delay)int test_square(unsigned short x unsigned short y )int test_line(unsigned short xi unsigned short yi )int test_xpm(unsigned short xi unsigned short yi )int test_move(unsigned short xi unsigned short yi )int test_controller()

to set the screen to graphics mode and to change the display inthat mode

I The goal for the first class is to implemente the first 3 functionsI Essentially you have to

1 Configure the video card for the desired graphics modeI Minix 3 boots in text mode not in graphics mode

2 Write to VRAM to display on the screen what is requestedI Map VRAM to the processrsquo address space

3 Reset the video card to the text mode used by MinixI You need only to call a function that we provide you

Video Card Configuration (test_init())

Problem How do you configure the desired graphics modeNO Solution Readwrite directly the GPU registers

I GPU manufacturers usually do not provide the detailsnecessary for that level of programming

Solution Use the VESA Video Bios Extension (VBE)

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

PC BIOS

I Basic Input-Output System isI A firmware interface for accessing PC HW resourcesI The implementation of this interfaceI The non-volatile memory (ROM more recently flash-RAM)

containing that implementationI It is used mostly when a PC starts up

I It is 16-bits even IA-32 processors start in real-modeI It is used essentially to load the OS (or part of it)I Once the OS is loaded it usually uses its own code to

access the HW not the BIOS

BIOS Calls

I Access to BIOS services is via the SW interrupt instructionINT xx

I The xx is 8 bit and specifies the serviceI Any arguments required are passed via the processor

registersI Standard BIOS services

Interrupt vector (xx) Service10h video card11h PC configuration12h memory configuration16h keyboard

BIOS Call Example

I Set Video Mode INT 10h function 00h set video mode

MOV AH 0 functionMOV AL 3 text 25 lines X 80 columns 16 colorsINT 10h

How to make a BIOS Call in Minix 31x

ProblemI The previous example is in real address modeI Minix 3 uses protected mode with 32-bit

SolutionI Use Minix 3 kernel call SYS_INT86

ldquoMake a real-mode BIOS on behalf of a user-space devicedriver This temporarily switches from 32-bit protectedmode to 16-bit real-mode to access the BIOS callsrdquo

BIOS Call in Minix 3 Exampleinclude ltmachineint86hgt usrsrcincludearchi386int vg_exit() struct reg86u reg86

reg86ubintno = 0x10reg86ubah = 0x00reg86ubal = 0x03

if( sys_int86(ampreg86) = OK ) printf(vg_exit() sys_int86() failed n)return 1

return 0

I struct reg86u is a struct with a union of structsb is the member to access 8-bit registersw is the member to access 16-bit registersl is the member to access 32-bit registers

I The names of the members of the structs are the standardnames of IA-32 registers

Video BIOS Extension (VBE)

I The BIOS specification supports only VGA graphics modes

I VGA stands for Video Graphics AdapterI Specifies very low resolution 640x480 16 colors and

320x240 256 colorsI The Video Electronics Standards Association (VESA)

developed the Video BIOS Extension (VBE) standards inorder to make programming with higher resolutionsportable

I Early VBE versions specify only a real-mode interfaceI Later versions added a protected-mode interface but

I In version 2 only for some time-critical functionsI In version 3 supports more functions but they are optional

VBE INT 0x10 Interface

I VBE still uses INT 0x10 but to distinguish it from basicvideo BIOS services

I AH = 4Fh - BIOS uses AH for the functionI AL = function

I VBE graphics mode 105h 1024x768256 linear modestruct reg86u rruwax = 0x4F02 VBE call function 02 -- set VBE moderuwbx = 1ltlt14|0x105 set bit 14 linear framebufferrubintno = 0x10if( sys_int86(ampr) = OK )

printf(set_vbe_mode sys_int86() failed n)return 1

You should use symbolic constants

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Mapping the Linear Frame BufferI Before you can write to the frame buffer

HRES pixels

V

R

E

S

p

i

x

e

l

scolor (00)

color (10)

color (Hres0)

color (01)

1 Obtain the physical memory address11 Using a hard-coded address (0xE0000000) first

I This address may depend on the VM used So I provide aprogram that allows you to find out this address

12 Using Function 0x01 Return VBE Mode Information onceeverything else has been completed

2 Map the physical memory region into the processrsquo addressspace

Virtual and Physical Address Spaces

Issue Most computer architectures support a virtual addressspace that is decoupled from the physical address space

I Processes can access (physical) memory using alogical address that is independent of the physicaladdress (determined by the address bus decodingcircuitry)

I Most modern operating systems including Minix takeadvantage of this feature to simplify memorymanagement

Mapping Physical Memory to Virtual Address Space

I Each process has its own virtual address space whosesize is usually determined by the processor architecture(32-bit for IA-32)

I The operating system maps regions of the physicalmemory in the computer to the virtual address spaces ofthe different processes

I The details of how this is done are studied in the OperatingSystems course

Mapping VRAM in Minix (12)int rstruct mem_range mrunsigned int vram_base VRAMrsquos physical addresss unsigned int vram_size VRAMrsquos size but you can use

the frame-buffer size instead void video_mem frame-buffer VM address

Allow memory mapping

mrmr_base = (phys_bytes) vram_basemrmr_limit = mrmr_base + vram_size

if( OK = (r = sys_privctl(SELF SYS_PRIV_ADD_MEM ampmr)))panic(sys_privctl (ADD_MEM) failed dn r)

Map memory

video_mem = vm_map_phys(SELF (void )mrmr_base vram_size)

if(video_mem == MAP_FAILED)panic(couldnrsquot map video memory)

Mapping VRAM in Minix (22)

Question What is the following code about Allow memory mapping

mrmr_base = (phys_bytes) vram_basemrmr_limit = mrmr_base + vram_size

if( OK = (r = sys_privctl(SELF SYS_PRIV_ADD_MEM ampmr)))panic(sys_privctl (ADD_MEM) failed dn r)

Answer In modern operating systems user-level processescannot access directly HW resources including physicalmemory and VRAM

I Minix 3 handles this by allowing to grant privilegeduser-level processes the permissions they require toperform their tasks

Lab 5 - Part 1 Key Programming Issue

Issue Given a virtual address how can a program accessthe physical memory mapped to that virtual address

Solution Use C pointers

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Finding the Physical Memory Address with VBE (15)

I VBE Function 01h - Return VBE Mode InformationInput

AX = 4F01h Return VBE Mode InformationCX = Mode numberESDI = Pointer to ModeInfoBlock structure

OuputAX = VBE return status

I The ModeInfoBlock includes among other information1 The mode attributes which comprise a set of bits that

describe some general characteristics of the modeincluding whether

I it is supported by the adapterI the linear frame buffer is available

2 The screen resolution of the mode3 The physical address of the linear frame buffer

Finding the Physical Memory Address with VBE (25)

ProblemI The ModeInfoBlock structure must be accessible both in

protected mode and in real modeI VBE Function 01h is a real mode functionI Real mode addresses are only 20-bit long (must be in the

lower 1MiB)

SolutionI Use liblma library

I Provides a simple interface for applicationslm_init()lm_alloc()lm_free()

I Hides some non-documented functions provided by Minix 3I The mmap_t (already used in Lab 1) includes both

I The physical address for use by VBEI The virtual address for use in Minix 3

Finding the Physical Memory Address with VBE (35)

phys_bytes bufstruct reg86u r

[]

ruwax = 0x4F01 VBE get mode info translate the buffer linear address to a far pointer ruwes = PB2BASE(buf) set a segment base ruwdi = PB2OFF(buf) set the offset accordingly ruwcx = moderubintno = 0x10if( sys_int86(ampr) = OK ) call BIOS

PB2BASE Is a macro for computing the base of a segment a16-bit value given a 32-bit linear address

PB2OFF Is a macro for computing the offset with respect to thebase of a segment a 16-bit value given a 32-bit linearaddress

Finding the Physical Memory Address with VBE (45)

Problem The parameters contained in the buffer returned byVBE function 0x01 are layed out sequentially with no holesbetween them

I Simply defining a C struct with one member perparameter with an appropriate type is not enough

I C compilers layout the members of a struct in order andplace them in memory positions whose address isaligned according to their type

Solution Use GCCrsquos __attribute__((packed))I In principle this should be handled by thepragma pack directives but it is not supported by thisversion of GCC

Note that this attribute must appear immediately after the otherwise it has no effect

I You need not do anything as Irsquove already defined thestruct in vbeh

Finding the Physical Memory Address with VBE (55)

include ltstdinthgt

typedef struct

uint16_t ModeAttributes[]uint16_t XResolutionuint16_t YResolution[]uint8_t BitsPerPixel[]uint32_t PhysBasePtr[]

__attribute__((packed)) vbe_mode_info_t

  • Graphics AdapterVideo Card
  • Video Card in Graphics Mode
  • Lab 5
  • BIOS and VBE
  • Accessing VRAM
  • VBE Function 0x01
Page 9: Computer Labs: Lab5 Video Card in Graphics Mode - 2º MIEICpfs/aulas/lcom2016/at/13vbe.pdf · Computer Labs: Lab5 Video Card in Graphics Mode 2o MIEIC Pedro F. Souto (pfs@fe.up.pt)

How Are Colors Encoded (22)Direct-color mode Store the color of each pixel in the VRAM

I For 8 bits per primary color if we use a resolution of1024 times 768 we need a little bit more than 2 MB per screen

Indexed color Rather than store the color per pixel store an index intoa table ndash the palettecolor map ndash with the color definition ie theintensity of the 3 primary colors

I With an 8 bit index we can represent 256 colors each of whichmay have 8 bits or more per primary color

I By changing the palette it is possible to render more than 256colors

I In the lab yoursquoll use a palette with up to 256 colors whose defaultinitialization on both VMware Player and VirtualBoxI Uses only the first 64 of the 256

elementsI The first time it switches to the

mode the colors are not asbright ndash donrsquot ask me why

Memory ModelsI The memory model determines the way the value of each

pixel is stored in VRAMI Different graphics modes use different memory models

I The simplest mode and the one that will be used in thelab is the linear mode

HRES pixels

V

R

E

S

p

i

x

e

l

scolor (00)

color (10)

color (Hres0)

color (01)

All we need to know isI The base address of the frame bufferI The coordinates of the pixelI The number of bytes used to encode the color

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Lab5 Video Card in Graphics Mode

I Write a set of functionsvoid test_init(unsigned short mode unsigned short delay)int test_square(unsigned short x unsigned short y )int test_line(unsigned short xi unsigned short yi )int test_xpm(unsigned short xi unsigned short yi )int test_move(unsigned short xi unsigned short yi )int test_controller()

to set the screen to graphics mode and to change the display inthat mode

I The goal for the first class is to implemente the first 3 functionsI Essentially you have to

1 Configure the video card for the desired graphics modeI Minix 3 boots in text mode not in graphics mode

2 Write to VRAM to display on the screen what is requestedI Map VRAM to the processrsquo address space

3 Reset the video card to the text mode used by MinixI You need only to call a function that we provide you

Video Card Configuration (test_init())

Problem How do you configure the desired graphics modeNO Solution Readwrite directly the GPU registers

I GPU manufacturers usually do not provide the detailsnecessary for that level of programming

Solution Use the VESA Video Bios Extension (VBE)

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

PC BIOS

I Basic Input-Output System isI A firmware interface for accessing PC HW resourcesI The implementation of this interfaceI The non-volatile memory (ROM more recently flash-RAM)

containing that implementationI It is used mostly when a PC starts up

I It is 16-bits even IA-32 processors start in real-modeI It is used essentially to load the OS (or part of it)I Once the OS is loaded it usually uses its own code to

access the HW not the BIOS

BIOS Calls

I Access to BIOS services is via the SW interrupt instructionINT xx

I The xx is 8 bit and specifies the serviceI Any arguments required are passed via the processor

registersI Standard BIOS services

Interrupt vector (xx) Service10h video card11h PC configuration12h memory configuration16h keyboard

BIOS Call Example

I Set Video Mode INT 10h function 00h set video mode

MOV AH 0 functionMOV AL 3 text 25 lines X 80 columns 16 colorsINT 10h

How to make a BIOS Call in Minix 31x

ProblemI The previous example is in real address modeI Minix 3 uses protected mode with 32-bit

SolutionI Use Minix 3 kernel call SYS_INT86

ldquoMake a real-mode BIOS on behalf of a user-space devicedriver This temporarily switches from 32-bit protectedmode to 16-bit real-mode to access the BIOS callsrdquo

BIOS Call in Minix 3 Exampleinclude ltmachineint86hgt usrsrcincludearchi386int vg_exit() struct reg86u reg86

reg86ubintno = 0x10reg86ubah = 0x00reg86ubal = 0x03

if( sys_int86(ampreg86) = OK ) printf(vg_exit() sys_int86() failed n)return 1

return 0

I struct reg86u is a struct with a union of structsb is the member to access 8-bit registersw is the member to access 16-bit registersl is the member to access 32-bit registers

I The names of the members of the structs are the standardnames of IA-32 registers

Video BIOS Extension (VBE)

I The BIOS specification supports only VGA graphics modes

I VGA stands for Video Graphics AdapterI Specifies very low resolution 640x480 16 colors and

320x240 256 colorsI The Video Electronics Standards Association (VESA)

developed the Video BIOS Extension (VBE) standards inorder to make programming with higher resolutionsportable

I Early VBE versions specify only a real-mode interfaceI Later versions added a protected-mode interface but

I In version 2 only for some time-critical functionsI In version 3 supports more functions but they are optional

VBE INT 0x10 Interface

I VBE still uses INT 0x10 but to distinguish it from basicvideo BIOS services

I AH = 4Fh - BIOS uses AH for the functionI AL = function

I VBE graphics mode 105h 1024x768256 linear modestruct reg86u rruwax = 0x4F02 VBE call function 02 -- set VBE moderuwbx = 1ltlt14|0x105 set bit 14 linear framebufferrubintno = 0x10if( sys_int86(ampr) = OK )

printf(set_vbe_mode sys_int86() failed n)return 1

You should use symbolic constants

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Mapping the Linear Frame BufferI Before you can write to the frame buffer

HRES pixels

V

R

E

S

p

i

x

e

l

scolor (00)

color (10)

color (Hres0)

color (01)

1 Obtain the physical memory address11 Using a hard-coded address (0xE0000000) first

I This address may depend on the VM used So I provide aprogram that allows you to find out this address

12 Using Function 0x01 Return VBE Mode Information onceeverything else has been completed

2 Map the physical memory region into the processrsquo addressspace

Virtual and Physical Address Spaces

Issue Most computer architectures support a virtual addressspace that is decoupled from the physical address space

I Processes can access (physical) memory using alogical address that is independent of the physicaladdress (determined by the address bus decodingcircuitry)

I Most modern operating systems including Minix takeadvantage of this feature to simplify memorymanagement

Mapping Physical Memory to Virtual Address Space

I Each process has its own virtual address space whosesize is usually determined by the processor architecture(32-bit for IA-32)

I The operating system maps regions of the physicalmemory in the computer to the virtual address spaces ofthe different processes

I The details of how this is done are studied in the OperatingSystems course

Mapping VRAM in Minix (12)int rstruct mem_range mrunsigned int vram_base VRAMrsquos physical addresss unsigned int vram_size VRAMrsquos size but you can use

the frame-buffer size instead void video_mem frame-buffer VM address

Allow memory mapping

mrmr_base = (phys_bytes) vram_basemrmr_limit = mrmr_base + vram_size

if( OK = (r = sys_privctl(SELF SYS_PRIV_ADD_MEM ampmr)))panic(sys_privctl (ADD_MEM) failed dn r)

Map memory

video_mem = vm_map_phys(SELF (void )mrmr_base vram_size)

if(video_mem == MAP_FAILED)panic(couldnrsquot map video memory)

Mapping VRAM in Minix (22)

Question What is the following code about Allow memory mapping

mrmr_base = (phys_bytes) vram_basemrmr_limit = mrmr_base + vram_size

if( OK = (r = sys_privctl(SELF SYS_PRIV_ADD_MEM ampmr)))panic(sys_privctl (ADD_MEM) failed dn r)

Answer In modern operating systems user-level processescannot access directly HW resources including physicalmemory and VRAM

I Minix 3 handles this by allowing to grant privilegeduser-level processes the permissions they require toperform their tasks

Lab 5 - Part 1 Key Programming Issue

Issue Given a virtual address how can a program accessthe physical memory mapped to that virtual address

Solution Use C pointers

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Finding the Physical Memory Address with VBE (15)

I VBE Function 01h - Return VBE Mode InformationInput

AX = 4F01h Return VBE Mode InformationCX = Mode numberESDI = Pointer to ModeInfoBlock structure

OuputAX = VBE return status

I The ModeInfoBlock includes among other information1 The mode attributes which comprise a set of bits that

describe some general characteristics of the modeincluding whether

I it is supported by the adapterI the linear frame buffer is available

2 The screen resolution of the mode3 The physical address of the linear frame buffer

Finding the Physical Memory Address with VBE (25)

ProblemI The ModeInfoBlock structure must be accessible both in

protected mode and in real modeI VBE Function 01h is a real mode functionI Real mode addresses are only 20-bit long (must be in the

lower 1MiB)

SolutionI Use liblma library

I Provides a simple interface for applicationslm_init()lm_alloc()lm_free()

I Hides some non-documented functions provided by Minix 3I The mmap_t (already used in Lab 1) includes both

I The physical address for use by VBEI The virtual address for use in Minix 3

Finding the Physical Memory Address with VBE (35)

phys_bytes bufstruct reg86u r

[]

ruwax = 0x4F01 VBE get mode info translate the buffer linear address to a far pointer ruwes = PB2BASE(buf) set a segment base ruwdi = PB2OFF(buf) set the offset accordingly ruwcx = moderubintno = 0x10if( sys_int86(ampr) = OK ) call BIOS

PB2BASE Is a macro for computing the base of a segment a16-bit value given a 32-bit linear address

PB2OFF Is a macro for computing the offset with respect to thebase of a segment a 16-bit value given a 32-bit linearaddress

Finding the Physical Memory Address with VBE (45)

Problem The parameters contained in the buffer returned byVBE function 0x01 are layed out sequentially with no holesbetween them

I Simply defining a C struct with one member perparameter with an appropriate type is not enough

I C compilers layout the members of a struct in order andplace them in memory positions whose address isaligned according to their type

Solution Use GCCrsquos __attribute__((packed))I In principle this should be handled by thepragma pack directives but it is not supported by thisversion of GCC

Note that this attribute must appear immediately after the otherwise it has no effect

I You need not do anything as Irsquove already defined thestruct in vbeh

Finding the Physical Memory Address with VBE (55)

include ltstdinthgt

typedef struct

uint16_t ModeAttributes[]uint16_t XResolutionuint16_t YResolution[]uint8_t BitsPerPixel[]uint32_t PhysBasePtr[]

__attribute__((packed)) vbe_mode_info_t

  • Graphics AdapterVideo Card
  • Video Card in Graphics Mode
  • Lab 5
  • BIOS and VBE
  • Accessing VRAM
  • VBE Function 0x01
Page 10: Computer Labs: Lab5 Video Card in Graphics Mode - 2º MIEICpfs/aulas/lcom2016/at/13vbe.pdf · Computer Labs: Lab5 Video Card in Graphics Mode 2o MIEIC Pedro F. Souto (pfs@fe.up.pt)

Memory ModelsI The memory model determines the way the value of each

pixel is stored in VRAMI Different graphics modes use different memory models

I The simplest mode and the one that will be used in thelab is the linear mode

HRES pixels

V

R

E

S

p

i

x

e

l

scolor (00)

color (10)

color (Hres0)

color (01)

All we need to know isI The base address of the frame bufferI The coordinates of the pixelI The number of bytes used to encode the color

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Lab5 Video Card in Graphics Mode

I Write a set of functionsvoid test_init(unsigned short mode unsigned short delay)int test_square(unsigned short x unsigned short y )int test_line(unsigned short xi unsigned short yi )int test_xpm(unsigned short xi unsigned short yi )int test_move(unsigned short xi unsigned short yi )int test_controller()

to set the screen to graphics mode and to change the display inthat mode

I The goal for the first class is to implemente the first 3 functionsI Essentially you have to

1 Configure the video card for the desired graphics modeI Minix 3 boots in text mode not in graphics mode

2 Write to VRAM to display on the screen what is requestedI Map VRAM to the processrsquo address space

3 Reset the video card to the text mode used by MinixI You need only to call a function that we provide you

Video Card Configuration (test_init())

Problem How do you configure the desired graphics modeNO Solution Readwrite directly the GPU registers

I GPU manufacturers usually do not provide the detailsnecessary for that level of programming

Solution Use the VESA Video Bios Extension (VBE)

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

PC BIOS

I Basic Input-Output System isI A firmware interface for accessing PC HW resourcesI The implementation of this interfaceI The non-volatile memory (ROM more recently flash-RAM)

containing that implementationI It is used mostly when a PC starts up

I It is 16-bits even IA-32 processors start in real-modeI It is used essentially to load the OS (or part of it)I Once the OS is loaded it usually uses its own code to

access the HW not the BIOS

BIOS Calls

I Access to BIOS services is via the SW interrupt instructionINT xx

I The xx is 8 bit and specifies the serviceI Any arguments required are passed via the processor

registersI Standard BIOS services

Interrupt vector (xx) Service10h video card11h PC configuration12h memory configuration16h keyboard

BIOS Call Example

I Set Video Mode INT 10h function 00h set video mode

MOV AH 0 functionMOV AL 3 text 25 lines X 80 columns 16 colorsINT 10h

How to make a BIOS Call in Minix 31x

ProblemI The previous example is in real address modeI Minix 3 uses protected mode with 32-bit

SolutionI Use Minix 3 kernel call SYS_INT86

ldquoMake a real-mode BIOS on behalf of a user-space devicedriver This temporarily switches from 32-bit protectedmode to 16-bit real-mode to access the BIOS callsrdquo

BIOS Call in Minix 3 Exampleinclude ltmachineint86hgt usrsrcincludearchi386int vg_exit() struct reg86u reg86

reg86ubintno = 0x10reg86ubah = 0x00reg86ubal = 0x03

if( sys_int86(ampreg86) = OK ) printf(vg_exit() sys_int86() failed n)return 1

return 0

I struct reg86u is a struct with a union of structsb is the member to access 8-bit registersw is the member to access 16-bit registersl is the member to access 32-bit registers

I The names of the members of the structs are the standardnames of IA-32 registers

Video BIOS Extension (VBE)

I The BIOS specification supports only VGA graphics modes

I VGA stands for Video Graphics AdapterI Specifies very low resolution 640x480 16 colors and

320x240 256 colorsI The Video Electronics Standards Association (VESA)

developed the Video BIOS Extension (VBE) standards inorder to make programming with higher resolutionsportable

I Early VBE versions specify only a real-mode interfaceI Later versions added a protected-mode interface but

I In version 2 only for some time-critical functionsI In version 3 supports more functions but they are optional

VBE INT 0x10 Interface

I VBE still uses INT 0x10 but to distinguish it from basicvideo BIOS services

I AH = 4Fh - BIOS uses AH for the functionI AL = function

I VBE graphics mode 105h 1024x768256 linear modestruct reg86u rruwax = 0x4F02 VBE call function 02 -- set VBE moderuwbx = 1ltlt14|0x105 set bit 14 linear framebufferrubintno = 0x10if( sys_int86(ampr) = OK )

printf(set_vbe_mode sys_int86() failed n)return 1

You should use symbolic constants

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Mapping the Linear Frame BufferI Before you can write to the frame buffer

HRES pixels

V

R

E

S

p

i

x

e

l

scolor (00)

color (10)

color (Hres0)

color (01)

1 Obtain the physical memory address11 Using a hard-coded address (0xE0000000) first

I This address may depend on the VM used So I provide aprogram that allows you to find out this address

12 Using Function 0x01 Return VBE Mode Information onceeverything else has been completed

2 Map the physical memory region into the processrsquo addressspace

Virtual and Physical Address Spaces

Issue Most computer architectures support a virtual addressspace that is decoupled from the physical address space

I Processes can access (physical) memory using alogical address that is independent of the physicaladdress (determined by the address bus decodingcircuitry)

I Most modern operating systems including Minix takeadvantage of this feature to simplify memorymanagement

Mapping Physical Memory to Virtual Address Space

I Each process has its own virtual address space whosesize is usually determined by the processor architecture(32-bit for IA-32)

I The operating system maps regions of the physicalmemory in the computer to the virtual address spaces ofthe different processes

I The details of how this is done are studied in the OperatingSystems course

Mapping VRAM in Minix (12)int rstruct mem_range mrunsigned int vram_base VRAMrsquos physical addresss unsigned int vram_size VRAMrsquos size but you can use

the frame-buffer size instead void video_mem frame-buffer VM address

Allow memory mapping

mrmr_base = (phys_bytes) vram_basemrmr_limit = mrmr_base + vram_size

if( OK = (r = sys_privctl(SELF SYS_PRIV_ADD_MEM ampmr)))panic(sys_privctl (ADD_MEM) failed dn r)

Map memory

video_mem = vm_map_phys(SELF (void )mrmr_base vram_size)

if(video_mem == MAP_FAILED)panic(couldnrsquot map video memory)

Mapping VRAM in Minix (22)

Question What is the following code about Allow memory mapping

mrmr_base = (phys_bytes) vram_basemrmr_limit = mrmr_base + vram_size

if( OK = (r = sys_privctl(SELF SYS_PRIV_ADD_MEM ampmr)))panic(sys_privctl (ADD_MEM) failed dn r)

Answer In modern operating systems user-level processescannot access directly HW resources including physicalmemory and VRAM

I Minix 3 handles this by allowing to grant privilegeduser-level processes the permissions they require toperform their tasks

Lab 5 - Part 1 Key Programming Issue

Issue Given a virtual address how can a program accessthe physical memory mapped to that virtual address

Solution Use C pointers

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Finding the Physical Memory Address with VBE (15)

I VBE Function 01h - Return VBE Mode InformationInput

AX = 4F01h Return VBE Mode InformationCX = Mode numberESDI = Pointer to ModeInfoBlock structure

OuputAX = VBE return status

I The ModeInfoBlock includes among other information1 The mode attributes which comprise a set of bits that

describe some general characteristics of the modeincluding whether

I it is supported by the adapterI the linear frame buffer is available

2 The screen resolution of the mode3 The physical address of the linear frame buffer

Finding the Physical Memory Address with VBE (25)

ProblemI The ModeInfoBlock structure must be accessible both in

protected mode and in real modeI VBE Function 01h is a real mode functionI Real mode addresses are only 20-bit long (must be in the

lower 1MiB)

SolutionI Use liblma library

I Provides a simple interface for applicationslm_init()lm_alloc()lm_free()

I Hides some non-documented functions provided by Minix 3I The mmap_t (already used in Lab 1) includes both

I The physical address for use by VBEI The virtual address for use in Minix 3

Finding the Physical Memory Address with VBE (35)

phys_bytes bufstruct reg86u r

[]

ruwax = 0x4F01 VBE get mode info translate the buffer linear address to a far pointer ruwes = PB2BASE(buf) set a segment base ruwdi = PB2OFF(buf) set the offset accordingly ruwcx = moderubintno = 0x10if( sys_int86(ampr) = OK ) call BIOS

PB2BASE Is a macro for computing the base of a segment a16-bit value given a 32-bit linear address

PB2OFF Is a macro for computing the offset with respect to thebase of a segment a 16-bit value given a 32-bit linearaddress

Finding the Physical Memory Address with VBE (45)

Problem The parameters contained in the buffer returned byVBE function 0x01 are layed out sequentially with no holesbetween them

I Simply defining a C struct with one member perparameter with an appropriate type is not enough

I C compilers layout the members of a struct in order andplace them in memory positions whose address isaligned according to their type

Solution Use GCCrsquos __attribute__((packed))I In principle this should be handled by thepragma pack directives but it is not supported by thisversion of GCC

Note that this attribute must appear immediately after the otherwise it has no effect

I You need not do anything as Irsquove already defined thestruct in vbeh

Finding the Physical Memory Address with VBE (55)

include ltstdinthgt

typedef struct

uint16_t ModeAttributes[]uint16_t XResolutionuint16_t YResolution[]uint8_t BitsPerPixel[]uint32_t PhysBasePtr[]

__attribute__((packed)) vbe_mode_info_t

  • Graphics AdapterVideo Card
  • Video Card in Graphics Mode
  • Lab 5
  • BIOS and VBE
  • Accessing VRAM
  • VBE Function 0x01
Page 11: Computer Labs: Lab5 Video Card in Graphics Mode - 2º MIEICpfs/aulas/lcom2016/at/13vbe.pdf · Computer Labs: Lab5 Video Card in Graphics Mode 2o MIEIC Pedro F. Souto (pfs@fe.up.pt)

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Lab5 Video Card in Graphics Mode

I Write a set of functionsvoid test_init(unsigned short mode unsigned short delay)int test_square(unsigned short x unsigned short y )int test_line(unsigned short xi unsigned short yi )int test_xpm(unsigned short xi unsigned short yi )int test_move(unsigned short xi unsigned short yi )int test_controller()

to set the screen to graphics mode and to change the display inthat mode

I The goal for the first class is to implemente the first 3 functionsI Essentially you have to

1 Configure the video card for the desired graphics modeI Minix 3 boots in text mode not in graphics mode

2 Write to VRAM to display on the screen what is requestedI Map VRAM to the processrsquo address space

3 Reset the video card to the text mode used by MinixI You need only to call a function that we provide you

Video Card Configuration (test_init())

Problem How do you configure the desired graphics modeNO Solution Readwrite directly the GPU registers

I GPU manufacturers usually do not provide the detailsnecessary for that level of programming

Solution Use the VESA Video Bios Extension (VBE)

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

PC BIOS

I Basic Input-Output System isI A firmware interface for accessing PC HW resourcesI The implementation of this interfaceI The non-volatile memory (ROM more recently flash-RAM)

containing that implementationI It is used mostly when a PC starts up

I It is 16-bits even IA-32 processors start in real-modeI It is used essentially to load the OS (or part of it)I Once the OS is loaded it usually uses its own code to

access the HW not the BIOS

BIOS Calls

I Access to BIOS services is via the SW interrupt instructionINT xx

I The xx is 8 bit and specifies the serviceI Any arguments required are passed via the processor

registersI Standard BIOS services

Interrupt vector (xx) Service10h video card11h PC configuration12h memory configuration16h keyboard

BIOS Call Example

I Set Video Mode INT 10h function 00h set video mode

MOV AH 0 functionMOV AL 3 text 25 lines X 80 columns 16 colorsINT 10h

How to make a BIOS Call in Minix 31x

ProblemI The previous example is in real address modeI Minix 3 uses protected mode with 32-bit

SolutionI Use Minix 3 kernel call SYS_INT86

ldquoMake a real-mode BIOS on behalf of a user-space devicedriver This temporarily switches from 32-bit protectedmode to 16-bit real-mode to access the BIOS callsrdquo

BIOS Call in Minix 3 Exampleinclude ltmachineint86hgt usrsrcincludearchi386int vg_exit() struct reg86u reg86

reg86ubintno = 0x10reg86ubah = 0x00reg86ubal = 0x03

if( sys_int86(ampreg86) = OK ) printf(vg_exit() sys_int86() failed n)return 1

return 0

I struct reg86u is a struct with a union of structsb is the member to access 8-bit registersw is the member to access 16-bit registersl is the member to access 32-bit registers

I The names of the members of the structs are the standardnames of IA-32 registers

Video BIOS Extension (VBE)

I The BIOS specification supports only VGA graphics modes

I VGA stands for Video Graphics AdapterI Specifies very low resolution 640x480 16 colors and

320x240 256 colorsI The Video Electronics Standards Association (VESA)

developed the Video BIOS Extension (VBE) standards inorder to make programming with higher resolutionsportable

I Early VBE versions specify only a real-mode interfaceI Later versions added a protected-mode interface but

I In version 2 only for some time-critical functionsI In version 3 supports more functions but they are optional

VBE INT 0x10 Interface

I VBE still uses INT 0x10 but to distinguish it from basicvideo BIOS services

I AH = 4Fh - BIOS uses AH for the functionI AL = function

I VBE graphics mode 105h 1024x768256 linear modestruct reg86u rruwax = 0x4F02 VBE call function 02 -- set VBE moderuwbx = 1ltlt14|0x105 set bit 14 linear framebufferrubintno = 0x10if( sys_int86(ampr) = OK )

printf(set_vbe_mode sys_int86() failed n)return 1

You should use symbolic constants

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Mapping the Linear Frame BufferI Before you can write to the frame buffer

HRES pixels

V

R

E

S

p

i

x

e

l

scolor (00)

color (10)

color (Hres0)

color (01)

1 Obtain the physical memory address11 Using a hard-coded address (0xE0000000) first

I This address may depend on the VM used So I provide aprogram that allows you to find out this address

12 Using Function 0x01 Return VBE Mode Information onceeverything else has been completed

2 Map the physical memory region into the processrsquo addressspace

Virtual and Physical Address Spaces

Issue Most computer architectures support a virtual addressspace that is decoupled from the physical address space

I Processes can access (physical) memory using alogical address that is independent of the physicaladdress (determined by the address bus decodingcircuitry)

I Most modern operating systems including Minix takeadvantage of this feature to simplify memorymanagement

Mapping Physical Memory to Virtual Address Space

I Each process has its own virtual address space whosesize is usually determined by the processor architecture(32-bit for IA-32)

I The operating system maps regions of the physicalmemory in the computer to the virtual address spaces ofthe different processes

I The details of how this is done are studied in the OperatingSystems course

Mapping VRAM in Minix (12)int rstruct mem_range mrunsigned int vram_base VRAMrsquos physical addresss unsigned int vram_size VRAMrsquos size but you can use

the frame-buffer size instead void video_mem frame-buffer VM address

Allow memory mapping

mrmr_base = (phys_bytes) vram_basemrmr_limit = mrmr_base + vram_size

if( OK = (r = sys_privctl(SELF SYS_PRIV_ADD_MEM ampmr)))panic(sys_privctl (ADD_MEM) failed dn r)

Map memory

video_mem = vm_map_phys(SELF (void )mrmr_base vram_size)

if(video_mem == MAP_FAILED)panic(couldnrsquot map video memory)

Mapping VRAM in Minix (22)

Question What is the following code about Allow memory mapping

mrmr_base = (phys_bytes) vram_basemrmr_limit = mrmr_base + vram_size

if( OK = (r = sys_privctl(SELF SYS_PRIV_ADD_MEM ampmr)))panic(sys_privctl (ADD_MEM) failed dn r)

Answer In modern operating systems user-level processescannot access directly HW resources including physicalmemory and VRAM

I Minix 3 handles this by allowing to grant privilegeduser-level processes the permissions they require toperform their tasks

Lab 5 - Part 1 Key Programming Issue

Issue Given a virtual address how can a program accessthe physical memory mapped to that virtual address

Solution Use C pointers

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Finding the Physical Memory Address with VBE (15)

I VBE Function 01h - Return VBE Mode InformationInput

AX = 4F01h Return VBE Mode InformationCX = Mode numberESDI = Pointer to ModeInfoBlock structure

OuputAX = VBE return status

I The ModeInfoBlock includes among other information1 The mode attributes which comprise a set of bits that

describe some general characteristics of the modeincluding whether

I it is supported by the adapterI the linear frame buffer is available

2 The screen resolution of the mode3 The physical address of the linear frame buffer

Finding the Physical Memory Address with VBE (25)

ProblemI The ModeInfoBlock structure must be accessible both in

protected mode and in real modeI VBE Function 01h is a real mode functionI Real mode addresses are only 20-bit long (must be in the

lower 1MiB)

SolutionI Use liblma library

I Provides a simple interface for applicationslm_init()lm_alloc()lm_free()

I Hides some non-documented functions provided by Minix 3I The mmap_t (already used in Lab 1) includes both

I The physical address for use by VBEI The virtual address for use in Minix 3

Finding the Physical Memory Address with VBE (35)

phys_bytes bufstruct reg86u r

[]

ruwax = 0x4F01 VBE get mode info translate the buffer linear address to a far pointer ruwes = PB2BASE(buf) set a segment base ruwdi = PB2OFF(buf) set the offset accordingly ruwcx = moderubintno = 0x10if( sys_int86(ampr) = OK ) call BIOS

PB2BASE Is a macro for computing the base of a segment a16-bit value given a 32-bit linear address

PB2OFF Is a macro for computing the offset with respect to thebase of a segment a 16-bit value given a 32-bit linearaddress

Finding the Physical Memory Address with VBE (45)

Problem The parameters contained in the buffer returned byVBE function 0x01 are layed out sequentially with no holesbetween them

I Simply defining a C struct with one member perparameter with an appropriate type is not enough

I C compilers layout the members of a struct in order andplace them in memory positions whose address isaligned according to their type

Solution Use GCCrsquos __attribute__((packed))I In principle this should be handled by thepragma pack directives but it is not supported by thisversion of GCC

Note that this attribute must appear immediately after the otherwise it has no effect

I You need not do anything as Irsquove already defined thestruct in vbeh

Finding the Physical Memory Address with VBE (55)

include ltstdinthgt

typedef struct

uint16_t ModeAttributes[]uint16_t XResolutionuint16_t YResolution[]uint8_t BitsPerPixel[]uint32_t PhysBasePtr[]

__attribute__((packed)) vbe_mode_info_t

  • Graphics AdapterVideo Card
  • Video Card in Graphics Mode
  • Lab 5
  • BIOS and VBE
  • Accessing VRAM
  • VBE Function 0x01
Page 12: Computer Labs: Lab5 Video Card in Graphics Mode - 2º MIEICpfs/aulas/lcom2016/at/13vbe.pdf · Computer Labs: Lab5 Video Card in Graphics Mode 2o MIEIC Pedro F. Souto (pfs@fe.up.pt)

Lab5 Video Card in Graphics Mode

I Write a set of functionsvoid test_init(unsigned short mode unsigned short delay)int test_square(unsigned short x unsigned short y )int test_line(unsigned short xi unsigned short yi )int test_xpm(unsigned short xi unsigned short yi )int test_move(unsigned short xi unsigned short yi )int test_controller()

to set the screen to graphics mode and to change the display inthat mode

I The goal for the first class is to implemente the first 3 functionsI Essentially you have to

1 Configure the video card for the desired graphics modeI Minix 3 boots in text mode not in graphics mode

2 Write to VRAM to display on the screen what is requestedI Map VRAM to the processrsquo address space

3 Reset the video card to the text mode used by MinixI You need only to call a function that we provide you

Video Card Configuration (test_init())

Problem How do you configure the desired graphics modeNO Solution Readwrite directly the GPU registers

I GPU manufacturers usually do not provide the detailsnecessary for that level of programming

Solution Use the VESA Video Bios Extension (VBE)

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

PC BIOS

I Basic Input-Output System isI A firmware interface for accessing PC HW resourcesI The implementation of this interfaceI The non-volatile memory (ROM more recently flash-RAM)

containing that implementationI It is used mostly when a PC starts up

I It is 16-bits even IA-32 processors start in real-modeI It is used essentially to load the OS (or part of it)I Once the OS is loaded it usually uses its own code to

access the HW not the BIOS

BIOS Calls

I Access to BIOS services is via the SW interrupt instructionINT xx

I The xx is 8 bit and specifies the serviceI Any arguments required are passed via the processor

registersI Standard BIOS services

Interrupt vector (xx) Service10h video card11h PC configuration12h memory configuration16h keyboard

BIOS Call Example

I Set Video Mode INT 10h function 00h set video mode

MOV AH 0 functionMOV AL 3 text 25 lines X 80 columns 16 colorsINT 10h

How to make a BIOS Call in Minix 31x

ProblemI The previous example is in real address modeI Minix 3 uses protected mode with 32-bit

SolutionI Use Minix 3 kernel call SYS_INT86

ldquoMake a real-mode BIOS on behalf of a user-space devicedriver This temporarily switches from 32-bit protectedmode to 16-bit real-mode to access the BIOS callsrdquo

BIOS Call in Minix 3 Exampleinclude ltmachineint86hgt usrsrcincludearchi386int vg_exit() struct reg86u reg86

reg86ubintno = 0x10reg86ubah = 0x00reg86ubal = 0x03

if( sys_int86(ampreg86) = OK ) printf(vg_exit() sys_int86() failed n)return 1

return 0

I struct reg86u is a struct with a union of structsb is the member to access 8-bit registersw is the member to access 16-bit registersl is the member to access 32-bit registers

I The names of the members of the structs are the standardnames of IA-32 registers

Video BIOS Extension (VBE)

I The BIOS specification supports only VGA graphics modes

I VGA stands for Video Graphics AdapterI Specifies very low resolution 640x480 16 colors and

320x240 256 colorsI The Video Electronics Standards Association (VESA)

developed the Video BIOS Extension (VBE) standards inorder to make programming with higher resolutionsportable

I Early VBE versions specify only a real-mode interfaceI Later versions added a protected-mode interface but

I In version 2 only for some time-critical functionsI In version 3 supports more functions but they are optional

VBE INT 0x10 Interface

I VBE still uses INT 0x10 but to distinguish it from basicvideo BIOS services

I AH = 4Fh - BIOS uses AH for the functionI AL = function

I VBE graphics mode 105h 1024x768256 linear modestruct reg86u rruwax = 0x4F02 VBE call function 02 -- set VBE moderuwbx = 1ltlt14|0x105 set bit 14 linear framebufferrubintno = 0x10if( sys_int86(ampr) = OK )

printf(set_vbe_mode sys_int86() failed n)return 1

You should use symbolic constants

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Mapping the Linear Frame BufferI Before you can write to the frame buffer

HRES pixels

V

R

E

S

p

i

x

e

l

scolor (00)

color (10)

color (Hres0)

color (01)

1 Obtain the physical memory address11 Using a hard-coded address (0xE0000000) first

I This address may depend on the VM used So I provide aprogram that allows you to find out this address

12 Using Function 0x01 Return VBE Mode Information onceeverything else has been completed

2 Map the physical memory region into the processrsquo addressspace

Virtual and Physical Address Spaces

Issue Most computer architectures support a virtual addressspace that is decoupled from the physical address space

I Processes can access (physical) memory using alogical address that is independent of the physicaladdress (determined by the address bus decodingcircuitry)

I Most modern operating systems including Minix takeadvantage of this feature to simplify memorymanagement

Mapping Physical Memory to Virtual Address Space

I Each process has its own virtual address space whosesize is usually determined by the processor architecture(32-bit for IA-32)

I The operating system maps regions of the physicalmemory in the computer to the virtual address spaces ofthe different processes

I The details of how this is done are studied in the OperatingSystems course

Mapping VRAM in Minix (12)int rstruct mem_range mrunsigned int vram_base VRAMrsquos physical addresss unsigned int vram_size VRAMrsquos size but you can use

the frame-buffer size instead void video_mem frame-buffer VM address

Allow memory mapping

mrmr_base = (phys_bytes) vram_basemrmr_limit = mrmr_base + vram_size

if( OK = (r = sys_privctl(SELF SYS_PRIV_ADD_MEM ampmr)))panic(sys_privctl (ADD_MEM) failed dn r)

Map memory

video_mem = vm_map_phys(SELF (void )mrmr_base vram_size)

if(video_mem == MAP_FAILED)panic(couldnrsquot map video memory)

Mapping VRAM in Minix (22)

Question What is the following code about Allow memory mapping

mrmr_base = (phys_bytes) vram_basemrmr_limit = mrmr_base + vram_size

if( OK = (r = sys_privctl(SELF SYS_PRIV_ADD_MEM ampmr)))panic(sys_privctl (ADD_MEM) failed dn r)

Answer In modern operating systems user-level processescannot access directly HW resources including physicalmemory and VRAM

I Minix 3 handles this by allowing to grant privilegeduser-level processes the permissions they require toperform their tasks

Lab 5 - Part 1 Key Programming Issue

Issue Given a virtual address how can a program accessthe physical memory mapped to that virtual address

Solution Use C pointers

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Finding the Physical Memory Address with VBE (15)

I VBE Function 01h - Return VBE Mode InformationInput

AX = 4F01h Return VBE Mode InformationCX = Mode numberESDI = Pointer to ModeInfoBlock structure

OuputAX = VBE return status

I The ModeInfoBlock includes among other information1 The mode attributes which comprise a set of bits that

describe some general characteristics of the modeincluding whether

I it is supported by the adapterI the linear frame buffer is available

2 The screen resolution of the mode3 The physical address of the linear frame buffer

Finding the Physical Memory Address with VBE (25)

ProblemI The ModeInfoBlock structure must be accessible both in

protected mode and in real modeI VBE Function 01h is a real mode functionI Real mode addresses are only 20-bit long (must be in the

lower 1MiB)

SolutionI Use liblma library

I Provides a simple interface for applicationslm_init()lm_alloc()lm_free()

I Hides some non-documented functions provided by Minix 3I The mmap_t (already used in Lab 1) includes both

I The physical address for use by VBEI The virtual address for use in Minix 3

Finding the Physical Memory Address with VBE (35)

phys_bytes bufstruct reg86u r

[]

ruwax = 0x4F01 VBE get mode info translate the buffer linear address to a far pointer ruwes = PB2BASE(buf) set a segment base ruwdi = PB2OFF(buf) set the offset accordingly ruwcx = moderubintno = 0x10if( sys_int86(ampr) = OK ) call BIOS

PB2BASE Is a macro for computing the base of a segment a16-bit value given a 32-bit linear address

PB2OFF Is a macro for computing the offset with respect to thebase of a segment a 16-bit value given a 32-bit linearaddress

Finding the Physical Memory Address with VBE (45)

Problem The parameters contained in the buffer returned byVBE function 0x01 are layed out sequentially with no holesbetween them

I Simply defining a C struct with one member perparameter with an appropriate type is not enough

I C compilers layout the members of a struct in order andplace them in memory positions whose address isaligned according to their type

Solution Use GCCrsquos __attribute__((packed))I In principle this should be handled by thepragma pack directives but it is not supported by thisversion of GCC

Note that this attribute must appear immediately after the otherwise it has no effect

I You need not do anything as Irsquove already defined thestruct in vbeh

Finding the Physical Memory Address with VBE (55)

include ltstdinthgt

typedef struct

uint16_t ModeAttributes[]uint16_t XResolutionuint16_t YResolution[]uint8_t BitsPerPixel[]uint32_t PhysBasePtr[]

__attribute__((packed)) vbe_mode_info_t

  • Graphics AdapterVideo Card
  • Video Card in Graphics Mode
  • Lab 5
  • BIOS and VBE
  • Accessing VRAM
  • VBE Function 0x01
Page 13: Computer Labs: Lab5 Video Card in Graphics Mode - 2º MIEICpfs/aulas/lcom2016/at/13vbe.pdf · Computer Labs: Lab5 Video Card in Graphics Mode 2o MIEIC Pedro F. Souto (pfs@fe.up.pt)

Video Card Configuration (test_init())

Problem How do you configure the desired graphics modeNO Solution Readwrite directly the GPU registers

I GPU manufacturers usually do not provide the detailsnecessary for that level of programming

Solution Use the VESA Video Bios Extension (VBE)

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

PC BIOS

I Basic Input-Output System isI A firmware interface for accessing PC HW resourcesI The implementation of this interfaceI The non-volatile memory (ROM more recently flash-RAM)

containing that implementationI It is used mostly when a PC starts up

I It is 16-bits even IA-32 processors start in real-modeI It is used essentially to load the OS (or part of it)I Once the OS is loaded it usually uses its own code to

access the HW not the BIOS

BIOS Calls

I Access to BIOS services is via the SW interrupt instructionINT xx

I The xx is 8 bit and specifies the serviceI Any arguments required are passed via the processor

registersI Standard BIOS services

Interrupt vector (xx) Service10h video card11h PC configuration12h memory configuration16h keyboard

BIOS Call Example

I Set Video Mode INT 10h function 00h set video mode

MOV AH 0 functionMOV AL 3 text 25 lines X 80 columns 16 colorsINT 10h

How to make a BIOS Call in Minix 31x

ProblemI The previous example is in real address modeI Minix 3 uses protected mode with 32-bit

SolutionI Use Minix 3 kernel call SYS_INT86

ldquoMake a real-mode BIOS on behalf of a user-space devicedriver This temporarily switches from 32-bit protectedmode to 16-bit real-mode to access the BIOS callsrdquo

BIOS Call in Minix 3 Exampleinclude ltmachineint86hgt usrsrcincludearchi386int vg_exit() struct reg86u reg86

reg86ubintno = 0x10reg86ubah = 0x00reg86ubal = 0x03

if( sys_int86(ampreg86) = OK ) printf(vg_exit() sys_int86() failed n)return 1

return 0

I struct reg86u is a struct with a union of structsb is the member to access 8-bit registersw is the member to access 16-bit registersl is the member to access 32-bit registers

I The names of the members of the structs are the standardnames of IA-32 registers

Video BIOS Extension (VBE)

I The BIOS specification supports only VGA graphics modes

I VGA stands for Video Graphics AdapterI Specifies very low resolution 640x480 16 colors and

320x240 256 colorsI The Video Electronics Standards Association (VESA)

developed the Video BIOS Extension (VBE) standards inorder to make programming with higher resolutionsportable

I Early VBE versions specify only a real-mode interfaceI Later versions added a protected-mode interface but

I In version 2 only for some time-critical functionsI In version 3 supports more functions but they are optional

VBE INT 0x10 Interface

I VBE still uses INT 0x10 but to distinguish it from basicvideo BIOS services

I AH = 4Fh - BIOS uses AH for the functionI AL = function

I VBE graphics mode 105h 1024x768256 linear modestruct reg86u rruwax = 0x4F02 VBE call function 02 -- set VBE moderuwbx = 1ltlt14|0x105 set bit 14 linear framebufferrubintno = 0x10if( sys_int86(ampr) = OK )

printf(set_vbe_mode sys_int86() failed n)return 1

You should use symbolic constants

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Mapping the Linear Frame BufferI Before you can write to the frame buffer

HRES pixels

V

R

E

S

p

i

x

e

l

scolor (00)

color (10)

color (Hres0)

color (01)

1 Obtain the physical memory address11 Using a hard-coded address (0xE0000000) first

I This address may depend on the VM used So I provide aprogram that allows you to find out this address

12 Using Function 0x01 Return VBE Mode Information onceeverything else has been completed

2 Map the physical memory region into the processrsquo addressspace

Virtual and Physical Address Spaces

Issue Most computer architectures support a virtual addressspace that is decoupled from the physical address space

I Processes can access (physical) memory using alogical address that is independent of the physicaladdress (determined by the address bus decodingcircuitry)

I Most modern operating systems including Minix takeadvantage of this feature to simplify memorymanagement

Mapping Physical Memory to Virtual Address Space

I Each process has its own virtual address space whosesize is usually determined by the processor architecture(32-bit for IA-32)

I The operating system maps regions of the physicalmemory in the computer to the virtual address spaces ofthe different processes

I The details of how this is done are studied in the OperatingSystems course

Mapping VRAM in Minix (12)int rstruct mem_range mrunsigned int vram_base VRAMrsquos physical addresss unsigned int vram_size VRAMrsquos size but you can use

the frame-buffer size instead void video_mem frame-buffer VM address

Allow memory mapping

mrmr_base = (phys_bytes) vram_basemrmr_limit = mrmr_base + vram_size

if( OK = (r = sys_privctl(SELF SYS_PRIV_ADD_MEM ampmr)))panic(sys_privctl (ADD_MEM) failed dn r)

Map memory

video_mem = vm_map_phys(SELF (void )mrmr_base vram_size)

if(video_mem == MAP_FAILED)panic(couldnrsquot map video memory)

Mapping VRAM in Minix (22)

Question What is the following code about Allow memory mapping

mrmr_base = (phys_bytes) vram_basemrmr_limit = mrmr_base + vram_size

if( OK = (r = sys_privctl(SELF SYS_PRIV_ADD_MEM ampmr)))panic(sys_privctl (ADD_MEM) failed dn r)

Answer In modern operating systems user-level processescannot access directly HW resources including physicalmemory and VRAM

I Minix 3 handles this by allowing to grant privilegeduser-level processes the permissions they require toperform their tasks

Lab 5 - Part 1 Key Programming Issue

Issue Given a virtual address how can a program accessthe physical memory mapped to that virtual address

Solution Use C pointers

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Finding the Physical Memory Address with VBE (15)

I VBE Function 01h - Return VBE Mode InformationInput

AX = 4F01h Return VBE Mode InformationCX = Mode numberESDI = Pointer to ModeInfoBlock structure

OuputAX = VBE return status

I The ModeInfoBlock includes among other information1 The mode attributes which comprise a set of bits that

describe some general characteristics of the modeincluding whether

I it is supported by the adapterI the linear frame buffer is available

2 The screen resolution of the mode3 The physical address of the linear frame buffer

Finding the Physical Memory Address with VBE (25)

ProblemI The ModeInfoBlock structure must be accessible both in

protected mode and in real modeI VBE Function 01h is a real mode functionI Real mode addresses are only 20-bit long (must be in the

lower 1MiB)

SolutionI Use liblma library

I Provides a simple interface for applicationslm_init()lm_alloc()lm_free()

I Hides some non-documented functions provided by Minix 3I The mmap_t (already used in Lab 1) includes both

I The physical address for use by VBEI The virtual address for use in Minix 3

Finding the Physical Memory Address with VBE (35)

phys_bytes bufstruct reg86u r

[]

ruwax = 0x4F01 VBE get mode info translate the buffer linear address to a far pointer ruwes = PB2BASE(buf) set a segment base ruwdi = PB2OFF(buf) set the offset accordingly ruwcx = moderubintno = 0x10if( sys_int86(ampr) = OK ) call BIOS

PB2BASE Is a macro for computing the base of a segment a16-bit value given a 32-bit linear address

PB2OFF Is a macro for computing the offset with respect to thebase of a segment a 16-bit value given a 32-bit linearaddress

Finding the Physical Memory Address with VBE (45)

Problem The parameters contained in the buffer returned byVBE function 0x01 are layed out sequentially with no holesbetween them

I Simply defining a C struct with one member perparameter with an appropriate type is not enough

I C compilers layout the members of a struct in order andplace them in memory positions whose address isaligned according to their type

Solution Use GCCrsquos __attribute__((packed))I In principle this should be handled by thepragma pack directives but it is not supported by thisversion of GCC

Note that this attribute must appear immediately after the otherwise it has no effect

I You need not do anything as Irsquove already defined thestruct in vbeh

Finding the Physical Memory Address with VBE (55)

include ltstdinthgt

typedef struct

uint16_t ModeAttributes[]uint16_t XResolutionuint16_t YResolution[]uint8_t BitsPerPixel[]uint32_t PhysBasePtr[]

__attribute__((packed)) vbe_mode_info_t

  • Graphics AdapterVideo Card
  • Video Card in Graphics Mode
  • Lab 5
  • BIOS and VBE
  • Accessing VRAM
  • VBE Function 0x01
Page 14: Computer Labs: Lab5 Video Card in Graphics Mode - 2º MIEICpfs/aulas/lcom2016/at/13vbe.pdf · Computer Labs: Lab5 Video Card in Graphics Mode 2o MIEIC Pedro F. Souto (pfs@fe.up.pt)

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

PC BIOS

I Basic Input-Output System isI A firmware interface for accessing PC HW resourcesI The implementation of this interfaceI The non-volatile memory (ROM more recently flash-RAM)

containing that implementationI It is used mostly when a PC starts up

I It is 16-bits even IA-32 processors start in real-modeI It is used essentially to load the OS (or part of it)I Once the OS is loaded it usually uses its own code to

access the HW not the BIOS

BIOS Calls

I Access to BIOS services is via the SW interrupt instructionINT xx

I The xx is 8 bit and specifies the serviceI Any arguments required are passed via the processor

registersI Standard BIOS services

Interrupt vector (xx) Service10h video card11h PC configuration12h memory configuration16h keyboard

BIOS Call Example

I Set Video Mode INT 10h function 00h set video mode

MOV AH 0 functionMOV AL 3 text 25 lines X 80 columns 16 colorsINT 10h

How to make a BIOS Call in Minix 31x

ProblemI The previous example is in real address modeI Minix 3 uses protected mode with 32-bit

SolutionI Use Minix 3 kernel call SYS_INT86

ldquoMake a real-mode BIOS on behalf of a user-space devicedriver This temporarily switches from 32-bit protectedmode to 16-bit real-mode to access the BIOS callsrdquo

BIOS Call in Minix 3 Exampleinclude ltmachineint86hgt usrsrcincludearchi386int vg_exit() struct reg86u reg86

reg86ubintno = 0x10reg86ubah = 0x00reg86ubal = 0x03

if( sys_int86(ampreg86) = OK ) printf(vg_exit() sys_int86() failed n)return 1

return 0

I struct reg86u is a struct with a union of structsb is the member to access 8-bit registersw is the member to access 16-bit registersl is the member to access 32-bit registers

I The names of the members of the structs are the standardnames of IA-32 registers

Video BIOS Extension (VBE)

I The BIOS specification supports only VGA graphics modes

I VGA stands for Video Graphics AdapterI Specifies very low resolution 640x480 16 colors and

320x240 256 colorsI The Video Electronics Standards Association (VESA)

developed the Video BIOS Extension (VBE) standards inorder to make programming with higher resolutionsportable

I Early VBE versions specify only a real-mode interfaceI Later versions added a protected-mode interface but

I In version 2 only for some time-critical functionsI In version 3 supports more functions but they are optional

VBE INT 0x10 Interface

I VBE still uses INT 0x10 but to distinguish it from basicvideo BIOS services

I AH = 4Fh - BIOS uses AH for the functionI AL = function

I VBE graphics mode 105h 1024x768256 linear modestruct reg86u rruwax = 0x4F02 VBE call function 02 -- set VBE moderuwbx = 1ltlt14|0x105 set bit 14 linear framebufferrubintno = 0x10if( sys_int86(ampr) = OK )

printf(set_vbe_mode sys_int86() failed n)return 1

You should use symbolic constants

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Mapping the Linear Frame BufferI Before you can write to the frame buffer

HRES pixels

V

R

E

S

p

i

x

e

l

scolor (00)

color (10)

color (Hres0)

color (01)

1 Obtain the physical memory address11 Using a hard-coded address (0xE0000000) first

I This address may depend on the VM used So I provide aprogram that allows you to find out this address

12 Using Function 0x01 Return VBE Mode Information onceeverything else has been completed

2 Map the physical memory region into the processrsquo addressspace

Virtual and Physical Address Spaces

Issue Most computer architectures support a virtual addressspace that is decoupled from the physical address space

I Processes can access (physical) memory using alogical address that is independent of the physicaladdress (determined by the address bus decodingcircuitry)

I Most modern operating systems including Minix takeadvantage of this feature to simplify memorymanagement

Mapping Physical Memory to Virtual Address Space

I Each process has its own virtual address space whosesize is usually determined by the processor architecture(32-bit for IA-32)

I The operating system maps regions of the physicalmemory in the computer to the virtual address spaces ofthe different processes

I The details of how this is done are studied in the OperatingSystems course

Mapping VRAM in Minix (12)int rstruct mem_range mrunsigned int vram_base VRAMrsquos physical addresss unsigned int vram_size VRAMrsquos size but you can use

the frame-buffer size instead void video_mem frame-buffer VM address

Allow memory mapping

mrmr_base = (phys_bytes) vram_basemrmr_limit = mrmr_base + vram_size

if( OK = (r = sys_privctl(SELF SYS_PRIV_ADD_MEM ampmr)))panic(sys_privctl (ADD_MEM) failed dn r)

Map memory

video_mem = vm_map_phys(SELF (void )mrmr_base vram_size)

if(video_mem == MAP_FAILED)panic(couldnrsquot map video memory)

Mapping VRAM in Minix (22)

Question What is the following code about Allow memory mapping

mrmr_base = (phys_bytes) vram_basemrmr_limit = mrmr_base + vram_size

if( OK = (r = sys_privctl(SELF SYS_PRIV_ADD_MEM ampmr)))panic(sys_privctl (ADD_MEM) failed dn r)

Answer In modern operating systems user-level processescannot access directly HW resources including physicalmemory and VRAM

I Minix 3 handles this by allowing to grant privilegeduser-level processes the permissions they require toperform their tasks

Lab 5 - Part 1 Key Programming Issue

Issue Given a virtual address how can a program accessthe physical memory mapped to that virtual address

Solution Use C pointers

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Finding the Physical Memory Address with VBE (15)

I VBE Function 01h - Return VBE Mode InformationInput

AX = 4F01h Return VBE Mode InformationCX = Mode numberESDI = Pointer to ModeInfoBlock structure

OuputAX = VBE return status

I The ModeInfoBlock includes among other information1 The mode attributes which comprise a set of bits that

describe some general characteristics of the modeincluding whether

I it is supported by the adapterI the linear frame buffer is available

2 The screen resolution of the mode3 The physical address of the linear frame buffer

Finding the Physical Memory Address with VBE (25)

ProblemI The ModeInfoBlock structure must be accessible both in

protected mode and in real modeI VBE Function 01h is a real mode functionI Real mode addresses are only 20-bit long (must be in the

lower 1MiB)

SolutionI Use liblma library

I Provides a simple interface for applicationslm_init()lm_alloc()lm_free()

I Hides some non-documented functions provided by Minix 3I The mmap_t (already used in Lab 1) includes both

I The physical address for use by VBEI The virtual address for use in Minix 3

Finding the Physical Memory Address with VBE (35)

phys_bytes bufstruct reg86u r

[]

ruwax = 0x4F01 VBE get mode info translate the buffer linear address to a far pointer ruwes = PB2BASE(buf) set a segment base ruwdi = PB2OFF(buf) set the offset accordingly ruwcx = moderubintno = 0x10if( sys_int86(ampr) = OK ) call BIOS

PB2BASE Is a macro for computing the base of a segment a16-bit value given a 32-bit linear address

PB2OFF Is a macro for computing the offset with respect to thebase of a segment a 16-bit value given a 32-bit linearaddress

Finding the Physical Memory Address with VBE (45)

Problem The parameters contained in the buffer returned byVBE function 0x01 are layed out sequentially with no holesbetween them

I Simply defining a C struct with one member perparameter with an appropriate type is not enough

I C compilers layout the members of a struct in order andplace them in memory positions whose address isaligned according to their type

Solution Use GCCrsquos __attribute__((packed))I In principle this should be handled by thepragma pack directives but it is not supported by thisversion of GCC

Note that this attribute must appear immediately after the otherwise it has no effect

I You need not do anything as Irsquove already defined thestruct in vbeh

Finding the Physical Memory Address with VBE (55)

include ltstdinthgt

typedef struct

uint16_t ModeAttributes[]uint16_t XResolutionuint16_t YResolution[]uint8_t BitsPerPixel[]uint32_t PhysBasePtr[]

__attribute__((packed)) vbe_mode_info_t

  • Graphics AdapterVideo Card
  • Video Card in Graphics Mode
  • Lab 5
  • BIOS and VBE
  • Accessing VRAM
  • VBE Function 0x01
Page 15: Computer Labs: Lab5 Video Card in Graphics Mode - 2º MIEICpfs/aulas/lcom2016/at/13vbe.pdf · Computer Labs: Lab5 Video Card in Graphics Mode 2o MIEIC Pedro F. Souto (pfs@fe.up.pt)

PC BIOS

I Basic Input-Output System isI A firmware interface for accessing PC HW resourcesI The implementation of this interfaceI The non-volatile memory (ROM more recently flash-RAM)

containing that implementationI It is used mostly when a PC starts up

I It is 16-bits even IA-32 processors start in real-modeI It is used essentially to load the OS (or part of it)I Once the OS is loaded it usually uses its own code to

access the HW not the BIOS

BIOS Calls

I Access to BIOS services is via the SW interrupt instructionINT xx

I The xx is 8 bit and specifies the serviceI Any arguments required are passed via the processor

registersI Standard BIOS services

Interrupt vector (xx) Service10h video card11h PC configuration12h memory configuration16h keyboard

BIOS Call Example

I Set Video Mode INT 10h function 00h set video mode

MOV AH 0 functionMOV AL 3 text 25 lines X 80 columns 16 colorsINT 10h

How to make a BIOS Call in Minix 31x

ProblemI The previous example is in real address modeI Minix 3 uses protected mode with 32-bit

SolutionI Use Minix 3 kernel call SYS_INT86

ldquoMake a real-mode BIOS on behalf of a user-space devicedriver This temporarily switches from 32-bit protectedmode to 16-bit real-mode to access the BIOS callsrdquo

BIOS Call in Minix 3 Exampleinclude ltmachineint86hgt usrsrcincludearchi386int vg_exit() struct reg86u reg86

reg86ubintno = 0x10reg86ubah = 0x00reg86ubal = 0x03

if( sys_int86(ampreg86) = OK ) printf(vg_exit() sys_int86() failed n)return 1

return 0

I struct reg86u is a struct with a union of structsb is the member to access 8-bit registersw is the member to access 16-bit registersl is the member to access 32-bit registers

I The names of the members of the structs are the standardnames of IA-32 registers

Video BIOS Extension (VBE)

I The BIOS specification supports only VGA graphics modes

I VGA stands for Video Graphics AdapterI Specifies very low resolution 640x480 16 colors and

320x240 256 colorsI The Video Electronics Standards Association (VESA)

developed the Video BIOS Extension (VBE) standards inorder to make programming with higher resolutionsportable

I Early VBE versions specify only a real-mode interfaceI Later versions added a protected-mode interface but

I In version 2 only for some time-critical functionsI In version 3 supports more functions but they are optional

VBE INT 0x10 Interface

I VBE still uses INT 0x10 but to distinguish it from basicvideo BIOS services

I AH = 4Fh - BIOS uses AH for the functionI AL = function

I VBE graphics mode 105h 1024x768256 linear modestruct reg86u rruwax = 0x4F02 VBE call function 02 -- set VBE moderuwbx = 1ltlt14|0x105 set bit 14 linear framebufferrubintno = 0x10if( sys_int86(ampr) = OK )

printf(set_vbe_mode sys_int86() failed n)return 1

You should use symbolic constants

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Mapping the Linear Frame BufferI Before you can write to the frame buffer

HRES pixels

V

R

E

S

p

i

x

e

l

scolor (00)

color (10)

color (Hres0)

color (01)

1 Obtain the physical memory address11 Using a hard-coded address (0xE0000000) first

I This address may depend on the VM used So I provide aprogram that allows you to find out this address

12 Using Function 0x01 Return VBE Mode Information onceeverything else has been completed

2 Map the physical memory region into the processrsquo addressspace

Virtual and Physical Address Spaces

Issue Most computer architectures support a virtual addressspace that is decoupled from the physical address space

I Processes can access (physical) memory using alogical address that is independent of the physicaladdress (determined by the address bus decodingcircuitry)

I Most modern operating systems including Minix takeadvantage of this feature to simplify memorymanagement

Mapping Physical Memory to Virtual Address Space

I Each process has its own virtual address space whosesize is usually determined by the processor architecture(32-bit for IA-32)

I The operating system maps regions of the physicalmemory in the computer to the virtual address spaces ofthe different processes

I The details of how this is done are studied in the OperatingSystems course

Mapping VRAM in Minix (12)int rstruct mem_range mrunsigned int vram_base VRAMrsquos physical addresss unsigned int vram_size VRAMrsquos size but you can use

the frame-buffer size instead void video_mem frame-buffer VM address

Allow memory mapping

mrmr_base = (phys_bytes) vram_basemrmr_limit = mrmr_base + vram_size

if( OK = (r = sys_privctl(SELF SYS_PRIV_ADD_MEM ampmr)))panic(sys_privctl (ADD_MEM) failed dn r)

Map memory

video_mem = vm_map_phys(SELF (void )mrmr_base vram_size)

if(video_mem == MAP_FAILED)panic(couldnrsquot map video memory)

Mapping VRAM in Minix (22)

Question What is the following code about Allow memory mapping

mrmr_base = (phys_bytes) vram_basemrmr_limit = mrmr_base + vram_size

if( OK = (r = sys_privctl(SELF SYS_PRIV_ADD_MEM ampmr)))panic(sys_privctl (ADD_MEM) failed dn r)

Answer In modern operating systems user-level processescannot access directly HW resources including physicalmemory and VRAM

I Minix 3 handles this by allowing to grant privilegeduser-level processes the permissions they require toperform their tasks

Lab 5 - Part 1 Key Programming Issue

Issue Given a virtual address how can a program accessthe physical memory mapped to that virtual address

Solution Use C pointers

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Finding the Physical Memory Address with VBE (15)

I VBE Function 01h - Return VBE Mode InformationInput

AX = 4F01h Return VBE Mode InformationCX = Mode numberESDI = Pointer to ModeInfoBlock structure

OuputAX = VBE return status

I The ModeInfoBlock includes among other information1 The mode attributes which comprise a set of bits that

describe some general characteristics of the modeincluding whether

I it is supported by the adapterI the linear frame buffer is available

2 The screen resolution of the mode3 The physical address of the linear frame buffer

Finding the Physical Memory Address with VBE (25)

ProblemI The ModeInfoBlock structure must be accessible both in

protected mode and in real modeI VBE Function 01h is a real mode functionI Real mode addresses are only 20-bit long (must be in the

lower 1MiB)

SolutionI Use liblma library

I Provides a simple interface for applicationslm_init()lm_alloc()lm_free()

I Hides some non-documented functions provided by Minix 3I The mmap_t (already used in Lab 1) includes both

I The physical address for use by VBEI The virtual address for use in Minix 3

Finding the Physical Memory Address with VBE (35)

phys_bytes bufstruct reg86u r

[]

ruwax = 0x4F01 VBE get mode info translate the buffer linear address to a far pointer ruwes = PB2BASE(buf) set a segment base ruwdi = PB2OFF(buf) set the offset accordingly ruwcx = moderubintno = 0x10if( sys_int86(ampr) = OK ) call BIOS

PB2BASE Is a macro for computing the base of a segment a16-bit value given a 32-bit linear address

PB2OFF Is a macro for computing the offset with respect to thebase of a segment a 16-bit value given a 32-bit linearaddress

Finding the Physical Memory Address with VBE (45)

Problem The parameters contained in the buffer returned byVBE function 0x01 are layed out sequentially with no holesbetween them

I Simply defining a C struct with one member perparameter with an appropriate type is not enough

I C compilers layout the members of a struct in order andplace them in memory positions whose address isaligned according to their type

Solution Use GCCrsquos __attribute__((packed))I In principle this should be handled by thepragma pack directives but it is not supported by thisversion of GCC

Note that this attribute must appear immediately after the otherwise it has no effect

I You need not do anything as Irsquove already defined thestruct in vbeh

Finding the Physical Memory Address with VBE (55)

include ltstdinthgt

typedef struct

uint16_t ModeAttributes[]uint16_t XResolutionuint16_t YResolution[]uint8_t BitsPerPixel[]uint32_t PhysBasePtr[]

__attribute__((packed)) vbe_mode_info_t

  • Graphics AdapterVideo Card
  • Video Card in Graphics Mode
  • Lab 5
  • BIOS and VBE
  • Accessing VRAM
  • VBE Function 0x01
Page 16: Computer Labs: Lab5 Video Card in Graphics Mode - 2º MIEICpfs/aulas/lcom2016/at/13vbe.pdf · Computer Labs: Lab5 Video Card in Graphics Mode 2o MIEIC Pedro F. Souto (pfs@fe.up.pt)

BIOS Calls

I Access to BIOS services is via the SW interrupt instructionINT xx

I The xx is 8 bit and specifies the serviceI Any arguments required are passed via the processor

registersI Standard BIOS services

Interrupt vector (xx) Service10h video card11h PC configuration12h memory configuration16h keyboard

BIOS Call Example

I Set Video Mode INT 10h function 00h set video mode

MOV AH 0 functionMOV AL 3 text 25 lines X 80 columns 16 colorsINT 10h

How to make a BIOS Call in Minix 31x

ProblemI The previous example is in real address modeI Minix 3 uses protected mode with 32-bit

SolutionI Use Minix 3 kernel call SYS_INT86

ldquoMake a real-mode BIOS on behalf of a user-space devicedriver This temporarily switches from 32-bit protectedmode to 16-bit real-mode to access the BIOS callsrdquo

BIOS Call in Minix 3 Exampleinclude ltmachineint86hgt usrsrcincludearchi386int vg_exit() struct reg86u reg86

reg86ubintno = 0x10reg86ubah = 0x00reg86ubal = 0x03

if( sys_int86(ampreg86) = OK ) printf(vg_exit() sys_int86() failed n)return 1

return 0

I struct reg86u is a struct with a union of structsb is the member to access 8-bit registersw is the member to access 16-bit registersl is the member to access 32-bit registers

I The names of the members of the structs are the standardnames of IA-32 registers

Video BIOS Extension (VBE)

I The BIOS specification supports only VGA graphics modes

I VGA stands for Video Graphics AdapterI Specifies very low resolution 640x480 16 colors and

320x240 256 colorsI The Video Electronics Standards Association (VESA)

developed the Video BIOS Extension (VBE) standards inorder to make programming with higher resolutionsportable

I Early VBE versions specify only a real-mode interfaceI Later versions added a protected-mode interface but

I In version 2 only for some time-critical functionsI In version 3 supports more functions but they are optional

VBE INT 0x10 Interface

I VBE still uses INT 0x10 but to distinguish it from basicvideo BIOS services

I AH = 4Fh - BIOS uses AH for the functionI AL = function

I VBE graphics mode 105h 1024x768256 linear modestruct reg86u rruwax = 0x4F02 VBE call function 02 -- set VBE moderuwbx = 1ltlt14|0x105 set bit 14 linear framebufferrubintno = 0x10if( sys_int86(ampr) = OK )

printf(set_vbe_mode sys_int86() failed n)return 1

You should use symbolic constants

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Mapping the Linear Frame BufferI Before you can write to the frame buffer

HRES pixels

V

R

E

S

p

i

x

e

l

scolor (00)

color (10)

color (Hres0)

color (01)

1 Obtain the physical memory address11 Using a hard-coded address (0xE0000000) first

I This address may depend on the VM used So I provide aprogram that allows you to find out this address

12 Using Function 0x01 Return VBE Mode Information onceeverything else has been completed

2 Map the physical memory region into the processrsquo addressspace

Virtual and Physical Address Spaces

Issue Most computer architectures support a virtual addressspace that is decoupled from the physical address space

I Processes can access (physical) memory using alogical address that is independent of the physicaladdress (determined by the address bus decodingcircuitry)

I Most modern operating systems including Minix takeadvantage of this feature to simplify memorymanagement

Mapping Physical Memory to Virtual Address Space

I Each process has its own virtual address space whosesize is usually determined by the processor architecture(32-bit for IA-32)

I The operating system maps regions of the physicalmemory in the computer to the virtual address spaces ofthe different processes

I The details of how this is done are studied in the OperatingSystems course

Mapping VRAM in Minix (12)int rstruct mem_range mrunsigned int vram_base VRAMrsquos physical addresss unsigned int vram_size VRAMrsquos size but you can use

the frame-buffer size instead void video_mem frame-buffer VM address

Allow memory mapping

mrmr_base = (phys_bytes) vram_basemrmr_limit = mrmr_base + vram_size

if( OK = (r = sys_privctl(SELF SYS_PRIV_ADD_MEM ampmr)))panic(sys_privctl (ADD_MEM) failed dn r)

Map memory

video_mem = vm_map_phys(SELF (void )mrmr_base vram_size)

if(video_mem == MAP_FAILED)panic(couldnrsquot map video memory)

Mapping VRAM in Minix (22)

Question What is the following code about Allow memory mapping

mrmr_base = (phys_bytes) vram_basemrmr_limit = mrmr_base + vram_size

if( OK = (r = sys_privctl(SELF SYS_PRIV_ADD_MEM ampmr)))panic(sys_privctl (ADD_MEM) failed dn r)

Answer In modern operating systems user-level processescannot access directly HW resources including physicalmemory and VRAM

I Minix 3 handles this by allowing to grant privilegeduser-level processes the permissions they require toperform their tasks

Lab 5 - Part 1 Key Programming Issue

Issue Given a virtual address how can a program accessthe physical memory mapped to that virtual address

Solution Use C pointers

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Finding the Physical Memory Address with VBE (15)

I VBE Function 01h - Return VBE Mode InformationInput

AX = 4F01h Return VBE Mode InformationCX = Mode numberESDI = Pointer to ModeInfoBlock structure

OuputAX = VBE return status

I The ModeInfoBlock includes among other information1 The mode attributes which comprise a set of bits that

describe some general characteristics of the modeincluding whether

I it is supported by the adapterI the linear frame buffer is available

2 The screen resolution of the mode3 The physical address of the linear frame buffer

Finding the Physical Memory Address with VBE (25)

ProblemI The ModeInfoBlock structure must be accessible both in

protected mode and in real modeI VBE Function 01h is a real mode functionI Real mode addresses are only 20-bit long (must be in the

lower 1MiB)

SolutionI Use liblma library

I Provides a simple interface for applicationslm_init()lm_alloc()lm_free()

I Hides some non-documented functions provided by Minix 3I The mmap_t (already used in Lab 1) includes both

I The physical address for use by VBEI The virtual address for use in Minix 3

Finding the Physical Memory Address with VBE (35)

phys_bytes bufstruct reg86u r

[]

ruwax = 0x4F01 VBE get mode info translate the buffer linear address to a far pointer ruwes = PB2BASE(buf) set a segment base ruwdi = PB2OFF(buf) set the offset accordingly ruwcx = moderubintno = 0x10if( sys_int86(ampr) = OK ) call BIOS

PB2BASE Is a macro for computing the base of a segment a16-bit value given a 32-bit linear address

PB2OFF Is a macro for computing the offset with respect to thebase of a segment a 16-bit value given a 32-bit linearaddress

Finding the Physical Memory Address with VBE (45)

Problem The parameters contained in the buffer returned byVBE function 0x01 are layed out sequentially with no holesbetween them

I Simply defining a C struct with one member perparameter with an appropriate type is not enough

I C compilers layout the members of a struct in order andplace them in memory positions whose address isaligned according to their type

Solution Use GCCrsquos __attribute__((packed))I In principle this should be handled by thepragma pack directives but it is not supported by thisversion of GCC

Note that this attribute must appear immediately after the otherwise it has no effect

I You need not do anything as Irsquove already defined thestruct in vbeh

Finding the Physical Memory Address with VBE (55)

include ltstdinthgt

typedef struct

uint16_t ModeAttributes[]uint16_t XResolutionuint16_t YResolution[]uint8_t BitsPerPixel[]uint32_t PhysBasePtr[]

__attribute__((packed)) vbe_mode_info_t

  • Graphics AdapterVideo Card
  • Video Card in Graphics Mode
  • Lab 5
  • BIOS and VBE
  • Accessing VRAM
  • VBE Function 0x01
Page 17: Computer Labs: Lab5 Video Card in Graphics Mode - 2º MIEICpfs/aulas/lcom2016/at/13vbe.pdf · Computer Labs: Lab5 Video Card in Graphics Mode 2o MIEIC Pedro F. Souto (pfs@fe.up.pt)

BIOS Call Example

I Set Video Mode INT 10h function 00h set video mode

MOV AH 0 functionMOV AL 3 text 25 lines X 80 columns 16 colorsINT 10h

How to make a BIOS Call in Minix 31x

ProblemI The previous example is in real address modeI Minix 3 uses protected mode with 32-bit

SolutionI Use Minix 3 kernel call SYS_INT86

ldquoMake a real-mode BIOS on behalf of a user-space devicedriver This temporarily switches from 32-bit protectedmode to 16-bit real-mode to access the BIOS callsrdquo

BIOS Call in Minix 3 Exampleinclude ltmachineint86hgt usrsrcincludearchi386int vg_exit() struct reg86u reg86

reg86ubintno = 0x10reg86ubah = 0x00reg86ubal = 0x03

if( sys_int86(ampreg86) = OK ) printf(vg_exit() sys_int86() failed n)return 1

return 0

I struct reg86u is a struct with a union of structsb is the member to access 8-bit registersw is the member to access 16-bit registersl is the member to access 32-bit registers

I The names of the members of the structs are the standardnames of IA-32 registers

Video BIOS Extension (VBE)

I The BIOS specification supports only VGA graphics modes

I VGA stands for Video Graphics AdapterI Specifies very low resolution 640x480 16 colors and

320x240 256 colorsI The Video Electronics Standards Association (VESA)

developed the Video BIOS Extension (VBE) standards inorder to make programming with higher resolutionsportable

I Early VBE versions specify only a real-mode interfaceI Later versions added a protected-mode interface but

I In version 2 only for some time-critical functionsI In version 3 supports more functions but they are optional

VBE INT 0x10 Interface

I VBE still uses INT 0x10 but to distinguish it from basicvideo BIOS services

I AH = 4Fh - BIOS uses AH for the functionI AL = function

I VBE graphics mode 105h 1024x768256 linear modestruct reg86u rruwax = 0x4F02 VBE call function 02 -- set VBE moderuwbx = 1ltlt14|0x105 set bit 14 linear framebufferrubintno = 0x10if( sys_int86(ampr) = OK )

printf(set_vbe_mode sys_int86() failed n)return 1

You should use symbolic constants

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Mapping the Linear Frame BufferI Before you can write to the frame buffer

HRES pixels

V

R

E

S

p

i

x

e

l

scolor (00)

color (10)

color (Hres0)

color (01)

1 Obtain the physical memory address11 Using a hard-coded address (0xE0000000) first

I This address may depend on the VM used So I provide aprogram that allows you to find out this address

12 Using Function 0x01 Return VBE Mode Information onceeverything else has been completed

2 Map the physical memory region into the processrsquo addressspace

Virtual and Physical Address Spaces

Issue Most computer architectures support a virtual addressspace that is decoupled from the physical address space

I Processes can access (physical) memory using alogical address that is independent of the physicaladdress (determined by the address bus decodingcircuitry)

I Most modern operating systems including Minix takeadvantage of this feature to simplify memorymanagement

Mapping Physical Memory to Virtual Address Space

I Each process has its own virtual address space whosesize is usually determined by the processor architecture(32-bit for IA-32)

I The operating system maps regions of the physicalmemory in the computer to the virtual address spaces ofthe different processes

I The details of how this is done are studied in the OperatingSystems course

Mapping VRAM in Minix (12)int rstruct mem_range mrunsigned int vram_base VRAMrsquos physical addresss unsigned int vram_size VRAMrsquos size but you can use

the frame-buffer size instead void video_mem frame-buffer VM address

Allow memory mapping

mrmr_base = (phys_bytes) vram_basemrmr_limit = mrmr_base + vram_size

if( OK = (r = sys_privctl(SELF SYS_PRIV_ADD_MEM ampmr)))panic(sys_privctl (ADD_MEM) failed dn r)

Map memory

video_mem = vm_map_phys(SELF (void )mrmr_base vram_size)

if(video_mem == MAP_FAILED)panic(couldnrsquot map video memory)

Mapping VRAM in Minix (22)

Question What is the following code about Allow memory mapping

mrmr_base = (phys_bytes) vram_basemrmr_limit = mrmr_base + vram_size

if( OK = (r = sys_privctl(SELF SYS_PRIV_ADD_MEM ampmr)))panic(sys_privctl (ADD_MEM) failed dn r)

Answer In modern operating systems user-level processescannot access directly HW resources including physicalmemory and VRAM

I Minix 3 handles this by allowing to grant privilegeduser-level processes the permissions they require toperform their tasks

Lab 5 - Part 1 Key Programming Issue

Issue Given a virtual address how can a program accessthe physical memory mapped to that virtual address

Solution Use C pointers

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Finding the Physical Memory Address with VBE (15)

I VBE Function 01h - Return VBE Mode InformationInput

AX = 4F01h Return VBE Mode InformationCX = Mode numberESDI = Pointer to ModeInfoBlock structure

OuputAX = VBE return status

I The ModeInfoBlock includes among other information1 The mode attributes which comprise a set of bits that

describe some general characteristics of the modeincluding whether

I it is supported by the adapterI the linear frame buffer is available

2 The screen resolution of the mode3 The physical address of the linear frame buffer

Finding the Physical Memory Address with VBE (25)

ProblemI The ModeInfoBlock structure must be accessible both in

protected mode and in real modeI VBE Function 01h is a real mode functionI Real mode addresses are only 20-bit long (must be in the

lower 1MiB)

SolutionI Use liblma library

I Provides a simple interface for applicationslm_init()lm_alloc()lm_free()

I Hides some non-documented functions provided by Minix 3I The mmap_t (already used in Lab 1) includes both

I The physical address for use by VBEI The virtual address for use in Minix 3

Finding the Physical Memory Address with VBE (35)

phys_bytes bufstruct reg86u r

[]

ruwax = 0x4F01 VBE get mode info translate the buffer linear address to a far pointer ruwes = PB2BASE(buf) set a segment base ruwdi = PB2OFF(buf) set the offset accordingly ruwcx = moderubintno = 0x10if( sys_int86(ampr) = OK ) call BIOS

PB2BASE Is a macro for computing the base of a segment a16-bit value given a 32-bit linear address

PB2OFF Is a macro for computing the offset with respect to thebase of a segment a 16-bit value given a 32-bit linearaddress

Finding the Physical Memory Address with VBE (45)

Problem The parameters contained in the buffer returned byVBE function 0x01 are layed out sequentially with no holesbetween them

I Simply defining a C struct with one member perparameter with an appropriate type is not enough

I C compilers layout the members of a struct in order andplace them in memory positions whose address isaligned according to their type

Solution Use GCCrsquos __attribute__((packed))I In principle this should be handled by thepragma pack directives but it is not supported by thisversion of GCC

Note that this attribute must appear immediately after the otherwise it has no effect

I You need not do anything as Irsquove already defined thestruct in vbeh

Finding the Physical Memory Address with VBE (55)

include ltstdinthgt

typedef struct

uint16_t ModeAttributes[]uint16_t XResolutionuint16_t YResolution[]uint8_t BitsPerPixel[]uint32_t PhysBasePtr[]

__attribute__((packed)) vbe_mode_info_t

  • Graphics AdapterVideo Card
  • Video Card in Graphics Mode
  • Lab 5
  • BIOS and VBE
  • Accessing VRAM
  • VBE Function 0x01
Page 18: Computer Labs: Lab5 Video Card in Graphics Mode - 2º MIEICpfs/aulas/lcom2016/at/13vbe.pdf · Computer Labs: Lab5 Video Card in Graphics Mode 2o MIEIC Pedro F. Souto (pfs@fe.up.pt)

How to make a BIOS Call in Minix 31x

ProblemI The previous example is in real address modeI Minix 3 uses protected mode with 32-bit

SolutionI Use Minix 3 kernel call SYS_INT86

ldquoMake a real-mode BIOS on behalf of a user-space devicedriver This temporarily switches from 32-bit protectedmode to 16-bit real-mode to access the BIOS callsrdquo

BIOS Call in Minix 3 Exampleinclude ltmachineint86hgt usrsrcincludearchi386int vg_exit() struct reg86u reg86

reg86ubintno = 0x10reg86ubah = 0x00reg86ubal = 0x03

if( sys_int86(ampreg86) = OK ) printf(vg_exit() sys_int86() failed n)return 1

return 0

I struct reg86u is a struct with a union of structsb is the member to access 8-bit registersw is the member to access 16-bit registersl is the member to access 32-bit registers

I The names of the members of the structs are the standardnames of IA-32 registers

Video BIOS Extension (VBE)

I The BIOS specification supports only VGA graphics modes

I VGA stands for Video Graphics AdapterI Specifies very low resolution 640x480 16 colors and

320x240 256 colorsI The Video Electronics Standards Association (VESA)

developed the Video BIOS Extension (VBE) standards inorder to make programming with higher resolutionsportable

I Early VBE versions specify only a real-mode interfaceI Later versions added a protected-mode interface but

I In version 2 only for some time-critical functionsI In version 3 supports more functions but they are optional

VBE INT 0x10 Interface

I VBE still uses INT 0x10 but to distinguish it from basicvideo BIOS services

I AH = 4Fh - BIOS uses AH for the functionI AL = function

I VBE graphics mode 105h 1024x768256 linear modestruct reg86u rruwax = 0x4F02 VBE call function 02 -- set VBE moderuwbx = 1ltlt14|0x105 set bit 14 linear framebufferrubintno = 0x10if( sys_int86(ampr) = OK )

printf(set_vbe_mode sys_int86() failed n)return 1

You should use symbolic constants

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Mapping the Linear Frame BufferI Before you can write to the frame buffer

HRES pixels

V

R

E

S

p

i

x

e

l

scolor (00)

color (10)

color (Hres0)

color (01)

1 Obtain the physical memory address11 Using a hard-coded address (0xE0000000) first

I This address may depend on the VM used So I provide aprogram that allows you to find out this address

12 Using Function 0x01 Return VBE Mode Information onceeverything else has been completed

2 Map the physical memory region into the processrsquo addressspace

Virtual and Physical Address Spaces

Issue Most computer architectures support a virtual addressspace that is decoupled from the physical address space

I Processes can access (physical) memory using alogical address that is independent of the physicaladdress (determined by the address bus decodingcircuitry)

I Most modern operating systems including Minix takeadvantage of this feature to simplify memorymanagement

Mapping Physical Memory to Virtual Address Space

I Each process has its own virtual address space whosesize is usually determined by the processor architecture(32-bit for IA-32)

I The operating system maps regions of the physicalmemory in the computer to the virtual address spaces ofthe different processes

I The details of how this is done are studied in the OperatingSystems course

Mapping VRAM in Minix (12)int rstruct mem_range mrunsigned int vram_base VRAMrsquos physical addresss unsigned int vram_size VRAMrsquos size but you can use

the frame-buffer size instead void video_mem frame-buffer VM address

Allow memory mapping

mrmr_base = (phys_bytes) vram_basemrmr_limit = mrmr_base + vram_size

if( OK = (r = sys_privctl(SELF SYS_PRIV_ADD_MEM ampmr)))panic(sys_privctl (ADD_MEM) failed dn r)

Map memory

video_mem = vm_map_phys(SELF (void )mrmr_base vram_size)

if(video_mem == MAP_FAILED)panic(couldnrsquot map video memory)

Mapping VRAM in Minix (22)

Question What is the following code about Allow memory mapping

mrmr_base = (phys_bytes) vram_basemrmr_limit = mrmr_base + vram_size

if( OK = (r = sys_privctl(SELF SYS_PRIV_ADD_MEM ampmr)))panic(sys_privctl (ADD_MEM) failed dn r)

Answer In modern operating systems user-level processescannot access directly HW resources including physicalmemory and VRAM

I Minix 3 handles this by allowing to grant privilegeduser-level processes the permissions they require toperform their tasks

Lab 5 - Part 1 Key Programming Issue

Issue Given a virtual address how can a program accessthe physical memory mapped to that virtual address

Solution Use C pointers

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Finding the Physical Memory Address with VBE (15)

I VBE Function 01h - Return VBE Mode InformationInput

AX = 4F01h Return VBE Mode InformationCX = Mode numberESDI = Pointer to ModeInfoBlock structure

OuputAX = VBE return status

I The ModeInfoBlock includes among other information1 The mode attributes which comprise a set of bits that

describe some general characteristics of the modeincluding whether

I it is supported by the adapterI the linear frame buffer is available

2 The screen resolution of the mode3 The physical address of the linear frame buffer

Finding the Physical Memory Address with VBE (25)

ProblemI The ModeInfoBlock structure must be accessible both in

protected mode and in real modeI VBE Function 01h is a real mode functionI Real mode addresses are only 20-bit long (must be in the

lower 1MiB)

SolutionI Use liblma library

I Provides a simple interface for applicationslm_init()lm_alloc()lm_free()

I Hides some non-documented functions provided by Minix 3I The mmap_t (already used in Lab 1) includes both

I The physical address for use by VBEI The virtual address for use in Minix 3

Finding the Physical Memory Address with VBE (35)

phys_bytes bufstruct reg86u r

[]

ruwax = 0x4F01 VBE get mode info translate the buffer linear address to a far pointer ruwes = PB2BASE(buf) set a segment base ruwdi = PB2OFF(buf) set the offset accordingly ruwcx = moderubintno = 0x10if( sys_int86(ampr) = OK ) call BIOS

PB2BASE Is a macro for computing the base of a segment a16-bit value given a 32-bit linear address

PB2OFF Is a macro for computing the offset with respect to thebase of a segment a 16-bit value given a 32-bit linearaddress

Finding the Physical Memory Address with VBE (45)

Problem The parameters contained in the buffer returned byVBE function 0x01 are layed out sequentially with no holesbetween them

I Simply defining a C struct with one member perparameter with an appropriate type is not enough

I C compilers layout the members of a struct in order andplace them in memory positions whose address isaligned according to their type

Solution Use GCCrsquos __attribute__((packed))I In principle this should be handled by thepragma pack directives but it is not supported by thisversion of GCC

Note that this attribute must appear immediately after the otherwise it has no effect

I You need not do anything as Irsquove already defined thestruct in vbeh

Finding the Physical Memory Address with VBE (55)

include ltstdinthgt

typedef struct

uint16_t ModeAttributes[]uint16_t XResolutionuint16_t YResolution[]uint8_t BitsPerPixel[]uint32_t PhysBasePtr[]

__attribute__((packed)) vbe_mode_info_t

  • Graphics AdapterVideo Card
  • Video Card in Graphics Mode
  • Lab 5
  • BIOS and VBE
  • Accessing VRAM
  • VBE Function 0x01
Page 19: Computer Labs: Lab5 Video Card in Graphics Mode - 2º MIEICpfs/aulas/lcom2016/at/13vbe.pdf · Computer Labs: Lab5 Video Card in Graphics Mode 2o MIEIC Pedro F. Souto (pfs@fe.up.pt)

BIOS Call in Minix 3 Exampleinclude ltmachineint86hgt usrsrcincludearchi386int vg_exit() struct reg86u reg86

reg86ubintno = 0x10reg86ubah = 0x00reg86ubal = 0x03

if( sys_int86(ampreg86) = OK ) printf(vg_exit() sys_int86() failed n)return 1

return 0

I struct reg86u is a struct with a union of structsb is the member to access 8-bit registersw is the member to access 16-bit registersl is the member to access 32-bit registers

I The names of the members of the structs are the standardnames of IA-32 registers

Video BIOS Extension (VBE)

I The BIOS specification supports only VGA graphics modes

I VGA stands for Video Graphics AdapterI Specifies very low resolution 640x480 16 colors and

320x240 256 colorsI The Video Electronics Standards Association (VESA)

developed the Video BIOS Extension (VBE) standards inorder to make programming with higher resolutionsportable

I Early VBE versions specify only a real-mode interfaceI Later versions added a protected-mode interface but

I In version 2 only for some time-critical functionsI In version 3 supports more functions but they are optional

VBE INT 0x10 Interface

I VBE still uses INT 0x10 but to distinguish it from basicvideo BIOS services

I AH = 4Fh - BIOS uses AH for the functionI AL = function

I VBE graphics mode 105h 1024x768256 linear modestruct reg86u rruwax = 0x4F02 VBE call function 02 -- set VBE moderuwbx = 1ltlt14|0x105 set bit 14 linear framebufferrubintno = 0x10if( sys_int86(ampr) = OK )

printf(set_vbe_mode sys_int86() failed n)return 1

You should use symbolic constants

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Mapping the Linear Frame BufferI Before you can write to the frame buffer

HRES pixels

V

R

E

S

p

i

x

e

l

scolor (00)

color (10)

color (Hres0)

color (01)

1 Obtain the physical memory address11 Using a hard-coded address (0xE0000000) first

I This address may depend on the VM used So I provide aprogram that allows you to find out this address

12 Using Function 0x01 Return VBE Mode Information onceeverything else has been completed

2 Map the physical memory region into the processrsquo addressspace

Virtual and Physical Address Spaces

Issue Most computer architectures support a virtual addressspace that is decoupled from the physical address space

I Processes can access (physical) memory using alogical address that is independent of the physicaladdress (determined by the address bus decodingcircuitry)

I Most modern operating systems including Minix takeadvantage of this feature to simplify memorymanagement

Mapping Physical Memory to Virtual Address Space

I Each process has its own virtual address space whosesize is usually determined by the processor architecture(32-bit for IA-32)

I The operating system maps regions of the physicalmemory in the computer to the virtual address spaces ofthe different processes

I The details of how this is done are studied in the OperatingSystems course

Mapping VRAM in Minix (12)int rstruct mem_range mrunsigned int vram_base VRAMrsquos physical addresss unsigned int vram_size VRAMrsquos size but you can use

the frame-buffer size instead void video_mem frame-buffer VM address

Allow memory mapping

mrmr_base = (phys_bytes) vram_basemrmr_limit = mrmr_base + vram_size

if( OK = (r = sys_privctl(SELF SYS_PRIV_ADD_MEM ampmr)))panic(sys_privctl (ADD_MEM) failed dn r)

Map memory

video_mem = vm_map_phys(SELF (void )mrmr_base vram_size)

if(video_mem == MAP_FAILED)panic(couldnrsquot map video memory)

Mapping VRAM in Minix (22)

Question What is the following code about Allow memory mapping

mrmr_base = (phys_bytes) vram_basemrmr_limit = mrmr_base + vram_size

if( OK = (r = sys_privctl(SELF SYS_PRIV_ADD_MEM ampmr)))panic(sys_privctl (ADD_MEM) failed dn r)

Answer In modern operating systems user-level processescannot access directly HW resources including physicalmemory and VRAM

I Minix 3 handles this by allowing to grant privilegeduser-level processes the permissions they require toperform their tasks

Lab 5 - Part 1 Key Programming Issue

Issue Given a virtual address how can a program accessthe physical memory mapped to that virtual address

Solution Use C pointers

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Finding the Physical Memory Address with VBE (15)

I VBE Function 01h - Return VBE Mode InformationInput

AX = 4F01h Return VBE Mode InformationCX = Mode numberESDI = Pointer to ModeInfoBlock structure

OuputAX = VBE return status

I The ModeInfoBlock includes among other information1 The mode attributes which comprise a set of bits that

describe some general characteristics of the modeincluding whether

I it is supported by the adapterI the linear frame buffer is available

2 The screen resolution of the mode3 The physical address of the linear frame buffer

Finding the Physical Memory Address with VBE (25)

ProblemI The ModeInfoBlock structure must be accessible both in

protected mode and in real modeI VBE Function 01h is a real mode functionI Real mode addresses are only 20-bit long (must be in the

lower 1MiB)

SolutionI Use liblma library

I Provides a simple interface for applicationslm_init()lm_alloc()lm_free()

I Hides some non-documented functions provided by Minix 3I The mmap_t (already used in Lab 1) includes both

I The physical address for use by VBEI The virtual address for use in Minix 3

Finding the Physical Memory Address with VBE (35)

phys_bytes bufstruct reg86u r

[]

ruwax = 0x4F01 VBE get mode info translate the buffer linear address to a far pointer ruwes = PB2BASE(buf) set a segment base ruwdi = PB2OFF(buf) set the offset accordingly ruwcx = moderubintno = 0x10if( sys_int86(ampr) = OK ) call BIOS

PB2BASE Is a macro for computing the base of a segment a16-bit value given a 32-bit linear address

PB2OFF Is a macro for computing the offset with respect to thebase of a segment a 16-bit value given a 32-bit linearaddress

Finding the Physical Memory Address with VBE (45)

Problem The parameters contained in the buffer returned byVBE function 0x01 are layed out sequentially with no holesbetween them

I Simply defining a C struct with one member perparameter with an appropriate type is not enough

I C compilers layout the members of a struct in order andplace them in memory positions whose address isaligned according to their type

Solution Use GCCrsquos __attribute__((packed))I In principle this should be handled by thepragma pack directives but it is not supported by thisversion of GCC

Note that this attribute must appear immediately after the otherwise it has no effect

I You need not do anything as Irsquove already defined thestruct in vbeh

Finding the Physical Memory Address with VBE (55)

include ltstdinthgt

typedef struct

uint16_t ModeAttributes[]uint16_t XResolutionuint16_t YResolution[]uint8_t BitsPerPixel[]uint32_t PhysBasePtr[]

__attribute__((packed)) vbe_mode_info_t

  • Graphics AdapterVideo Card
  • Video Card in Graphics Mode
  • Lab 5
  • BIOS and VBE
  • Accessing VRAM
  • VBE Function 0x01
Page 20: Computer Labs: Lab5 Video Card in Graphics Mode - 2º MIEICpfs/aulas/lcom2016/at/13vbe.pdf · Computer Labs: Lab5 Video Card in Graphics Mode 2o MIEIC Pedro F. Souto (pfs@fe.up.pt)

Video BIOS Extension (VBE)

I The BIOS specification supports only VGA graphics modes

I VGA stands for Video Graphics AdapterI Specifies very low resolution 640x480 16 colors and

320x240 256 colorsI The Video Electronics Standards Association (VESA)

developed the Video BIOS Extension (VBE) standards inorder to make programming with higher resolutionsportable

I Early VBE versions specify only a real-mode interfaceI Later versions added a protected-mode interface but

I In version 2 only for some time-critical functionsI In version 3 supports more functions but they are optional

VBE INT 0x10 Interface

I VBE still uses INT 0x10 but to distinguish it from basicvideo BIOS services

I AH = 4Fh - BIOS uses AH for the functionI AL = function

I VBE graphics mode 105h 1024x768256 linear modestruct reg86u rruwax = 0x4F02 VBE call function 02 -- set VBE moderuwbx = 1ltlt14|0x105 set bit 14 linear framebufferrubintno = 0x10if( sys_int86(ampr) = OK )

printf(set_vbe_mode sys_int86() failed n)return 1

You should use symbolic constants

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Mapping the Linear Frame BufferI Before you can write to the frame buffer

HRES pixels

V

R

E

S

p

i

x

e

l

scolor (00)

color (10)

color (Hres0)

color (01)

1 Obtain the physical memory address11 Using a hard-coded address (0xE0000000) first

I This address may depend on the VM used So I provide aprogram that allows you to find out this address

12 Using Function 0x01 Return VBE Mode Information onceeverything else has been completed

2 Map the physical memory region into the processrsquo addressspace

Virtual and Physical Address Spaces

Issue Most computer architectures support a virtual addressspace that is decoupled from the physical address space

I Processes can access (physical) memory using alogical address that is independent of the physicaladdress (determined by the address bus decodingcircuitry)

I Most modern operating systems including Minix takeadvantage of this feature to simplify memorymanagement

Mapping Physical Memory to Virtual Address Space

I Each process has its own virtual address space whosesize is usually determined by the processor architecture(32-bit for IA-32)

I The operating system maps regions of the physicalmemory in the computer to the virtual address spaces ofthe different processes

I The details of how this is done are studied in the OperatingSystems course

Mapping VRAM in Minix (12)int rstruct mem_range mrunsigned int vram_base VRAMrsquos physical addresss unsigned int vram_size VRAMrsquos size but you can use

the frame-buffer size instead void video_mem frame-buffer VM address

Allow memory mapping

mrmr_base = (phys_bytes) vram_basemrmr_limit = mrmr_base + vram_size

if( OK = (r = sys_privctl(SELF SYS_PRIV_ADD_MEM ampmr)))panic(sys_privctl (ADD_MEM) failed dn r)

Map memory

video_mem = vm_map_phys(SELF (void )mrmr_base vram_size)

if(video_mem == MAP_FAILED)panic(couldnrsquot map video memory)

Mapping VRAM in Minix (22)

Question What is the following code about Allow memory mapping

mrmr_base = (phys_bytes) vram_basemrmr_limit = mrmr_base + vram_size

if( OK = (r = sys_privctl(SELF SYS_PRIV_ADD_MEM ampmr)))panic(sys_privctl (ADD_MEM) failed dn r)

Answer In modern operating systems user-level processescannot access directly HW resources including physicalmemory and VRAM

I Minix 3 handles this by allowing to grant privilegeduser-level processes the permissions they require toperform their tasks

Lab 5 - Part 1 Key Programming Issue

Issue Given a virtual address how can a program accessthe physical memory mapped to that virtual address

Solution Use C pointers

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Finding the Physical Memory Address with VBE (15)

I VBE Function 01h - Return VBE Mode InformationInput

AX = 4F01h Return VBE Mode InformationCX = Mode numberESDI = Pointer to ModeInfoBlock structure

OuputAX = VBE return status

I The ModeInfoBlock includes among other information1 The mode attributes which comprise a set of bits that

describe some general characteristics of the modeincluding whether

I it is supported by the adapterI the linear frame buffer is available

2 The screen resolution of the mode3 The physical address of the linear frame buffer

Finding the Physical Memory Address with VBE (25)

ProblemI The ModeInfoBlock structure must be accessible both in

protected mode and in real modeI VBE Function 01h is a real mode functionI Real mode addresses are only 20-bit long (must be in the

lower 1MiB)

SolutionI Use liblma library

I Provides a simple interface for applicationslm_init()lm_alloc()lm_free()

I Hides some non-documented functions provided by Minix 3I The mmap_t (already used in Lab 1) includes both

I The physical address for use by VBEI The virtual address for use in Minix 3

Finding the Physical Memory Address with VBE (35)

phys_bytes bufstruct reg86u r

[]

ruwax = 0x4F01 VBE get mode info translate the buffer linear address to a far pointer ruwes = PB2BASE(buf) set a segment base ruwdi = PB2OFF(buf) set the offset accordingly ruwcx = moderubintno = 0x10if( sys_int86(ampr) = OK ) call BIOS

PB2BASE Is a macro for computing the base of a segment a16-bit value given a 32-bit linear address

PB2OFF Is a macro for computing the offset with respect to thebase of a segment a 16-bit value given a 32-bit linearaddress

Finding the Physical Memory Address with VBE (45)

Problem The parameters contained in the buffer returned byVBE function 0x01 are layed out sequentially with no holesbetween them

I Simply defining a C struct with one member perparameter with an appropriate type is not enough

I C compilers layout the members of a struct in order andplace them in memory positions whose address isaligned according to their type

Solution Use GCCrsquos __attribute__((packed))I In principle this should be handled by thepragma pack directives but it is not supported by thisversion of GCC

Note that this attribute must appear immediately after the otherwise it has no effect

I You need not do anything as Irsquove already defined thestruct in vbeh

Finding the Physical Memory Address with VBE (55)

include ltstdinthgt

typedef struct

uint16_t ModeAttributes[]uint16_t XResolutionuint16_t YResolution[]uint8_t BitsPerPixel[]uint32_t PhysBasePtr[]

__attribute__((packed)) vbe_mode_info_t

  • Graphics AdapterVideo Card
  • Video Card in Graphics Mode
  • Lab 5
  • BIOS and VBE
  • Accessing VRAM
  • VBE Function 0x01
Page 21: Computer Labs: Lab5 Video Card in Graphics Mode - 2º MIEICpfs/aulas/lcom2016/at/13vbe.pdf · Computer Labs: Lab5 Video Card in Graphics Mode 2o MIEIC Pedro F. Souto (pfs@fe.up.pt)

VBE INT 0x10 Interface

I VBE still uses INT 0x10 but to distinguish it from basicvideo BIOS services

I AH = 4Fh - BIOS uses AH for the functionI AL = function

I VBE graphics mode 105h 1024x768256 linear modestruct reg86u rruwax = 0x4F02 VBE call function 02 -- set VBE moderuwbx = 1ltlt14|0x105 set bit 14 linear framebufferrubintno = 0x10if( sys_int86(ampr) = OK )

printf(set_vbe_mode sys_int86() failed n)return 1

You should use symbolic constants

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Mapping the Linear Frame BufferI Before you can write to the frame buffer

HRES pixels

V

R

E

S

p

i

x

e

l

scolor (00)

color (10)

color (Hres0)

color (01)

1 Obtain the physical memory address11 Using a hard-coded address (0xE0000000) first

I This address may depend on the VM used So I provide aprogram that allows you to find out this address

12 Using Function 0x01 Return VBE Mode Information onceeverything else has been completed

2 Map the physical memory region into the processrsquo addressspace

Virtual and Physical Address Spaces

Issue Most computer architectures support a virtual addressspace that is decoupled from the physical address space

I Processes can access (physical) memory using alogical address that is independent of the physicaladdress (determined by the address bus decodingcircuitry)

I Most modern operating systems including Minix takeadvantage of this feature to simplify memorymanagement

Mapping Physical Memory to Virtual Address Space

I Each process has its own virtual address space whosesize is usually determined by the processor architecture(32-bit for IA-32)

I The operating system maps regions of the physicalmemory in the computer to the virtual address spaces ofthe different processes

I The details of how this is done are studied in the OperatingSystems course

Mapping VRAM in Minix (12)int rstruct mem_range mrunsigned int vram_base VRAMrsquos physical addresss unsigned int vram_size VRAMrsquos size but you can use

the frame-buffer size instead void video_mem frame-buffer VM address

Allow memory mapping

mrmr_base = (phys_bytes) vram_basemrmr_limit = mrmr_base + vram_size

if( OK = (r = sys_privctl(SELF SYS_PRIV_ADD_MEM ampmr)))panic(sys_privctl (ADD_MEM) failed dn r)

Map memory

video_mem = vm_map_phys(SELF (void )mrmr_base vram_size)

if(video_mem == MAP_FAILED)panic(couldnrsquot map video memory)

Mapping VRAM in Minix (22)

Question What is the following code about Allow memory mapping

mrmr_base = (phys_bytes) vram_basemrmr_limit = mrmr_base + vram_size

if( OK = (r = sys_privctl(SELF SYS_PRIV_ADD_MEM ampmr)))panic(sys_privctl (ADD_MEM) failed dn r)

Answer In modern operating systems user-level processescannot access directly HW resources including physicalmemory and VRAM

I Minix 3 handles this by allowing to grant privilegeduser-level processes the permissions they require toperform their tasks

Lab 5 - Part 1 Key Programming Issue

Issue Given a virtual address how can a program accessthe physical memory mapped to that virtual address

Solution Use C pointers

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Finding the Physical Memory Address with VBE (15)

I VBE Function 01h - Return VBE Mode InformationInput

AX = 4F01h Return VBE Mode InformationCX = Mode numberESDI = Pointer to ModeInfoBlock structure

OuputAX = VBE return status

I The ModeInfoBlock includes among other information1 The mode attributes which comprise a set of bits that

describe some general characteristics of the modeincluding whether

I it is supported by the adapterI the linear frame buffer is available

2 The screen resolution of the mode3 The physical address of the linear frame buffer

Finding the Physical Memory Address with VBE (25)

ProblemI The ModeInfoBlock structure must be accessible both in

protected mode and in real modeI VBE Function 01h is a real mode functionI Real mode addresses are only 20-bit long (must be in the

lower 1MiB)

SolutionI Use liblma library

I Provides a simple interface for applicationslm_init()lm_alloc()lm_free()

I Hides some non-documented functions provided by Minix 3I The mmap_t (already used in Lab 1) includes both

I The physical address for use by VBEI The virtual address for use in Minix 3

Finding the Physical Memory Address with VBE (35)

phys_bytes bufstruct reg86u r

[]

ruwax = 0x4F01 VBE get mode info translate the buffer linear address to a far pointer ruwes = PB2BASE(buf) set a segment base ruwdi = PB2OFF(buf) set the offset accordingly ruwcx = moderubintno = 0x10if( sys_int86(ampr) = OK ) call BIOS

PB2BASE Is a macro for computing the base of a segment a16-bit value given a 32-bit linear address

PB2OFF Is a macro for computing the offset with respect to thebase of a segment a 16-bit value given a 32-bit linearaddress

Finding the Physical Memory Address with VBE (45)

Problem The parameters contained in the buffer returned byVBE function 0x01 are layed out sequentially with no holesbetween them

I Simply defining a C struct with one member perparameter with an appropriate type is not enough

I C compilers layout the members of a struct in order andplace them in memory positions whose address isaligned according to their type

Solution Use GCCrsquos __attribute__((packed))I In principle this should be handled by thepragma pack directives but it is not supported by thisversion of GCC

Note that this attribute must appear immediately after the otherwise it has no effect

I You need not do anything as Irsquove already defined thestruct in vbeh

Finding the Physical Memory Address with VBE (55)

include ltstdinthgt

typedef struct

uint16_t ModeAttributes[]uint16_t XResolutionuint16_t YResolution[]uint8_t BitsPerPixel[]uint32_t PhysBasePtr[]

__attribute__((packed)) vbe_mode_info_t

  • Graphics AdapterVideo Card
  • Video Card in Graphics Mode
  • Lab 5
  • BIOS and VBE
  • Accessing VRAM
  • VBE Function 0x01
Page 22: Computer Labs: Lab5 Video Card in Graphics Mode - 2º MIEICpfs/aulas/lcom2016/at/13vbe.pdf · Computer Labs: Lab5 Video Card in Graphics Mode 2o MIEIC Pedro F. Souto (pfs@fe.up.pt)

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Mapping the Linear Frame BufferI Before you can write to the frame buffer

HRES pixels

V

R

E

S

p

i

x

e

l

scolor (00)

color (10)

color (Hres0)

color (01)

1 Obtain the physical memory address11 Using a hard-coded address (0xE0000000) first

I This address may depend on the VM used So I provide aprogram that allows you to find out this address

12 Using Function 0x01 Return VBE Mode Information onceeverything else has been completed

2 Map the physical memory region into the processrsquo addressspace

Virtual and Physical Address Spaces

Issue Most computer architectures support a virtual addressspace that is decoupled from the physical address space

I Processes can access (physical) memory using alogical address that is independent of the physicaladdress (determined by the address bus decodingcircuitry)

I Most modern operating systems including Minix takeadvantage of this feature to simplify memorymanagement

Mapping Physical Memory to Virtual Address Space

I Each process has its own virtual address space whosesize is usually determined by the processor architecture(32-bit for IA-32)

I The operating system maps regions of the physicalmemory in the computer to the virtual address spaces ofthe different processes

I The details of how this is done are studied in the OperatingSystems course

Mapping VRAM in Minix (12)int rstruct mem_range mrunsigned int vram_base VRAMrsquos physical addresss unsigned int vram_size VRAMrsquos size but you can use

the frame-buffer size instead void video_mem frame-buffer VM address

Allow memory mapping

mrmr_base = (phys_bytes) vram_basemrmr_limit = mrmr_base + vram_size

if( OK = (r = sys_privctl(SELF SYS_PRIV_ADD_MEM ampmr)))panic(sys_privctl (ADD_MEM) failed dn r)

Map memory

video_mem = vm_map_phys(SELF (void )mrmr_base vram_size)

if(video_mem == MAP_FAILED)panic(couldnrsquot map video memory)

Mapping VRAM in Minix (22)

Question What is the following code about Allow memory mapping

mrmr_base = (phys_bytes) vram_basemrmr_limit = mrmr_base + vram_size

if( OK = (r = sys_privctl(SELF SYS_PRIV_ADD_MEM ampmr)))panic(sys_privctl (ADD_MEM) failed dn r)

Answer In modern operating systems user-level processescannot access directly HW resources including physicalmemory and VRAM

I Minix 3 handles this by allowing to grant privilegeduser-level processes the permissions they require toperform their tasks

Lab 5 - Part 1 Key Programming Issue

Issue Given a virtual address how can a program accessthe physical memory mapped to that virtual address

Solution Use C pointers

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Finding the Physical Memory Address with VBE (15)

I VBE Function 01h - Return VBE Mode InformationInput

AX = 4F01h Return VBE Mode InformationCX = Mode numberESDI = Pointer to ModeInfoBlock structure

OuputAX = VBE return status

I The ModeInfoBlock includes among other information1 The mode attributes which comprise a set of bits that

describe some general characteristics of the modeincluding whether

I it is supported by the adapterI the linear frame buffer is available

2 The screen resolution of the mode3 The physical address of the linear frame buffer

Finding the Physical Memory Address with VBE (25)

ProblemI The ModeInfoBlock structure must be accessible both in

protected mode and in real modeI VBE Function 01h is a real mode functionI Real mode addresses are only 20-bit long (must be in the

lower 1MiB)

SolutionI Use liblma library

I Provides a simple interface for applicationslm_init()lm_alloc()lm_free()

I Hides some non-documented functions provided by Minix 3I The mmap_t (already used in Lab 1) includes both

I The physical address for use by VBEI The virtual address for use in Minix 3

Finding the Physical Memory Address with VBE (35)

phys_bytes bufstruct reg86u r

[]

ruwax = 0x4F01 VBE get mode info translate the buffer linear address to a far pointer ruwes = PB2BASE(buf) set a segment base ruwdi = PB2OFF(buf) set the offset accordingly ruwcx = moderubintno = 0x10if( sys_int86(ampr) = OK ) call BIOS

PB2BASE Is a macro for computing the base of a segment a16-bit value given a 32-bit linear address

PB2OFF Is a macro for computing the offset with respect to thebase of a segment a 16-bit value given a 32-bit linearaddress

Finding the Physical Memory Address with VBE (45)

Problem The parameters contained in the buffer returned byVBE function 0x01 are layed out sequentially with no holesbetween them

I Simply defining a C struct with one member perparameter with an appropriate type is not enough

I C compilers layout the members of a struct in order andplace them in memory positions whose address isaligned according to their type

Solution Use GCCrsquos __attribute__((packed))I In principle this should be handled by thepragma pack directives but it is not supported by thisversion of GCC

Note that this attribute must appear immediately after the otherwise it has no effect

I You need not do anything as Irsquove already defined thestruct in vbeh

Finding the Physical Memory Address with VBE (55)

include ltstdinthgt

typedef struct

uint16_t ModeAttributes[]uint16_t XResolutionuint16_t YResolution[]uint8_t BitsPerPixel[]uint32_t PhysBasePtr[]

__attribute__((packed)) vbe_mode_info_t

  • Graphics AdapterVideo Card
  • Video Card in Graphics Mode
  • Lab 5
  • BIOS and VBE
  • Accessing VRAM
  • VBE Function 0x01
Page 23: Computer Labs: Lab5 Video Card in Graphics Mode - 2º MIEICpfs/aulas/lcom2016/at/13vbe.pdf · Computer Labs: Lab5 Video Card in Graphics Mode 2o MIEIC Pedro F. Souto (pfs@fe.up.pt)

Mapping the Linear Frame BufferI Before you can write to the frame buffer

HRES pixels

V

R

E

S

p

i

x

e

l

scolor (00)

color (10)

color (Hres0)

color (01)

1 Obtain the physical memory address11 Using a hard-coded address (0xE0000000) first

I This address may depend on the VM used So I provide aprogram that allows you to find out this address

12 Using Function 0x01 Return VBE Mode Information onceeverything else has been completed

2 Map the physical memory region into the processrsquo addressspace

Virtual and Physical Address Spaces

Issue Most computer architectures support a virtual addressspace that is decoupled from the physical address space

I Processes can access (physical) memory using alogical address that is independent of the physicaladdress (determined by the address bus decodingcircuitry)

I Most modern operating systems including Minix takeadvantage of this feature to simplify memorymanagement

Mapping Physical Memory to Virtual Address Space

I Each process has its own virtual address space whosesize is usually determined by the processor architecture(32-bit for IA-32)

I The operating system maps regions of the physicalmemory in the computer to the virtual address spaces ofthe different processes

I The details of how this is done are studied in the OperatingSystems course

Mapping VRAM in Minix (12)int rstruct mem_range mrunsigned int vram_base VRAMrsquos physical addresss unsigned int vram_size VRAMrsquos size but you can use

the frame-buffer size instead void video_mem frame-buffer VM address

Allow memory mapping

mrmr_base = (phys_bytes) vram_basemrmr_limit = mrmr_base + vram_size

if( OK = (r = sys_privctl(SELF SYS_PRIV_ADD_MEM ampmr)))panic(sys_privctl (ADD_MEM) failed dn r)

Map memory

video_mem = vm_map_phys(SELF (void )mrmr_base vram_size)

if(video_mem == MAP_FAILED)panic(couldnrsquot map video memory)

Mapping VRAM in Minix (22)

Question What is the following code about Allow memory mapping

mrmr_base = (phys_bytes) vram_basemrmr_limit = mrmr_base + vram_size

if( OK = (r = sys_privctl(SELF SYS_PRIV_ADD_MEM ampmr)))panic(sys_privctl (ADD_MEM) failed dn r)

Answer In modern operating systems user-level processescannot access directly HW resources including physicalmemory and VRAM

I Minix 3 handles this by allowing to grant privilegeduser-level processes the permissions they require toperform their tasks

Lab 5 - Part 1 Key Programming Issue

Issue Given a virtual address how can a program accessthe physical memory mapped to that virtual address

Solution Use C pointers

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Finding the Physical Memory Address with VBE (15)

I VBE Function 01h - Return VBE Mode InformationInput

AX = 4F01h Return VBE Mode InformationCX = Mode numberESDI = Pointer to ModeInfoBlock structure

OuputAX = VBE return status

I The ModeInfoBlock includes among other information1 The mode attributes which comprise a set of bits that

describe some general characteristics of the modeincluding whether

I it is supported by the adapterI the linear frame buffer is available

2 The screen resolution of the mode3 The physical address of the linear frame buffer

Finding the Physical Memory Address with VBE (25)

ProblemI The ModeInfoBlock structure must be accessible both in

protected mode and in real modeI VBE Function 01h is a real mode functionI Real mode addresses are only 20-bit long (must be in the

lower 1MiB)

SolutionI Use liblma library

I Provides a simple interface for applicationslm_init()lm_alloc()lm_free()

I Hides some non-documented functions provided by Minix 3I The mmap_t (already used in Lab 1) includes both

I The physical address for use by VBEI The virtual address for use in Minix 3

Finding the Physical Memory Address with VBE (35)

phys_bytes bufstruct reg86u r

[]

ruwax = 0x4F01 VBE get mode info translate the buffer linear address to a far pointer ruwes = PB2BASE(buf) set a segment base ruwdi = PB2OFF(buf) set the offset accordingly ruwcx = moderubintno = 0x10if( sys_int86(ampr) = OK ) call BIOS

PB2BASE Is a macro for computing the base of a segment a16-bit value given a 32-bit linear address

PB2OFF Is a macro for computing the offset with respect to thebase of a segment a 16-bit value given a 32-bit linearaddress

Finding the Physical Memory Address with VBE (45)

Problem The parameters contained in the buffer returned byVBE function 0x01 are layed out sequentially with no holesbetween them

I Simply defining a C struct with one member perparameter with an appropriate type is not enough

I C compilers layout the members of a struct in order andplace them in memory positions whose address isaligned according to their type

Solution Use GCCrsquos __attribute__((packed))I In principle this should be handled by thepragma pack directives but it is not supported by thisversion of GCC

Note that this attribute must appear immediately after the otherwise it has no effect

I You need not do anything as Irsquove already defined thestruct in vbeh

Finding the Physical Memory Address with VBE (55)

include ltstdinthgt

typedef struct

uint16_t ModeAttributes[]uint16_t XResolutionuint16_t YResolution[]uint8_t BitsPerPixel[]uint32_t PhysBasePtr[]

__attribute__((packed)) vbe_mode_info_t

  • Graphics AdapterVideo Card
  • Video Card in Graphics Mode
  • Lab 5
  • BIOS and VBE
  • Accessing VRAM
  • VBE Function 0x01
Page 24: Computer Labs: Lab5 Video Card in Graphics Mode - 2º MIEICpfs/aulas/lcom2016/at/13vbe.pdf · Computer Labs: Lab5 Video Card in Graphics Mode 2o MIEIC Pedro F. Souto (pfs@fe.up.pt)

Virtual and Physical Address Spaces

Issue Most computer architectures support a virtual addressspace that is decoupled from the physical address space

I Processes can access (physical) memory using alogical address that is independent of the physicaladdress (determined by the address bus decodingcircuitry)

I Most modern operating systems including Minix takeadvantage of this feature to simplify memorymanagement

Mapping Physical Memory to Virtual Address Space

I Each process has its own virtual address space whosesize is usually determined by the processor architecture(32-bit for IA-32)

I The operating system maps regions of the physicalmemory in the computer to the virtual address spaces ofthe different processes

I The details of how this is done are studied in the OperatingSystems course

Mapping VRAM in Minix (12)int rstruct mem_range mrunsigned int vram_base VRAMrsquos physical addresss unsigned int vram_size VRAMrsquos size but you can use

the frame-buffer size instead void video_mem frame-buffer VM address

Allow memory mapping

mrmr_base = (phys_bytes) vram_basemrmr_limit = mrmr_base + vram_size

if( OK = (r = sys_privctl(SELF SYS_PRIV_ADD_MEM ampmr)))panic(sys_privctl (ADD_MEM) failed dn r)

Map memory

video_mem = vm_map_phys(SELF (void )mrmr_base vram_size)

if(video_mem == MAP_FAILED)panic(couldnrsquot map video memory)

Mapping VRAM in Minix (22)

Question What is the following code about Allow memory mapping

mrmr_base = (phys_bytes) vram_basemrmr_limit = mrmr_base + vram_size

if( OK = (r = sys_privctl(SELF SYS_PRIV_ADD_MEM ampmr)))panic(sys_privctl (ADD_MEM) failed dn r)

Answer In modern operating systems user-level processescannot access directly HW resources including physicalmemory and VRAM

I Minix 3 handles this by allowing to grant privilegeduser-level processes the permissions they require toperform their tasks

Lab 5 - Part 1 Key Programming Issue

Issue Given a virtual address how can a program accessthe physical memory mapped to that virtual address

Solution Use C pointers

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Finding the Physical Memory Address with VBE (15)

I VBE Function 01h - Return VBE Mode InformationInput

AX = 4F01h Return VBE Mode InformationCX = Mode numberESDI = Pointer to ModeInfoBlock structure

OuputAX = VBE return status

I The ModeInfoBlock includes among other information1 The mode attributes which comprise a set of bits that

describe some general characteristics of the modeincluding whether

I it is supported by the adapterI the linear frame buffer is available

2 The screen resolution of the mode3 The physical address of the linear frame buffer

Finding the Physical Memory Address with VBE (25)

ProblemI The ModeInfoBlock structure must be accessible both in

protected mode and in real modeI VBE Function 01h is a real mode functionI Real mode addresses are only 20-bit long (must be in the

lower 1MiB)

SolutionI Use liblma library

I Provides a simple interface for applicationslm_init()lm_alloc()lm_free()

I Hides some non-documented functions provided by Minix 3I The mmap_t (already used in Lab 1) includes both

I The physical address for use by VBEI The virtual address for use in Minix 3

Finding the Physical Memory Address with VBE (35)

phys_bytes bufstruct reg86u r

[]

ruwax = 0x4F01 VBE get mode info translate the buffer linear address to a far pointer ruwes = PB2BASE(buf) set a segment base ruwdi = PB2OFF(buf) set the offset accordingly ruwcx = moderubintno = 0x10if( sys_int86(ampr) = OK ) call BIOS

PB2BASE Is a macro for computing the base of a segment a16-bit value given a 32-bit linear address

PB2OFF Is a macro for computing the offset with respect to thebase of a segment a 16-bit value given a 32-bit linearaddress

Finding the Physical Memory Address with VBE (45)

Problem The parameters contained in the buffer returned byVBE function 0x01 are layed out sequentially with no holesbetween them

I Simply defining a C struct with one member perparameter with an appropriate type is not enough

I C compilers layout the members of a struct in order andplace them in memory positions whose address isaligned according to their type

Solution Use GCCrsquos __attribute__((packed))I In principle this should be handled by thepragma pack directives but it is not supported by thisversion of GCC

Note that this attribute must appear immediately after the otherwise it has no effect

I You need not do anything as Irsquove already defined thestruct in vbeh

Finding the Physical Memory Address with VBE (55)

include ltstdinthgt

typedef struct

uint16_t ModeAttributes[]uint16_t XResolutionuint16_t YResolution[]uint8_t BitsPerPixel[]uint32_t PhysBasePtr[]

__attribute__((packed)) vbe_mode_info_t

  • Graphics AdapterVideo Card
  • Video Card in Graphics Mode
  • Lab 5
  • BIOS and VBE
  • Accessing VRAM
  • VBE Function 0x01
Page 25: Computer Labs: Lab5 Video Card in Graphics Mode - 2º MIEICpfs/aulas/lcom2016/at/13vbe.pdf · Computer Labs: Lab5 Video Card in Graphics Mode 2o MIEIC Pedro F. Souto (pfs@fe.up.pt)

Mapping Physical Memory to Virtual Address Space

I Each process has its own virtual address space whosesize is usually determined by the processor architecture(32-bit for IA-32)

I The operating system maps regions of the physicalmemory in the computer to the virtual address spaces ofthe different processes

I The details of how this is done are studied in the OperatingSystems course

Mapping VRAM in Minix (12)int rstruct mem_range mrunsigned int vram_base VRAMrsquos physical addresss unsigned int vram_size VRAMrsquos size but you can use

the frame-buffer size instead void video_mem frame-buffer VM address

Allow memory mapping

mrmr_base = (phys_bytes) vram_basemrmr_limit = mrmr_base + vram_size

if( OK = (r = sys_privctl(SELF SYS_PRIV_ADD_MEM ampmr)))panic(sys_privctl (ADD_MEM) failed dn r)

Map memory

video_mem = vm_map_phys(SELF (void )mrmr_base vram_size)

if(video_mem == MAP_FAILED)panic(couldnrsquot map video memory)

Mapping VRAM in Minix (22)

Question What is the following code about Allow memory mapping

mrmr_base = (phys_bytes) vram_basemrmr_limit = mrmr_base + vram_size

if( OK = (r = sys_privctl(SELF SYS_PRIV_ADD_MEM ampmr)))panic(sys_privctl (ADD_MEM) failed dn r)

Answer In modern operating systems user-level processescannot access directly HW resources including physicalmemory and VRAM

I Minix 3 handles this by allowing to grant privilegeduser-level processes the permissions they require toperform their tasks

Lab 5 - Part 1 Key Programming Issue

Issue Given a virtual address how can a program accessthe physical memory mapped to that virtual address

Solution Use C pointers

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Finding the Physical Memory Address with VBE (15)

I VBE Function 01h - Return VBE Mode InformationInput

AX = 4F01h Return VBE Mode InformationCX = Mode numberESDI = Pointer to ModeInfoBlock structure

OuputAX = VBE return status

I The ModeInfoBlock includes among other information1 The mode attributes which comprise a set of bits that

describe some general characteristics of the modeincluding whether

I it is supported by the adapterI the linear frame buffer is available

2 The screen resolution of the mode3 The physical address of the linear frame buffer

Finding the Physical Memory Address with VBE (25)

ProblemI The ModeInfoBlock structure must be accessible both in

protected mode and in real modeI VBE Function 01h is a real mode functionI Real mode addresses are only 20-bit long (must be in the

lower 1MiB)

SolutionI Use liblma library

I Provides a simple interface for applicationslm_init()lm_alloc()lm_free()

I Hides some non-documented functions provided by Minix 3I The mmap_t (already used in Lab 1) includes both

I The physical address for use by VBEI The virtual address for use in Minix 3

Finding the Physical Memory Address with VBE (35)

phys_bytes bufstruct reg86u r

[]

ruwax = 0x4F01 VBE get mode info translate the buffer linear address to a far pointer ruwes = PB2BASE(buf) set a segment base ruwdi = PB2OFF(buf) set the offset accordingly ruwcx = moderubintno = 0x10if( sys_int86(ampr) = OK ) call BIOS

PB2BASE Is a macro for computing the base of a segment a16-bit value given a 32-bit linear address

PB2OFF Is a macro for computing the offset with respect to thebase of a segment a 16-bit value given a 32-bit linearaddress

Finding the Physical Memory Address with VBE (45)

Problem The parameters contained in the buffer returned byVBE function 0x01 are layed out sequentially with no holesbetween them

I Simply defining a C struct with one member perparameter with an appropriate type is not enough

I C compilers layout the members of a struct in order andplace them in memory positions whose address isaligned according to their type

Solution Use GCCrsquos __attribute__((packed))I In principle this should be handled by thepragma pack directives but it is not supported by thisversion of GCC

Note that this attribute must appear immediately after the otherwise it has no effect

I You need not do anything as Irsquove already defined thestruct in vbeh

Finding the Physical Memory Address with VBE (55)

include ltstdinthgt

typedef struct

uint16_t ModeAttributes[]uint16_t XResolutionuint16_t YResolution[]uint8_t BitsPerPixel[]uint32_t PhysBasePtr[]

__attribute__((packed)) vbe_mode_info_t

  • Graphics AdapterVideo Card
  • Video Card in Graphics Mode
  • Lab 5
  • BIOS and VBE
  • Accessing VRAM
  • VBE Function 0x01
Page 26: Computer Labs: Lab5 Video Card in Graphics Mode - 2º MIEICpfs/aulas/lcom2016/at/13vbe.pdf · Computer Labs: Lab5 Video Card in Graphics Mode 2o MIEIC Pedro F. Souto (pfs@fe.up.pt)

Mapping VRAM in Minix (12)int rstruct mem_range mrunsigned int vram_base VRAMrsquos physical addresss unsigned int vram_size VRAMrsquos size but you can use

the frame-buffer size instead void video_mem frame-buffer VM address

Allow memory mapping

mrmr_base = (phys_bytes) vram_basemrmr_limit = mrmr_base + vram_size

if( OK = (r = sys_privctl(SELF SYS_PRIV_ADD_MEM ampmr)))panic(sys_privctl (ADD_MEM) failed dn r)

Map memory

video_mem = vm_map_phys(SELF (void )mrmr_base vram_size)

if(video_mem == MAP_FAILED)panic(couldnrsquot map video memory)

Mapping VRAM in Minix (22)

Question What is the following code about Allow memory mapping

mrmr_base = (phys_bytes) vram_basemrmr_limit = mrmr_base + vram_size

if( OK = (r = sys_privctl(SELF SYS_PRIV_ADD_MEM ampmr)))panic(sys_privctl (ADD_MEM) failed dn r)

Answer In modern operating systems user-level processescannot access directly HW resources including physicalmemory and VRAM

I Minix 3 handles this by allowing to grant privilegeduser-level processes the permissions they require toperform their tasks

Lab 5 - Part 1 Key Programming Issue

Issue Given a virtual address how can a program accessthe physical memory mapped to that virtual address

Solution Use C pointers

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Finding the Physical Memory Address with VBE (15)

I VBE Function 01h - Return VBE Mode InformationInput

AX = 4F01h Return VBE Mode InformationCX = Mode numberESDI = Pointer to ModeInfoBlock structure

OuputAX = VBE return status

I The ModeInfoBlock includes among other information1 The mode attributes which comprise a set of bits that

describe some general characteristics of the modeincluding whether

I it is supported by the adapterI the linear frame buffer is available

2 The screen resolution of the mode3 The physical address of the linear frame buffer

Finding the Physical Memory Address with VBE (25)

ProblemI The ModeInfoBlock structure must be accessible both in

protected mode and in real modeI VBE Function 01h is a real mode functionI Real mode addresses are only 20-bit long (must be in the

lower 1MiB)

SolutionI Use liblma library

I Provides a simple interface for applicationslm_init()lm_alloc()lm_free()

I Hides some non-documented functions provided by Minix 3I The mmap_t (already used in Lab 1) includes both

I The physical address for use by VBEI The virtual address for use in Minix 3

Finding the Physical Memory Address with VBE (35)

phys_bytes bufstruct reg86u r

[]

ruwax = 0x4F01 VBE get mode info translate the buffer linear address to a far pointer ruwes = PB2BASE(buf) set a segment base ruwdi = PB2OFF(buf) set the offset accordingly ruwcx = moderubintno = 0x10if( sys_int86(ampr) = OK ) call BIOS

PB2BASE Is a macro for computing the base of a segment a16-bit value given a 32-bit linear address

PB2OFF Is a macro for computing the offset with respect to thebase of a segment a 16-bit value given a 32-bit linearaddress

Finding the Physical Memory Address with VBE (45)

Problem The parameters contained in the buffer returned byVBE function 0x01 are layed out sequentially with no holesbetween them

I Simply defining a C struct with one member perparameter with an appropriate type is not enough

I C compilers layout the members of a struct in order andplace them in memory positions whose address isaligned according to their type

Solution Use GCCrsquos __attribute__((packed))I In principle this should be handled by thepragma pack directives but it is not supported by thisversion of GCC

Note that this attribute must appear immediately after the otherwise it has no effect

I You need not do anything as Irsquove already defined thestruct in vbeh

Finding the Physical Memory Address with VBE (55)

include ltstdinthgt

typedef struct

uint16_t ModeAttributes[]uint16_t XResolutionuint16_t YResolution[]uint8_t BitsPerPixel[]uint32_t PhysBasePtr[]

__attribute__((packed)) vbe_mode_info_t

  • Graphics AdapterVideo Card
  • Video Card in Graphics Mode
  • Lab 5
  • BIOS and VBE
  • Accessing VRAM
  • VBE Function 0x01
Page 27: Computer Labs: Lab5 Video Card in Graphics Mode - 2º MIEICpfs/aulas/lcom2016/at/13vbe.pdf · Computer Labs: Lab5 Video Card in Graphics Mode 2o MIEIC Pedro F. Souto (pfs@fe.up.pt)

Mapping VRAM in Minix (22)

Question What is the following code about Allow memory mapping

mrmr_base = (phys_bytes) vram_basemrmr_limit = mrmr_base + vram_size

if( OK = (r = sys_privctl(SELF SYS_PRIV_ADD_MEM ampmr)))panic(sys_privctl (ADD_MEM) failed dn r)

Answer In modern operating systems user-level processescannot access directly HW resources including physicalmemory and VRAM

I Minix 3 handles this by allowing to grant privilegeduser-level processes the permissions they require toperform their tasks

Lab 5 - Part 1 Key Programming Issue

Issue Given a virtual address how can a program accessthe physical memory mapped to that virtual address

Solution Use C pointers

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Finding the Physical Memory Address with VBE (15)

I VBE Function 01h - Return VBE Mode InformationInput

AX = 4F01h Return VBE Mode InformationCX = Mode numberESDI = Pointer to ModeInfoBlock structure

OuputAX = VBE return status

I The ModeInfoBlock includes among other information1 The mode attributes which comprise a set of bits that

describe some general characteristics of the modeincluding whether

I it is supported by the adapterI the linear frame buffer is available

2 The screen resolution of the mode3 The physical address of the linear frame buffer

Finding the Physical Memory Address with VBE (25)

ProblemI The ModeInfoBlock structure must be accessible both in

protected mode and in real modeI VBE Function 01h is a real mode functionI Real mode addresses are only 20-bit long (must be in the

lower 1MiB)

SolutionI Use liblma library

I Provides a simple interface for applicationslm_init()lm_alloc()lm_free()

I Hides some non-documented functions provided by Minix 3I The mmap_t (already used in Lab 1) includes both

I The physical address for use by VBEI The virtual address for use in Minix 3

Finding the Physical Memory Address with VBE (35)

phys_bytes bufstruct reg86u r

[]

ruwax = 0x4F01 VBE get mode info translate the buffer linear address to a far pointer ruwes = PB2BASE(buf) set a segment base ruwdi = PB2OFF(buf) set the offset accordingly ruwcx = moderubintno = 0x10if( sys_int86(ampr) = OK ) call BIOS

PB2BASE Is a macro for computing the base of a segment a16-bit value given a 32-bit linear address

PB2OFF Is a macro for computing the offset with respect to thebase of a segment a 16-bit value given a 32-bit linearaddress

Finding the Physical Memory Address with VBE (45)

Problem The parameters contained in the buffer returned byVBE function 0x01 are layed out sequentially with no holesbetween them

I Simply defining a C struct with one member perparameter with an appropriate type is not enough

I C compilers layout the members of a struct in order andplace them in memory positions whose address isaligned according to their type

Solution Use GCCrsquos __attribute__((packed))I In principle this should be handled by thepragma pack directives but it is not supported by thisversion of GCC

Note that this attribute must appear immediately after the otherwise it has no effect

I You need not do anything as Irsquove already defined thestruct in vbeh

Finding the Physical Memory Address with VBE (55)

include ltstdinthgt

typedef struct

uint16_t ModeAttributes[]uint16_t XResolutionuint16_t YResolution[]uint8_t BitsPerPixel[]uint32_t PhysBasePtr[]

__attribute__((packed)) vbe_mode_info_t

  • Graphics AdapterVideo Card
  • Video Card in Graphics Mode
  • Lab 5
  • BIOS and VBE
  • Accessing VRAM
  • VBE Function 0x01
Page 28: Computer Labs: Lab5 Video Card in Graphics Mode - 2º MIEICpfs/aulas/lcom2016/at/13vbe.pdf · Computer Labs: Lab5 Video Card in Graphics Mode 2o MIEIC Pedro F. Souto (pfs@fe.up.pt)

Lab 5 - Part 1 Key Programming Issue

Issue Given a virtual address how can a program accessthe physical memory mapped to that virtual address

Solution Use C pointers

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Finding the Physical Memory Address with VBE (15)

I VBE Function 01h - Return VBE Mode InformationInput

AX = 4F01h Return VBE Mode InformationCX = Mode numberESDI = Pointer to ModeInfoBlock structure

OuputAX = VBE return status

I The ModeInfoBlock includes among other information1 The mode attributes which comprise a set of bits that

describe some general characteristics of the modeincluding whether

I it is supported by the adapterI the linear frame buffer is available

2 The screen resolution of the mode3 The physical address of the linear frame buffer

Finding the Physical Memory Address with VBE (25)

ProblemI The ModeInfoBlock structure must be accessible both in

protected mode and in real modeI VBE Function 01h is a real mode functionI Real mode addresses are only 20-bit long (must be in the

lower 1MiB)

SolutionI Use liblma library

I Provides a simple interface for applicationslm_init()lm_alloc()lm_free()

I Hides some non-documented functions provided by Minix 3I The mmap_t (already used in Lab 1) includes both

I The physical address for use by VBEI The virtual address for use in Minix 3

Finding the Physical Memory Address with VBE (35)

phys_bytes bufstruct reg86u r

[]

ruwax = 0x4F01 VBE get mode info translate the buffer linear address to a far pointer ruwes = PB2BASE(buf) set a segment base ruwdi = PB2OFF(buf) set the offset accordingly ruwcx = moderubintno = 0x10if( sys_int86(ampr) = OK ) call BIOS

PB2BASE Is a macro for computing the base of a segment a16-bit value given a 32-bit linear address

PB2OFF Is a macro for computing the offset with respect to thebase of a segment a 16-bit value given a 32-bit linearaddress

Finding the Physical Memory Address with VBE (45)

Problem The parameters contained in the buffer returned byVBE function 0x01 are layed out sequentially with no holesbetween them

I Simply defining a C struct with one member perparameter with an appropriate type is not enough

I C compilers layout the members of a struct in order andplace them in memory positions whose address isaligned according to their type

Solution Use GCCrsquos __attribute__((packed))I In principle this should be handled by thepragma pack directives but it is not supported by thisversion of GCC

Note that this attribute must appear immediately after the otherwise it has no effect

I You need not do anything as Irsquove already defined thestruct in vbeh

Finding the Physical Memory Address with VBE (55)

include ltstdinthgt

typedef struct

uint16_t ModeAttributes[]uint16_t XResolutionuint16_t YResolution[]uint8_t BitsPerPixel[]uint32_t PhysBasePtr[]

__attribute__((packed)) vbe_mode_info_t

  • Graphics AdapterVideo Card
  • Video Card in Graphics Mode
  • Lab 5
  • BIOS and VBE
  • Accessing VRAM
  • VBE Function 0x01
Page 29: Computer Labs: Lab5 Video Card in Graphics Mode - 2º MIEICpfs/aulas/lcom2016/at/13vbe.pdf · Computer Labs: Lab5 Video Card in Graphics Mode 2o MIEIC Pedro F. Souto (pfs@fe.up.pt)

Contents

Graphics AdapterVideo Card

Video Card in Graphics Mode

Lab 5

BIOS and VBE

Accessing VRAM

VBE Function 0x01

Finding the Physical Memory Address with VBE (15)

I VBE Function 01h - Return VBE Mode InformationInput

AX = 4F01h Return VBE Mode InformationCX = Mode numberESDI = Pointer to ModeInfoBlock structure

OuputAX = VBE return status

I The ModeInfoBlock includes among other information1 The mode attributes which comprise a set of bits that

describe some general characteristics of the modeincluding whether

I it is supported by the adapterI the linear frame buffer is available

2 The screen resolution of the mode3 The physical address of the linear frame buffer

Finding the Physical Memory Address with VBE (25)

ProblemI The ModeInfoBlock structure must be accessible both in

protected mode and in real modeI VBE Function 01h is a real mode functionI Real mode addresses are only 20-bit long (must be in the

lower 1MiB)

SolutionI Use liblma library

I Provides a simple interface for applicationslm_init()lm_alloc()lm_free()

I Hides some non-documented functions provided by Minix 3I The mmap_t (already used in Lab 1) includes both

I The physical address for use by VBEI The virtual address for use in Minix 3

Finding the Physical Memory Address with VBE (35)

phys_bytes bufstruct reg86u r

[]

ruwax = 0x4F01 VBE get mode info translate the buffer linear address to a far pointer ruwes = PB2BASE(buf) set a segment base ruwdi = PB2OFF(buf) set the offset accordingly ruwcx = moderubintno = 0x10if( sys_int86(ampr) = OK ) call BIOS

PB2BASE Is a macro for computing the base of a segment a16-bit value given a 32-bit linear address

PB2OFF Is a macro for computing the offset with respect to thebase of a segment a 16-bit value given a 32-bit linearaddress

Finding the Physical Memory Address with VBE (45)

Problem The parameters contained in the buffer returned byVBE function 0x01 are layed out sequentially with no holesbetween them

I Simply defining a C struct with one member perparameter with an appropriate type is not enough

I C compilers layout the members of a struct in order andplace them in memory positions whose address isaligned according to their type

Solution Use GCCrsquos __attribute__((packed))I In principle this should be handled by thepragma pack directives but it is not supported by thisversion of GCC

Note that this attribute must appear immediately after the otherwise it has no effect

I You need not do anything as Irsquove already defined thestruct in vbeh

Finding the Physical Memory Address with VBE (55)

include ltstdinthgt

typedef struct

uint16_t ModeAttributes[]uint16_t XResolutionuint16_t YResolution[]uint8_t BitsPerPixel[]uint32_t PhysBasePtr[]

__attribute__((packed)) vbe_mode_info_t

  • Graphics AdapterVideo Card
  • Video Card in Graphics Mode
  • Lab 5
  • BIOS and VBE
  • Accessing VRAM
  • VBE Function 0x01
Page 30: Computer Labs: Lab5 Video Card in Graphics Mode - 2º MIEICpfs/aulas/lcom2016/at/13vbe.pdf · Computer Labs: Lab5 Video Card in Graphics Mode 2o MIEIC Pedro F. Souto (pfs@fe.up.pt)

Finding the Physical Memory Address with VBE (15)

I VBE Function 01h - Return VBE Mode InformationInput

AX = 4F01h Return VBE Mode InformationCX = Mode numberESDI = Pointer to ModeInfoBlock structure

OuputAX = VBE return status

I The ModeInfoBlock includes among other information1 The mode attributes which comprise a set of bits that

describe some general characteristics of the modeincluding whether

I it is supported by the adapterI the linear frame buffer is available

2 The screen resolution of the mode3 The physical address of the linear frame buffer

Finding the Physical Memory Address with VBE (25)

ProblemI The ModeInfoBlock structure must be accessible both in

protected mode and in real modeI VBE Function 01h is a real mode functionI Real mode addresses are only 20-bit long (must be in the

lower 1MiB)

SolutionI Use liblma library

I Provides a simple interface for applicationslm_init()lm_alloc()lm_free()

I Hides some non-documented functions provided by Minix 3I The mmap_t (already used in Lab 1) includes both

I The physical address for use by VBEI The virtual address for use in Minix 3

Finding the Physical Memory Address with VBE (35)

phys_bytes bufstruct reg86u r

[]

ruwax = 0x4F01 VBE get mode info translate the buffer linear address to a far pointer ruwes = PB2BASE(buf) set a segment base ruwdi = PB2OFF(buf) set the offset accordingly ruwcx = moderubintno = 0x10if( sys_int86(ampr) = OK ) call BIOS

PB2BASE Is a macro for computing the base of a segment a16-bit value given a 32-bit linear address

PB2OFF Is a macro for computing the offset with respect to thebase of a segment a 16-bit value given a 32-bit linearaddress

Finding the Physical Memory Address with VBE (45)

Problem The parameters contained in the buffer returned byVBE function 0x01 are layed out sequentially with no holesbetween them

I Simply defining a C struct with one member perparameter with an appropriate type is not enough

I C compilers layout the members of a struct in order andplace them in memory positions whose address isaligned according to their type

Solution Use GCCrsquos __attribute__((packed))I In principle this should be handled by thepragma pack directives but it is not supported by thisversion of GCC

Note that this attribute must appear immediately after the otherwise it has no effect

I You need not do anything as Irsquove already defined thestruct in vbeh

Finding the Physical Memory Address with VBE (55)

include ltstdinthgt

typedef struct

uint16_t ModeAttributes[]uint16_t XResolutionuint16_t YResolution[]uint8_t BitsPerPixel[]uint32_t PhysBasePtr[]

__attribute__((packed)) vbe_mode_info_t

  • Graphics AdapterVideo Card
  • Video Card in Graphics Mode
  • Lab 5
  • BIOS and VBE
  • Accessing VRAM
  • VBE Function 0x01
Page 31: Computer Labs: Lab5 Video Card in Graphics Mode - 2º MIEICpfs/aulas/lcom2016/at/13vbe.pdf · Computer Labs: Lab5 Video Card in Graphics Mode 2o MIEIC Pedro F. Souto (pfs@fe.up.pt)

Finding the Physical Memory Address with VBE (25)

ProblemI The ModeInfoBlock structure must be accessible both in

protected mode and in real modeI VBE Function 01h is a real mode functionI Real mode addresses are only 20-bit long (must be in the

lower 1MiB)

SolutionI Use liblma library

I Provides a simple interface for applicationslm_init()lm_alloc()lm_free()

I Hides some non-documented functions provided by Minix 3I The mmap_t (already used in Lab 1) includes both

I The physical address for use by VBEI The virtual address for use in Minix 3

Finding the Physical Memory Address with VBE (35)

phys_bytes bufstruct reg86u r

[]

ruwax = 0x4F01 VBE get mode info translate the buffer linear address to a far pointer ruwes = PB2BASE(buf) set a segment base ruwdi = PB2OFF(buf) set the offset accordingly ruwcx = moderubintno = 0x10if( sys_int86(ampr) = OK ) call BIOS

PB2BASE Is a macro for computing the base of a segment a16-bit value given a 32-bit linear address

PB2OFF Is a macro for computing the offset with respect to thebase of a segment a 16-bit value given a 32-bit linearaddress

Finding the Physical Memory Address with VBE (45)

Problem The parameters contained in the buffer returned byVBE function 0x01 are layed out sequentially with no holesbetween them

I Simply defining a C struct with one member perparameter with an appropriate type is not enough

I C compilers layout the members of a struct in order andplace them in memory positions whose address isaligned according to their type

Solution Use GCCrsquos __attribute__((packed))I In principle this should be handled by thepragma pack directives but it is not supported by thisversion of GCC

Note that this attribute must appear immediately after the otherwise it has no effect

I You need not do anything as Irsquove already defined thestruct in vbeh

Finding the Physical Memory Address with VBE (55)

include ltstdinthgt

typedef struct

uint16_t ModeAttributes[]uint16_t XResolutionuint16_t YResolution[]uint8_t BitsPerPixel[]uint32_t PhysBasePtr[]

__attribute__((packed)) vbe_mode_info_t

  • Graphics AdapterVideo Card
  • Video Card in Graphics Mode
  • Lab 5
  • BIOS and VBE
  • Accessing VRAM
  • VBE Function 0x01
Page 32: Computer Labs: Lab5 Video Card in Graphics Mode - 2º MIEICpfs/aulas/lcom2016/at/13vbe.pdf · Computer Labs: Lab5 Video Card in Graphics Mode 2o MIEIC Pedro F. Souto (pfs@fe.up.pt)

Finding the Physical Memory Address with VBE (35)

phys_bytes bufstruct reg86u r

[]

ruwax = 0x4F01 VBE get mode info translate the buffer linear address to a far pointer ruwes = PB2BASE(buf) set a segment base ruwdi = PB2OFF(buf) set the offset accordingly ruwcx = moderubintno = 0x10if( sys_int86(ampr) = OK ) call BIOS

PB2BASE Is a macro for computing the base of a segment a16-bit value given a 32-bit linear address

PB2OFF Is a macro for computing the offset with respect to thebase of a segment a 16-bit value given a 32-bit linearaddress

Finding the Physical Memory Address with VBE (45)

Problem The parameters contained in the buffer returned byVBE function 0x01 are layed out sequentially with no holesbetween them

I Simply defining a C struct with one member perparameter with an appropriate type is not enough

I C compilers layout the members of a struct in order andplace them in memory positions whose address isaligned according to their type

Solution Use GCCrsquos __attribute__((packed))I In principle this should be handled by thepragma pack directives but it is not supported by thisversion of GCC

Note that this attribute must appear immediately after the otherwise it has no effect

I You need not do anything as Irsquove already defined thestruct in vbeh

Finding the Physical Memory Address with VBE (55)

include ltstdinthgt

typedef struct

uint16_t ModeAttributes[]uint16_t XResolutionuint16_t YResolution[]uint8_t BitsPerPixel[]uint32_t PhysBasePtr[]

__attribute__((packed)) vbe_mode_info_t

  • Graphics AdapterVideo Card
  • Video Card in Graphics Mode
  • Lab 5
  • BIOS and VBE
  • Accessing VRAM
  • VBE Function 0x01
Page 33: Computer Labs: Lab5 Video Card in Graphics Mode - 2º MIEICpfs/aulas/lcom2016/at/13vbe.pdf · Computer Labs: Lab5 Video Card in Graphics Mode 2o MIEIC Pedro F. Souto (pfs@fe.up.pt)

Finding the Physical Memory Address with VBE (45)

Problem The parameters contained in the buffer returned byVBE function 0x01 are layed out sequentially with no holesbetween them

I Simply defining a C struct with one member perparameter with an appropriate type is not enough

I C compilers layout the members of a struct in order andplace them in memory positions whose address isaligned according to their type

Solution Use GCCrsquos __attribute__((packed))I In principle this should be handled by thepragma pack directives but it is not supported by thisversion of GCC

Note that this attribute must appear immediately after the otherwise it has no effect

I You need not do anything as Irsquove already defined thestruct in vbeh

Finding the Physical Memory Address with VBE (55)

include ltstdinthgt

typedef struct

uint16_t ModeAttributes[]uint16_t XResolutionuint16_t YResolution[]uint8_t BitsPerPixel[]uint32_t PhysBasePtr[]

__attribute__((packed)) vbe_mode_info_t

  • Graphics AdapterVideo Card
  • Video Card in Graphics Mode
  • Lab 5
  • BIOS and VBE
  • Accessing VRAM
  • VBE Function 0x01
Page 34: Computer Labs: Lab5 Video Card in Graphics Mode - 2º MIEICpfs/aulas/lcom2016/at/13vbe.pdf · Computer Labs: Lab5 Video Card in Graphics Mode 2o MIEIC Pedro F. Souto (pfs@fe.up.pt)

Finding the Physical Memory Address with VBE (55)

include ltstdinthgt

typedef struct

uint16_t ModeAttributes[]uint16_t XResolutionuint16_t YResolution[]uint8_t BitsPerPixel[]uint32_t PhysBasePtr[]

__attribute__((packed)) vbe_mode_info_t

  • Graphics AdapterVideo Card
  • Video Card in Graphics Mode
  • Lab 5
  • BIOS and VBE
  • Accessing VRAM
  • VBE Function 0x01