在进程切换过程中,需要一个结构体,在保护模式中,称为TSS.。
在MenuetOS32系统中,加载应用,也就是进程时,用了如下的方式:
; TSS
mov eax,cr3
mov [l.cr3],eax
mov eax,[app_start]
mov [l.eip],eax
mov eax,[app_esp]
mov [l.esp],eax
mov ebx,[new_process_place] ; gdt's
shl ebx,3
mov ax,app_code
add ax,bx
mov [l.cs],ax
mov ax,app_data
add ax,bx
mov [l.ss],ax
mov [l.ds],ax
mov [l.es],ax
mov [l.fs],ax
mov ax,graph_data
mov [l.gs],ax
mov [l.io],word 128
mov [l.eflags],dword 0x11202
mov [l.ss0], os_data
mov [l.ss1], ring1_data
mov [l.ss2], ring2_data
mov [l.esp0], 0x55000
mov [l.esp1], 0x56000
mov [l.esp2], 0x57000
由于通常应用(进程)放在了Ring3, 所以最重要的是把重点放在l.cr3和l.eip上。
那么osloop呢?osloop的TSS如下:
; set default flags & stacks
mov [l.eflags],dword 0x11202 ; sti and resume
mov [l.ss0], os_data
mov [l.ss1], ring1_data
mov [l.ss2], ring2_data
mov [l.esp0], 0x52000
mov [l.esp1], 0x53000
mov [l.esp2], 0x54000
; osloop - TSS
mov eax,cr3
mov [l.cr3],eax
mov [l.eip],osloop
mov [l.esp],0x2fff0
mov [l.cs],os_code
mov [l.ss],os_data
mov [l.ds],os_data
mov [l.es],os_data
mov [l.fs],os_data
mov [l.gs],os_data
暂时我们可以任务,在进程切换过程中,使用了各自的TSS。在运行监视鼠标和窗口时,eip指向了osloop代码块。而其他呢,eip则指向个各自的START。
打开launcher时,还没有用到定时中断。因为在内核中,没有用到int 0x40h,19号调用。而是直接查找文件,获取运行时所用内存,然后赋值TSS。
标签:os,mov,eax,ax,赋值,data,TSS,结构 From: https://www.cnblogs.com/menuetos32/p/16601736.html