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

📄 global.h

📁 参照MINIX3写的操作系统 用GCC+NASM+BOCHS开发
💻 H
字号:
#define NR_TASKS 1
#define NR_PROCS 0
#define LDT_SIZE 2
#define INTERRUPT 0
#define SLEEP 1
#define READY 2
#define RUNNING 3
#define EV_KEYPRESS 4#define STACK_SIZE_RAM		0x800
#define STACK_SIZE_MEMORY   0x800
#define STACK_SIZE_TTY	    0x800
#define STACK_SIZE_HD       0x800
#define STACK_SIZE_FS		0x800
#define STACK_SIZE_IS	    0x800
#define STACK_SIZE_CLOCK	0x800
#define STACK_SIZE_TOTAL	STACK_SIZE_CLOCK+STACK_SIZE_RAM+STACK_SIZE_MEMORY+STACK_SIZE_TTY+STACK_SIZE_HD+STACK_SIZE_FS+STACK_SIZE_IS/* 中断向量 */
#define	INT_VECTOR_DIVIDE		0x0
#define	INT_VECTOR_DEBUG		0x1
#define	INT_VECTOR_NMI			0x2
#define	INT_VECTOR_BREAKPOINT		0x3
#define	INT_VECTOR_OVERFLOW		0x4
#define	INT_VECTOR_BOUNDS		0x5
#define	INT_VECTOR_INVAL_OP		0x6
#define	INT_VECTOR_COPROC_NOT		0x7
#define	INT_VECTOR_DOUBLE_FAULT		0x8
#define	INT_VECTOR_COPROC_SEG		0x9
#define	INT_VECTOR_INVAL_TSS		0xA
#define	INT_VECTOR_SEG_NOT		0xB
#define	INT_VECTOR_STACK_FAULT		0xC
#define	INT_VECTOR_PROTECTION		0xD
#define	INT_VECTOR_PAGE_FAULT		0xE
#define	INT_VECTOR_COPROC_ERR		0x10

#define SELECTOR_DUMMY 0
#define SELECTOR_FLAT_C 0x8
#define SELECTOR_FLAT_RW 0x10
#define SELECTOR_VIDEO (0x18+3)
#define SELECTOR_TSS 0x20
#define SELECTOR_LDT_FIRST 0x28

#define SELECTOR_KERNEL_CS SELECTOR_FLAT_C
#define SELECTOR_KERNEL_DS SELECTOR_FLAT_RW
#define SELECTOR_KERNEL_GS SELECTOR_VIDEO 
#define	DA_386IGate		0x8E	/* 386 中断门类型值			*/
#define	DA_386TSS		0x89	/* 可用 386 任务状态段类型值		*/
/* 权限 */
#define	PRIVILEGE_KRNL	0
#define PRIVILEGE_TASK  1
#define	PRIVILEGE_USER	3

#define	DA_C			0x98	/* 存在的只执行代码段属性值		*/
#define	DA_DRW			0x92	/* 存在的可读写数据段属性值		*/
#define	DA_LDT			0x82	/* 局部描述符表段类型值			*/

/* 选择子类型值说明 */
/* 其中, SA_ : Selector Attribute */
#define	SA_RPL_MASK	0xFFFC
#define	SA_RPL0		0
#define	SA_RPL1		1
#define	SA_RPL2		2
#define	SA_RPL3		3

#define	RPL_KRNL	SA_RPL0
#define	RPL_TASK	SA_RPL1
#define	RPL_USER	SA_RPL3

#define	SA_TI_MASK	0xFFFB
#define	SA_TIG		0
#define	SA_TIL		4


//中断向量号
#define INT_VECTOR_IRQ0 0x20
#define INT_VECTOR_IRQ8 0x28

/* GDT */
/* 描述符索引 */
#define	INDEX_DUMMY		0	// ┓
#define	INDEX_FLAT_C		1	// ┣ LOADER 里面已经确定了的.
#define	INDEX_FLAT_RW		2	// ┃
#define	INDEX_VIDEO		3	// ┛
#define	INDEX_TSS		4
#define	INDEX_LDT_FIRST		5#define mDevPosition m1
#define mDestPosition m2
#define mSrcPosition m3
#define mSize m4#define SCROLL_SCREEN_UP 1
#define SCROLL_SCREEN_DOWN 2
#define SCREEN_SIZE (80*25)
#define SCREEN_WIDTH 80#define STRUCT_ALLOC	1			/*structAlloc结构*/
#define STRUCT_HOLE		2			/*物理页分配结构*/
#define STRUCT_PROCESS	3			/*进程结构体*/
#define MAX_STRUCT 320              /*同类结构体的最大数量*/#define MEM_START 0x500000			/*可分配内存的起始地址,5M*/
#define HOLE_BASE 0x501400
#define K 1024
#define M 1024*1024
#define MEMSIZE 32*M					 /*32M*/#define TTY_IN_BYTES 16
#define NR_CONSOLES 3
#define TTY_FIRST (TTYTable)
#define TTY_END (TTYTable+NR_CONSOLES)
#define vir2phys(seg_base,vir) (t_32)(((t_32)seg_base)+(t_32)(vir))#define kmalloc() mallocStruct(STRUCT_PROCESS)
#define kfree(addr) freeStruct(STRUCT_PROCESS,addr)#define mmalloc() mallocStruct(STRUCT_HOLE)
#define mfree(addr) freeStruct(STRUCT_HOLE,addr)#define memCopy MemoryCopy 
#define memSet MemorySet/*********************************************************************///存储段描述符
typedef struct Descriptor
{
	t_16  LimitLow;
	t_16  BaseLow;
	t_8   BaseMiddle;
	t_8   Attribute1;
	t_8   LimitH_Attr2;
	t_8   BaseHigh;
}DESCRIPTOR;
//门描述符

typedef struct s_gata
{
	t_16 OffsetL;
	t_16 Selector;
	t_8  Dcount;
	t_8 Attribute;
	t_16 OffsetH;
}GATE;typedef struct s_stackframe
{
	t_32 gs;
	t_32 fs;
	t_32 es;
	t_32 ds;
	t_32 edi;
	t_32 esi;
	t_32 ebp;
	t_32 kernel_esp;
	t_32 ebx;
	t_32 edx;
	t_32 ecx;
	t_32 eax;
	t_32 retaddr;
	t_32 eip;
	t_32 cs;
	t_32 eflags;
	t_32 esp;
	t_32 ss;
}STACK_FRAME;


typedef struct _proc
{
	STACK_FRAME  Regs;
	t_16         LDTSelector;
	DESCRIPTOR   LDT[LDT_SIZE];
	int          Pid;
	int		     InitPriority;
	int          Priority;
	char         p_name[16];
	char         state;
	int          TTYNum;
	t_32         ReturnValue;
	struct _proc *next;
}PROCESS;

typedef struct s_tss{
		t_32 BackLink;
		t_32 esp0;
		t_32 ss0;
		t_32 esp1;
		t_32 ss1;
		t_32 esp2;
		t_32 ss2;
		t_32 cr3;
		t_32 eip;
		t_32 flags;
		t_32 eax;
		t_32 ecx;
		t_32 edx;
		t_32 ebx;
		t_32 esp;
		t_32 ebp;
		t_32 esi;
		t_32 edi;
		t_32 es;
		t_32 cs;
		t_32 ss;
		t_32 ds;
		t_32 fs;
		t_32 gs;
		t_32 ldt;
		t_16 trap;
		t_16 IoBase;
}TSS;

typedef struct s_task{
	FuctionPoint Inital_eip;
	int            StackSize;
}TASK;typedef struct _structAlloc
{
	t32 start;						/*结构体分配区域的起始地址*/
	t32 size;						/*结构体分配区域的大小*/
	t8  sid;						/*结构体的类型*/
	t32 structSize;					/*此类结构体的大小*/
	t8  bitmap[MAX_STRUCT/8];		/*用于分配管理的位图*/
	t32 first;						/*记录最后一次分配成功的位置*/
	t16 usable;						/*实际可分配数*/
	t16 alloc;						/*已分配数*/
	struct _structAlloc *next;		
}structAlloc;

typedef struct _hole{
	t32 start;										/*start of the hole*/
	t32 size;										/*the size of hole*/
    struct _hole *next;						
}hole;typedef struct s_Console
{
	unsigned int CurrentStartAddr;
	unsigned int OriginalAddr;
	unsigned int Size;
	unsigned int CursorPos;
}CONSOLE;

typedef struct s_TTY
{
	t_32 Buffer[TTY_IN_BYTES];
	t_32 *Head;
	t_32 *Tail;
	int Count;
	t_32 KeyBuffer[TTY_IN_BYTES];
	t_32 *KeyHead;
	t_32 *KeyTail;
	int KeyCount;
	CONSOLE *pConsole;
}TTY;struct t_bios_time{
	int second;
	int minute;
	int hour;
	int day;
	int month;
	int year;
	int century;
};/*********************************************************************/extern  t_8         gdt_ptr[6];
extern DESCRIPTOR  gdt[GDT_SIZE];
extern t_8         idt_ptr[6];
extern GATE        idt[IDT_SIZE];
extern TSS         tss;
extern IrqFuction  IrqTable[NR_IRQ];extern int Disp_pos;
extern int Head,Tail;
extern int ReEnter;
extern int LostTicks;extern PROCESS  *usrProc;     //指向用户进程队列的头指针
extern PROCESS  *pCurrentProc;//指向当前运行的进程
extern PROCESS  *ReadyProc;extern structAlloc structAllocer;/*用于管理 structAlloc*/extern hole *head;				

⌨️ 快捷键说明

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