⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 i386.h

📁 从网上下载的一个自己编写的简单的操作系统源代码,对底层了解很有好处的
💻 H
字号:
/*
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 *
 */
#ifndef __I386__H_
#define __I386__H_



/*
*  Optimization barrier
*  The "volatile" is due to gcc bugs
* 
*/
#define _barrier() __asm__ __volatile__("": : :"memory")

 
/*  
 *  Selector
 *  see head.s 中的全局描述符表
 */
#define _KERNEL_CS  0x8  
#define _KERNEL_DS  0x10 





/*  
 *  此系统只使用Intrupt Gate 和Trap Gate,并不使用TSS Gate,Call Gate.
 */
 /*
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;中断门描述符格式  
;+31-----------------16|15 |14 13|12------8|7----------0-+  
;|   Offset 31..16     | P  DPL   0 D 110    0000 0000   | 1 dword
;+---------------------+------------------+-------------+
;+31-----------------16|15-----------------------------0-+
;|      Selector       |   Offset 15..0                  | 0 dword
;+---------------------+---------------------------------+
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;Trap Gate 
;+31-----------------16|15 |14 13|12------8|7----------0-+  
;|   Offset 31..16     | P   DPL   0 D 111   0000 0000   | 1 dword
;+---------------------+-------------------+-------------+
;+31-----------------16|15-----------------------------0-+
;|      Selector       |   Offset 15..0                  | 0 dword
;+---------------------+---------------------------------+	align 3
;***********************
;DPL-------Descriptor Privilege Level
;Offset----Offset to procedure entry point
;P---------Segment Present flag
;Selector--Segment Selector for destination code segment
;D---------Size :1 = 32 bits; 0 = 16 bits 
;***********************
; 1 dword 8---15bits 的典型值
; Interupt Gate (clear IF):8Eh or 0EEh (kernel/user)(32 bit)(用于中断或异常)
; Trap Gate(keep IF):      8Fh or 0EFh (kernel/user)(32 bit)(用于trap ?)
*/
typedef struct tagGate{
    unsigned short offl; //32位偏移的低16位
    unsigned short sel; // 选择子
    unsigned char Res;               
    unsigned char attr; //门属性
    unsigned short offh; // 32位偏移的高16位
 }gate_t;
// Interupt Gate (clear IF):8Eh or 0EEh (kernel/user)(32 bit)(用于中断或异常)
// Trap Gate(keep IF):     8Fh or 0EFh (kernel/user)(32 bit)(用于trap ?)
#define IGA_K  (unsigned char)0x8e   //interupte gate kernel
#define IGA_U    (unsigned char)0xee   //interupte gate user
#define TGA_K (unsigned char)0x8f     //trap gate kernel
#define TGA_U   (unsigned char)0xef //trap gate user

void _gate_fill(short gate,unsigned int offset, unsigned char attr);
void _fill_int_gate();

/*
 *  @arch.c
 *
 */
typedef unsigned int irq_act; //void handle (int irq)  irq action
int  _irq_reg(short irq,  irq_act irqact);

#define cli() \
__asm__ volatile ("cli")

#define sti() \
__asm__ volatile ("sti")
/*
 * @ arch.s
 */
extern void _lidt(); 



#endif /* __I386__H_ */

⌨️ 快捷键说明

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