segment.h

来自「geekos 0.3.0简单的操作系统」· C头文件 代码 · 共 91 行

H
91
字号
/* * General data structures and routines for segmentation * Copyright (c) 2001, David H. Hovemeyer <daveho@cs.umd.edu> * $Revision: 1.13 $ *  * This is free software.  You are permitted to use, * redistribute, and modify it as specified in the file "COPYING". *//* * Source: _Protected Mode Software Architecture_ by Tom Shanley, * ISBN 020155447X. */#ifndef GEEKOS_SEGMENT_H#define GEEKOS_SEGMENT_H#include <geekos/ktypes.h>struct TSS;#if __TINYC__#define PACKED#else#define PACKED __attribute__((packed))#endif/* * The general format of a segment descriptor. */struct Segment_Descriptor {    ushort_t sizeLow        PACKED ;    uint_t baseLow     : 24 PACKED ;    uint_t type        : 4  PACKED ;    uint_t system      : 1  PACKED ;    uint_t dpl         : 2  PACKED ;    uint_t present     : 1  PACKED ;    uint_t sizeHigh    : 4  PACKED ;    uint_t avail       : 1  PACKED ;    uint_t reserved    : 1  PACKED ;  /* set to zero */    uint_t dbBit       : 1  PACKED ;    uint_t granularity : 1  PACKED ;    uchar_t baseHigh        PACKED ;};/** * Construct a segment selector. * @param rpl requestor privilege level; should be KERNEL_PRIVILEGE *    for kernel segments and USER_PRIVILEGE for user segments * @param segmentIsInGDT true if the referenced segment descriptor *    is defined in the GDT, false if it is defined in the LDT * @param index index of the segment descriptor * @return the segment selector */static __inline__ ushort_t Selector(int rpl, bool segmentIsInGDT, int index){    ushort_t selector = 0;    selector = (rpl & 0x3) | ((segmentIsInGDT ? 0 : 1) << 2) | ((index & 0x1FFF) << 3);    return selector;}/* * Routines to initialize segment descriptors. * Code and data segments must start on a page-aligned address * and are sized in pages. */void Init_Null_Segment_Descriptor(struct Segment_Descriptor* desc);void Init_Code_Segment_Descriptor(    struct Segment_Descriptor* desc,    ulong_t baseAddr,    ulong_t numPages,    int privilegeLevel);void Init_Data_Segment_Descriptor(    struct Segment_Descriptor* desc,    ulong_t baseAddr,    ulong_t numPages,    int privilegeLevel);void Init_TSS_Descriptor(struct Segment_Descriptor* desc, struct TSS* theTSS);void Init_LDT_Descriptor(    struct Segment_Descriptor* desc,    struct Segment_Descriptor theLDT[],    int numEntries);#endif  /* GEEKOS_SEGMENT_H */

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?