PROTECTION

P DPL 5 E C R

A

P

DPL

5

E

ED W A

1

0

1

0

I 1

01

1

0

0

 

 

 

 

7

 

 

o

7

 

 

 

o

Readable Code Segment

 

 

Writable Code Segment

G3010B

Figure 7-8. Access Byte Examples

Table 7-2. Allowed Segment Types in Segment Registers

(

 

 

Allowed Segnlent Types

 

Segment Register

Read Only

Read-Write

Execute Only

Execute'Read

 

 

Data Segment

Data Segment

Code Segment

Code Segment

OS

Yes

Yes

No

Yes

ES

Yes

Yes

No

Yes

SS

No

Yes

No

No

CS

No

No

Yes

Yes

NOTE

The Intel reserved bytes in the segment descriptor must be set to 0 for compatibility with the 80386.

7.4.1Data Accesses

Data may be accessed in data segments or readable code segments. When DS or ES is ioaded with a new selector, e.g., by an LDS, LES, or MOV to ES, SS, or DS instruction, the bits in the access byte are checked to verify legitimate descriptor type and access (see table 7-2). If any test fails, an error code is pushed onto the stack identifying the selector involved (see figure 7-5 for the error code format).

A privilege check is made when the segment register is loaded. In general, a data segment's DPL must be numerically greater than or equal to the CPL. The DPL of a descriptor loaded into the SS must eq'1!"J the C.PL Conforming code segments are an exception to privilege checking rules (see section 11. 2).

Once the segment descriptor and selector are loaded, the offset of subsequent accesses within the segment are checked against the limit given in the segment descriptor. Violating the segment size limit causes a General Protection exception with an error code of O.

A normal data segment is addressed with offset values ranging from 0 to the size of the segment. When the ED bit of the access rights byte in the segment descriptor is 0, the allowed range of offsets is OOOOH to the limit. If limit is OFFFFH, the data segment contains 65,536 bytes.

7-12

Page 138
Image 138
Intel 80287, 80286 manual Data Accesses