typedef unsigned int u32;
typedef unsigned short u16;
typedef unsigned char u8;
typedef struct descriptor /* ???8 ??a?-?è??*/
descriptor;
void _set_gdt_desc(struct desc_struct *descriptor_addr,u32 base,u32 limit,u16 attr)
#define da_c 0x98 //存在的只執行**段屬性值
#define da_32 0x4000 //32 位段
#define da_dpl3 0x60 //dpl = 3
#define da_dpl0 0x00 //dpl = 0
#define da_drwa 0x93 //存在的已訪問可讀寫資料段型別
#define da_drw 0x92 //存在的可讀寫資料段屬性值
#define sa_rpl3 3 //rpl(requested privilege level)=3: 請求特權級,用於特權檢查。
_set_gdt_desc(&gdt[2],0xb8000,0x0ffff,da_drw+ da_dpl3);
//堆疊段,選擇子為0x28
_set_gdt_desc(&gdt[5],0,0xffffffff,da_drwa + da_32 + da_dpl3);
//**段,選擇子為0x30
_set_gdt_desc(&gdt[6],0,0xffffffff,da_c+da_32+da_dpl3);
寫乙個簡單的程序,不停的列印a
void delay(int time)
} }}void testa(void)
}
下面我們該實現跳轉了
#define move_to_user_mode() \
__asm__ ("movl %%esp,%%eax\n\t" \
"pushl $0x2b\n\t" \
"pushl %%eax\n\t" \
"pushfl\n\t"\
"pushl $0x33\n\t" \
"pushl $testa\n\t" \
"iret\n" \
:::"ax")
第2行將暫存器esp的值放到eax中
第3行設定ss,即堆疊段選擇子0x28+3,3是sa_rpl3
第3行設定esp
第4行設定
第5行設定cs,即**段選擇子0x30+3,3是sa_rpl3
第5行設定eip
第6行iret實現跳轉
#define move_to_user_mode() \
__asm__ ("movl %%esp,%%eax\n\t" \
"pushl $0x2b\n\t" \
"pushl %%eax\n\t" \
"pushfl\n\t"\
"pushl $0x33\n\t" \
"pushl $testa\n\t" \
"iret\n" \
:::"ax")
乙個禁止任何ring3除錯的驅動
include define makelong low,high ulong ushort ulong low 0xffff ulong ushort ulong high 0xffff 16 define get low16 of 32 data ushort ulong data 0xffff ...
3乙個簡單的Shader
乙個簡單的unityshader看起來是這樣 cg 段 由cgprogram與endcg包圍起來 編譯指令這裡的用來告訴unity,什麼是頂點著色器,什麼是片元著色器 pragma vertex 頂點著色器函式名 pragma fragment 片元著色器的函式名 在呼叫drawcall的時候,me...
乙個簡單的指令碼守護程序
專案過程中,經常會有很多的指令碼,shell指令碼 php指令碼 python指令碼等,更有一些指令碼是需要常駐記憶體執行的,簡而言之就是需要while true 的模式執行。但是有的時候,乙個常駐記憶體的程序會因為某些耗時操作而夯住,不再往下繼續執行,成為了乙個殭屍程序 或者因為某個操作偶然出錯,...