Knowledge (XXG)

x86 memory segmentation

Source 📝

379:, from the beginning of the linear (flat) address space. That is, at 16 byte intervals. Since all segments are 64 KB long, this explains how overlap can occur between segments and why any location in the linear memory address space can be accessed with many segment:offset pairs. The actual location of the beginning of a segment in the linear address space can be calculated with segment×16. A segment value of 0Ch (12) would give a linear address at C0h (192) in the linear address space. The address offset can then be added to this number. 0Ch:0Fh (12:15) would be C0h+0Fh=CFh (192+15=207), CFh (207) being the linear address. Such address translations are carried out by the segmentation unit of the CPU. The last segment, FFFFh (65535), begins at linear address FFFF0h (1048560), 16 bytes before the end of the 20 bit address space, and thus, can access, with an offset of up to 65,536 bytes, up to 65,520 (65536−16) bytes past the end of the 20 bit 8088 address space. On the 8088, these address accesses were wrapped around to the beginning of the address space such that 65535:16 would access address 0 and 65533:1000 would access address 952 of the linear address space. The use of this feature by programmers led to the 627:
segmentation unit is otherwise unchanged. The paging unit may be enabled or disabled; if disabled, operation is the same as on the 80286. If the paging unit is enabled, addresses in a segment are now virtual addresses, rather than physical addresses as they were on the 80286. That is, the segment starting address, the offset, and the final 32-bit address the segmentation unit derived by adding the two are all virtual (or logical) addresses when the paging unit is enabled. When the segmentation unit generates and validates these 32-bit virtual addresses, the enabled paging unit finally translates these virtual addresses into physical addresses. The physical addresses are 32-bit on the
548:
than 64k in size, however as the Segment Limit field is only 24-bit long, the maximum segment size that can be created is 16MB (although paging can be used to allocate more memory, no individual segment may exceed 16MB). This method was commonly used on Windows 3.x applications to produce a flat memory space, although as the OS itself was still 16-bit, API calls could not be made with 32-bit instructions. Thus, it was still necessary to place all code that performs API calls in 64k segments.
224: 471: 1529: 1519: 1509: 1499: 1489: 418: 33: 603:. Otherwise, address translation continues. The processor then takes the 32-bit or 16-bit offset and compares it against the segment limit specified in the segment descriptor. If it is larger, a GP fault is generated. Otherwise, the processor adds the 24-bit segment base, specified in descriptor, to the offset, creating a linear physical address. 1010:
with the base address, segment limit, and access control information from the segment descriptor pointed to by the segment selector. The information cached in the segment register (visible and hidden) allows the processor to translate addresses without taking extra bus cycles to read the base address and limit from the segment descriptor.
547:
286 protected mode was seldom used as it would have excluded the large body of users with 8086/88 machines. Moreover, it still necessitated dividing memory into 64k segments like was done in real mode. This limitation can be worked around on 32-bit CPUs which permit the use of memory pointers greater
250:
The 16-bit segment selector in the segment register is interpreted as the most significant 16 bits of a linear 20-bit address, called a segment address, of which the remaining four least significant bits are all zeros. The segment address is always added to a 16-bit offset in the instruction to yield
776:
specified by the segment selector held in the DS register. These may also come from the extra segment specified by the segment selector held in the ES register, if a segment-override prefix precedes the instruction that makes the memory reference. Most, but not all, instructions that use
595:
where CPL is the current privilege level (found in the lower 2 bits of the CS register), RPL is the requested privilege level from the segment selector, and DPL is the descriptor privilege level of the segment (found in the descriptor). All privilege levels are integers in the range 0–3, where
1009:
Every segment register has a “visible” part and a “hidden” part. (The hidden part is sometimes referred to as a “descriptor cache” or a “shadow register.”) When a segment selector is loaded into the visible part of a segment register, the processor also loads the hidden part of the segment register
386:
In 16-bit real mode, enabling applications to make use of multiple memory segments (in order to access more memory than available in any one 64K-segment) is quite complex, but was viewed as a necessary evil for all but the smallest tools (which could do with less memory). The root of the problem is
349:
be 64 KB long. Because there is no protection or privilege limitation in real mode, even if a segment could be defined to be smaller than 64 KB, it would still be entirely up to the programs to coordinate and keep within the bounds of their segments, as any program can always access any
658:
architecture does not use segmentation in long mode (64-bit mode). Four of the segment registers, CS, SS, DS, and ES, are forced to base address 0, and the limit to 2. The segment registers FS and GS can still have a nonzero base address. This allows operating systems to use these segments for
626:
unit has been added as a second layer of address translation between the segmentation unit and the physical bus. Also, importantly, address offsets are 32-bit (instead of 16-bit), and the segment base in each segment descriptor is also 32-bit (instead of 24-bit). The general operation of the
210:
The choice of segment is normally defaulted by the processor according to the function being executed. Instructions are always fetched from the code segment. Any stack push or pop or any data reference referring to the stack uses the stack segment. All other references to data use the data
503:
containing 24-bit base addresses to which the offset is added. To support old software, the processor starts up in "real mode", a mode in which it uses the segmented addressing model of the 8086. There is a small difference though: the resulting physical address is no longer truncated to
528:). With the addition of the HMA, the total address space is approximately 1.06 MB. Though the 80286 does not truncate real-mode addresses to 20 bits, a system containing an 80286 can do so with hardware external to the processor, by gating off the 21st address line, the 350:
memory (since it can arbitrarily set segment selectors to change segment addresses with absolutely no supervision). Therefore, real mode can just as well be imagined as having a variable length for each segment, in the range 1 to 65,536 bytes, that is just not enforced by the CPU.
641:
A 386 CPU can be put back into real mode by clearing a bit in the CR0 control register, however this is a privileged operation in order to enforce security and robustness. By way of comparison, a 286 could only be returned to real mode by forcing a processor reset, e.g. by a
336:
Because of the way the segment address and offset are added, a single linear address can be mapped to up to 2 = 4096 distinct segment:offset pairs. For example, the linear address 08124h can have the segmented addresses 06EFh:1234h, 0812h:0004h, 0000h:8124h, etc.
1058:
must be used with extreme care and has limited usefulness, because it immediately changes the effective address that will be computed from the instruction pointer to fetch the next instruction. Generally, a far jump is much more useful. The existence of
387:
that no appropriate address-arithmetic instructions suitable for flat addressing of the entire memory range are available. Flat addressing is possible by applying multiple instructions, which however leads to slower programs.
949:
selector). This is because the current privilege level (CPL) of the processor is stored in the lower 2 bits of the CS register. The only ways to raise the processor privilege level (and reload CS) are through the
567:
A logical address consists of a 16-bit segment selector (supplying 13+1 address bits) and a 16-bit offset. The segment selector must be located in one of the segment registers. That selector consists of a 2-bit Requested
340:
This could be confusing to programmers accustomed to unique addressing schemes, but it can also be used to advantage, for example when addressing multiple nested data structures. While real mode segments are always
555:
standard could feign a reset to the CPU via the standardised keyboard controller, but this was significantly sluggish. Windows 3.x worked around both of these problems by intentionally triggering a
207:, introduced in 1985, adds two additional segment registers, FS and GS, with no specific uses defined by the hardware. The way in which the segment registers are used differs between the two modes. 372:. (Both were packaged in 40-pin DIP packages; even with only 20 address lines, the address and data buses were multiplexed to fit all the address and data lines within the limited pin count.) 211:
segment. The extra segment is the default destination for string operations (for example MOVS or CMPS). FS and GS have no hardware-assigned uses. The instruction format allows an optional
263:) has a segment selector of 06EFh, representing a segment address of 06EF0h, to which the offset is added, yielding the linear address 06EF0h + 1234h = 08124h. 499:
extends the processor's address space to 2 bytes (16 megabytes), but not by adjusting the shift value. Instead, the 16-bit segment registers now contain an index into a table of
973:
instruction on the 8086 or 8088). Of course, in real mode, there are no privilege levels; all programs have absolute unchecked access to all of memory and all CPU instructions.
822:
Segmentation cannot be turned off on x86-32 processors (this is true for 64-bit mode as well, but beyond the scope of discussion), so many 32-bit operating systems simulate a
1007:"Intel 64 and IA-32 Architectures Software Developer's Manual", Volume 3, "System Programming Guide", published in 2011, Page "Vol. 3A 3-11", the book is written: " 938:
Segments can be defined to be either code, data, or system segments. Additional permission bits are present to make segments read only, read/write, execute, etc.
924:
Since the base is set to 0 in all cases and the limit 4 GiB, the segmentation unit does not affect the addresses the program issues before they arrive at the
1023: 231:
memory (click on image to enlarge). There is an overlap between segment 2 and segment 3; the bytes in the turquoise area can be used from both segment selectors.
1469: 1130: 638:
The 80386 also introduced two new general-purpose data segment registers, FS and GS, to the original set of four segment registers (CS, DS, ES, and SS).
353:(The leading zeros of the linear address, segmented addresses, and the segment and offset fields are shown here for clarity. They are usually omitted.) 435: 309:                             50: 1178: 368:). This derived directly from the hardware design of the Intel 8086 (and, subsequently, the closely related 8088), which had exactly 20 1522: 1326: 1150: 1512: 1063:
is probably an accident, as it follows a pattern of PUSH and POP instruction opcodes for the four segment registers on the 8086 and 8088.
969:(interrupt return) instructions. In real mode, code may also modify the CS register by making a far jump (or using an undocumented 1532: 97: 457: 116: 69: 404:
memory model DS=SS, so both data and stack reside in the same segment; CS points to a different code segment of up to 64 KB.
551:
Once 286 protected mode is invoked, it could not be exited except by performing a hardware reset. Machines following the rising
1349: 1123: 76: 1553: 1474: 687: 439: 54: 532:. The IBM PC AT provided the hardware to do this (for full backward compatibility with software for the original 793: 694:, which contains information about exception handling, thread-local variables, and other per-thread state. Similarly, the 559:
in the interrupt-handling mechanisms of the CPU, which would cause the CPU to drop back into real mode, nearly instantly.
928:
unit. (This, of course, refers to 80386 and later processors, as the earlier x86 processors do not have a paging unit.)
83: 1334: 1172: 187:
to derive the actual memory address. In real mode, the registers CS, DS, SS, and ES point to the currently used program
137: 1311: 1081: 1369: 65: 1492: 1379: 1359: 1212: 1116: 848: 729: 710: 632: 400:
CS=DS=SS, that is the program's code, data, and stack are all contained within a single 64 KB segment. In the
428: 43: 1438: 691: 345:
long, the practical effect is only that no segment can be longer than 64 KB, rather than that every segment
1298: 600: 383:
compatibility issues in later CPU generations, where the linear address space was expanded past 20 bits.
803: 1502: 1364: 1339: 702: 664: 660: 580: 1316: 1268: 1166: 826:
by setting all segments' bases to 0 in order to make segmentation neutral to programs. For instance, the
584: 955: 722: 1344: 1042: 932: 706: 90: 1222: 500: 141: 1464: 1448: 1374: 961:
instructions. Similarly, the only ways to lower the privilege level (and reload CS) are through
607: 576: 223: 575:
When attempting address translation of a given logical address, the processor reads the 64-bit
180:
architecture, introduced in 2003, has largely dropped support for segmentation in 64-bit mode.
17: 1240: 1139: 1076: 823: 683: 392: 240: 161: 215:
byte which can be used to override the default segment for selected instructions if desired.
1417: 1412: 1255: 1098: 622:
and later, protected mode retains the segmentation mechanism of 80286 protected mode, but a
517: 256: 1103: 1407: 1306: 569: 259:
in this mode. For instance, the segmented address 06EFh:1234h (here the suffix "h" means
470: 1422: 1389: 1384: 1230: 1189: 781: 496: 475: 361: 172: 157: 1547: 1399: 1202: 1197: 357: 196: 524:
could use it to increase the available "conventional" memory (i.e. within the first
946: 827: 772: 763: 735: 695: 643: 556: 192: 188: 663:
mechanism used by legacy modes, the base address of these segments is stored in a
1025:
IA-32 Intel Architecture Software Developer's Manual Volume 1: Basic Architecture
1443: 1086: 672: 628: 619: 492: 417: 369: 260: 204: 153: 32: 1207: 606:
The privilege check is done only when the segment register is loaded, because
396:
concept derives from the setup of the segment registers. For example, in the
145: 1354: 1235: 676: 552: 541: 537: 505: 236: 228: 166: 508:
pointers (but not 8086 pointers) can now refer to addresses between 100000
1288: 1283: 1273: 1263: 529: 525: 380: 365: 342: 148:
in 1978. It allows programs to address more than 64 KB (65,536 
1278: 442: in this section. Unsourced material may be challenged and removed. 925: 655: 623: 533: 177: 1108: 985: 977: 469: 222: 1099:
Home of the IA-32 Intel Architecture Software Developer's Manual
941:
In protected mode, code may always modify all segment registers
244: 152:) of memory, the limit in earlier 80xx processors. In 1982, the 149: 1112: 818:
specified by the segment selector held in the ES register.
800:
specified by the segment selector held in the SS register.
767:
specified by the segment selector held in the CS register.
981: 521: 516:. This roughly 64-kilobyte region of memory was known as the 411: 133: 26: 375:
Each segment begins at a multiple of 16 bytes, called a
728:
movl $ 42, %fs:(%eax)  ; Equivalent to M<-42) in
572:(RPL), a 1-bit Table Indicator (TI), and a 13-bit index. 183:
In both real and protected modes, the system uses 16-bit
757:
However, segment registers are usually used implicitly.
596:
the lowest number corresponds to the highest privilege.
667:. The x86-64 architecture further provides the special 1151:
Memory management as a function of an operating system
631:, but can be larger on newer processors which support 599:
If the inequality is false, the processor generates a
761:
All CPU instructions are implicitly fetched from the
610:
are cached in hidden parts of the segment registers.
285:
16 bits, shifted 4 bits left (or multiplied by 0x10)
1457: 1431: 1398: 1325: 1297: 1254: 1221: 1188: 1159: 686:on x86-64 uses the GS segment to point to the 57:. Unsourced material may be challenged and removed. 794:memory accesses using the (E)SP or (E)BP registers 976:For more information about segmentation, see the 721:Logical addresses can be explicitly specified in 587:when TI=1. It then performs the privilege check: 364:to 2 bytes, or 1,048,576 bytes (1  777:DS by default will accept an ES override prefix. 698:uses the GS segment to store per-CPU data. 247:up to 65,536 bytes (using 16-bit offsets). 203:segment determined by the programmer (ES). The 1124: 478:memory (click on image to enlarge), with the 8: 1470:International Symposium on Memory Management 1131: 1117: 1109: 830:sets up only 4 general purpose segments: 814:), along with data segment, also use the 458:Learn how and when to remove this message 243:, the size of a segment can range from 1 117:Learn how and when to remove this message 832: 997: 931:Current Linux also uses GS to point to 671:instruction, which allows swapping the 1003: 1001: 770:Most memory references come from the 7: 1104:The Segment:Offset Addressing Scheme 784:references, either implicitly (e.g. 440:adding citations to reliable sources 55:adding citations to reliable sources 1179:Input–output memory management unit 563:Detailed segmentation unit workflow 690:, a small data structure for each 25: 1528: 1527: 1518: 1517: 1508: 1507: 1498: 1497: 1488: 1487: 980:manuals freely available on the 540:models), and so all subsequent " 416: 170:, and the new version was named 164:; the original mode was renamed 129:Memory segmentation on Intel x86 31: 1350:Concurrent mark sweep collector 544:-class" PC clones did as well. 427:needs additional citations for 42:needs additional citations for 18:Segment:offset addressing (x86) 1475:Region-based memory management 255:address, which is the same as 1: 792:instructions) or explicitly ( 659:special purposes. Unlike the 601:general protection (GP) fault 520:(HMA), and later versions of 1523:Memory management algorithms 1335:Automatic Reference Counting 1173:Translation lookaside buffer 646:or using external hardware. 138:instruction set architecture 1513:Automatic memory management 1312:C dynamic memory allocation 1082:THE multiprogramming system 291:+      1570: 1533:Memory management software 1380:Tracing garbage collection 1213:Virtual memory compression 1022:Intel Corporation (2004). 725:, e.g. (AT&T syntax): 633:Physical Address Extension 579:structure from either the 1483: 1146: 66:"X86 memory segmentation" 1307:Static memory allocation 1299:Manual memory management 740: 688:Thread Environment Block 360:of real mode limits the 321:0000 1000 0001 0010 0100 1365:Garbage-first collector 1340:Boehm garbage collector 1246:x86 memory segmentation 701:GS/FS are also used in 665:model-specific register 661:global descriptor table 581:Global Descriptor Table 1370:Mark–compact algorithm 1167:Memory management unit 585:Local Descriptor Table 483: 480:local descriptor table 232: 1554:X86 memory management 723:x86 assembly language 473: 356:The effective 20-bit 226: 1317:new and delete (C++) 992:Notes and references 933:thread-local storage 707:thread-local storage 614:80386 protected mode 487:80286 protected mode 436:improve this article 51:improve this article 1223:Memory segmentation 875:Kernel data segment 858:Kernel code segment 804:String instructions 608:segment descriptors 591:max(CPL, RPL) ≤ DPL 501:segment descriptors 294:0001 0010 0011 0100 273:0000 0110 1110 1111 144:since the original 142:memory segmentation 1465:Automatic variable 1449:Unreachable memory 1375:Reference counting 1345:Cheney's algorithm 1327:Garbage collection 650:Later developments 577:segment descriptor 484: 474:Three segments in 362:addressable memory 233: 227:Three segments in 195:(DS), the current 191:(CS), the current 156:added support for 1541: 1540: 1493:Memory management 1241:Virtual 8086 mode 1140:Memory management 1077:x86 memory models 965:(far return) and 922: 921: 909:User data segment 892:User code segment 824:flat memory model 713:stack protector. 684:Microsoft Windows 583:when TI=0 or the 504:20 bits, so 468: 467: 460: 334: 333: 185:segment registers 162:memory protection 127: 126: 119: 101: 16:(Redirected from 1561: 1531: 1530: 1521: 1520: 1511: 1510: 1501: 1500: 1491: 1490: 1418:Dangling pointer 1413:Buffer over-read 1385:Strong reference 1256:Memory allocator 1133: 1126: 1119: 1110: 1064: 1062: 1057: 1053: 1047: 1046: 1039: 1033: 1032: 1030: 1019: 1013: 1005: 972: 833: 753: 750: 747: 744: 679:base addresses. 518:High Memory Area 463: 456: 452: 449: 443: 420: 412: 322: 319: 310: 295: 292: 277: 274: 271: 266: 265: 257:physical address 122: 115: 111: 108: 102: 100: 59: 35: 27: 21: 1569: 1568: 1564: 1563: 1562: 1560: 1559: 1558: 1544: 1543: 1542: 1537: 1479: 1453: 1427: 1408:Buffer overflow 1394: 1321: 1293: 1250: 1217: 1184: 1155: 1142: 1137: 1095: 1073: 1068: 1067: 1060: 1055: 1054: 1050: 1041: 1040: 1036: 1028: 1021: 1020: 1016: 1006: 999: 994: 970: 954:(far call) and 755: 754: 751: 748: 745: 742: 732: 719: 652: 616: 570:Privilege Level 565: 515: 511: 489: 464: 453: 447: 444: 433: 421: 410: 320: 317: 308: 293: 290: 275: 272: 269: 221: 130: 123: 112: 106: 103: 60: 58: 48: 36: 23: 22: 15: 12: 11: 5: 1567: 1565: 1557: 1556: 1546: 1545: 1539: 1538: 1536: 1535: 1525: 1515: 1505: 1503:Virtual memory 1495: 1484: 1481: 1480: 1478: 1477: 1472: 1467: 1461: 1459: 1455: 1454: 1452: 1451: 1446: 1441: 1435: 1433: 1429: 1428: 1426: 1425: 1423:Stack overflow 1420: 1415: 1410: 1404: 1402: 1396: 1395: 1393: 1392: 1390:Weak reference 1387: 1382: 1377: 1372: 1367: 1362: 1357: 1352: 1347: 1342: 1337: 1331: 1329: 1323: 1322: 1320: 1319: 1314: 1309: 1303: 1301: 1295: 1294: 1292: 1291: 1286: 1281: 1276: 1271: 1266: 1260: 1258: 1252: 1251: 1249: 1248: 1243: 1238: 1233: 1231:Protected mode 1227: 1225: 1219: 1218: 1216: 1215: 1210: 1205: 1200: 1194: 1192: 1190:Virtual memory 1186: 1185: 1183: 1182: 1176: 1170: 1163: 1161: 1157: 1156: 1154: 1153: 1147: 1144: 1143: 1138: 1136: 1135: 1128: 1121: 1113: 1107: 1106: 1101: 1094: 1093:External links 1091: 1090: 1089: 1084: 1079: 1072: 1069: 1066: 1065: 1048: 1034: 1014: 996: 995: 993: 990: 920: 919: 916: 913: 910: 907: 903: 902: 899: 896: 893: 890: 886: 885: 882: 879: 876: 873: 869: 868: 865: 862: 859: 856: 852: 851: 846: 843: 840: 837: 820: 819: 801: 778: 768: 741: 727: 718: 715: 682:For instance, 651: 648: 615: 612: 593: 592: 564: 561: 513: 509: 497:protected mode 488: 485: 476:protected mode 466: 465: 424: 422: 415: 409: 408:Protected mode 406: 332: 331: 328: 323: 314: 313: 311: 305: 304: 301: 296: 287: 286: 283: 278: 220: 217: 213:segment prefix 199:(SS), and one 173:protected mode 158:virtual memory 140:has supported 128: 125: 124: 39: 37: 30: 24: 14: 13: 10: 9: 6: 4: 3: 2: 1566: 1555: 1552: 1551: 1549: 1534: 1526: 1524: 1516: 1514: 1506: 1504: 1496: 1494: 1486: 1485: 1482: 1476: 1473: 1471: 1468: 1466: 1463: 1462: 1460: 1456: 1450: 1447: 1445: 1442: 1440: 1439:Fragmentation 1437: 1436: 1434: 1430: 1424: 1421: 1419: 1416: 1414: 1411: 1409: 1406: 1405: 1403: 1401: 1400:Memory safety 1397: 1391: 1388: 1386: 1383: 1381: 1378: 1376: 1373: 1371: 1368: 1366: 1363: 1361: 1358: 1356: 1353: 1351: 1348: 1346: 1343: 1341: 1338: 1336: 1333: 1332: 1330: 1328: 1324: 1318: 1315: 1313: 1310: 1308: 1305: 1304: 1302: 1300: 1296: 1290: 1287: 1285: 1282: 1280: 1277: 1275: 1272: 1270: 1267: 1265: 1262: 1261: 1259: 1257: 1253: 1247: 1244: 1242: 1239: 1237: 1234: 1232: 1229: 1228: 1226: 1224: 1220: 1214: 1211: 1209: 1206: 1204: 1203:Memory paging 1201: 1199: 1198:Demand paging 1196: 1195: 1193: 1191: 1187: 1180: 1177: 1174: 1171: 1168: 1165: 1164: 1162: 1158: 1152: 1149: 1148: 1145: 1141: 1134: 1129: 1127: 1122: 1120: 1115: 1114: 1111: 1105: 1102: 1100: 1097: 1096: 1092: 1088: 1085: 1083: 1080: 1078: 1075: 1074: 1070: 1052: 1049: 1044: 1038: 1035: 1027: 1026: 1018: 1015: 1011: 1004: 1002: 998: 991: 989: 987: 983: 979: 974: 968: 964: 960: 958: 953: 948: 944: 939: 936: 934: 929: 927: 917: 914: 911: 908: 905: 904: 900: 897: 894: 891: 888: 887: 883: 880: 877: 874: 871: 870: 866: 863: 860: 857: 854: 853: 850: 847: 844: 841: 838: 835: 834: 831: 829: 825: 817: 816:extra segment 813: 809: 805: 802: 799: 798:stack segment 795: 791: 787: 783: 779: 775: 774: 769: 766: 765: 760: 759: 758: 739: 737: 731: 726: 724: 716: 714: 712: 708: 704: 699: 697: 693: 689: 685: 680: 678: 674: 670: 666: 662: 657: 649: 647: 645: 639: 636: 634: 630: 625: 621: 613: 611: 609: 604: 602: 597: 590: 589: 588: 586: 582: 578: 573: 571: 562: 560: 558: 554: 549: 545: 543: 539: 535: 531: 527: 523: 519: 507: 502: 498: 494: 486: 481: 477: 472: 462: 459: 451: 441: 437: 431: 430: 425:This section 423: 419: 414: 413: 407: 405: 403: 399: 395: 394: 388: 384: 382: 378: 373: 371: 367: 363: 359: 358:address space 354: 351: 348: 344: 338: 329: 327: 324: 316: 315: 312: 307: 306: 302: 300: 297: 289: 288: 284: 282: 279: 268: 267: 264: 262: 258: 254: 248: 246: 242: 238: 230: 225: 218: 216: 214: 208: 206: 202: 198: 197:stack segment 194: 190: 186: 181: 179: 175: 174: 169: 168: 163: 159: 155: 151: 147: 143: 139: 135: 121: 118: 110: 99: 96: 92: 89: 85: 82: 78: 75: 71: 68: â€“  67: 63: 62:Find sources: 56: 52: 46: 45: 40:This article 38: 34: 29: 28: 19: 1245: 1051: 1037: 1024: 1017: 1008: 975: 966: 962: 956: 951: 947:code segment 942: 940: 937: 930: 923: 828:Linux kernel 821: 815: 811: 807: 797: 789: 785: 773:data segment 771: 764:code segment 762: 756: 736:Intel syntax 733: 720: 711:canary-based 700: 696:Linux kernel 681: 668: 653: 644:triple fault 640: 637: 617: 605: 598: 594: 574: 566: 557:triple fault 550: 546: 490: 479: 454: 445: 434:Please help 429:verification 426: 401: 397: 393:memory model 391: 389: 385: 376: 374: 370:address pins 355: 352: 346: 339: 335: 325: 298: 280: 252: 249: 234: 212: 209: 200: 193:data segment 189:code segment 184: 182: 171: 165: 131: 113: 104: 94: 87: 80: 73: 61: 49:Please help 44:verification 41: 1444:Memory leak 1087:Split octal 959:(interrupt) 872:__KERNEL_DS 855:__KERNEL_CS 839:Description 673:kernel mode 620:Intel 80386 534:IBM PC 448:August 2015 261:hexadecimal 205:Intel 80386 154:Intel 80286 1208:Page table 1043:"DevBlogs" 988:websites. 915:4 GiB 898:4 GiB 881:4 GiB 864:4 GiB 796:) use the 780:Processor 512:and 10FFEF 398:tiny model 146:Intel 8086 132:The Intel 77:newspapers 1355:Finalizer 1236:Real mode 906:__USER_DS 889:__USER_CS 717:Practices 677:user mode 553:IBM PC/AT 506:real mode 377:paragraph 237:real mode 229:real mode 219:Real mode 167:real mode 136:computer 107:June 2017 1548:Category 1289:ptmalloc 1284:mimalloc 1274:jemalloc 1264:dlmalloc 1160:Hardware 1071:See also 945:CS (the 530:A20 line 381:Gate A20 341:64  330:20 bits 303:16 bits 241:V86 mode 1360:Garbage 1279:libumem 1181:(IOMMU) 618:In the 326:Address 318:  281:Segment 270:  176:. The 91:scholar 1432:Issues 1061:POP CS 1056:POP CS 971:POP CS 943:except 926:paging 806:(e.g. 734:or in 692:thread 669:SWAPGS 656:x86-64 624:paging 299:Offset 253:linear 178:x86-64 93:  86:  79:  72:  64:  1458:Other 1269:Hoard 1175:(TLB) 1169:(MMU) 1029:(PDF) 986:Intel 978:IA-32 952:lcall 845:Limit 782:stack 746:dword 538:PC/XT 493:80286 402:small 201:extra 150:bytes 98:JSTOR 84:books 967:iret 963:lret 842:Base 836:Name 812:movs 808:stos 788:and 786:push 709:and 675:and 654:The 536:and 491:The 390:The 347:must 276:0000 245:byte 160:and 70:news 984:or 982:AMD 957:int 849:DPL 790:pop 743:mov 730:RTL 705:'s 703:gcc 629:386 522:DOS 495:'s 438:by 239:or 235:In 134:x86 53:by 1550:: 1000:^ 935:. 918:3 901:3 884:0 867:0 810:, 752:42 738:: 635:. 542:AT 526:MB 514:16 510:16 366:MB 343:KB 251:a 1132:e 1125:t 1118:v 1045:. 1031:. 1012:" 912:0 895:0 878:0 861:0 749:, 482:. 461:) 455:( 450:) 446:( 432:. 120:) 114:( 109:) 105:( 95:¡ 88:¡ 81:¡ 74:¡ 47:. 20:)

Index

Segment:offset addressing (x86)

verification
improve this article
adding citations to reliable sources
"X86 memory segmentation"
news
newspapers
books
scholar
JSTOR
Learn how and when to remove this message
x86
instruction set architecture
memory segmentation
Intel 8086
bytes
Intel 80286
virtual memory
memory protection
real mode
protected mode
x86-64
code segment
data segment
stack segment
Intel 80386

real mode
real mode

Text is available under the Creative Commons Attribution-ShareAlike License. Additional terms may apply.

↑