易优建站系统能发朋友圈的网站建设语
2026/2/14 18:15:18 网站建设 项目流程
易优建站系统,能发朋友圈的网站建设语,做网站还是做淘宝,佟年帮韩商言做网站是第几集讨论的是两个不同层面的概念#xff1a;Windows应用软件中的进程概念和x86分段保护模式下的进程概念。它们有联系#xff0c;但并非完全相同的概念。Windows应用软件中的进程概念#xff1a; 这是操作系统级别的抽象#xff0c;是一个正在运行的程序的实例。它包含代码、数…讨论的是两个不同层面的概念Windows应用软件中的进程概念和x86分段保护模式下的进程概念。它们有联系但并非完全相同的概念。Windows应用软件中的进程概念这是操作系统级别的抽象是一个正在运行的程序的实例。它包含代码、数据、系统资源如文件、线程、内存等的集合。Windows进程拥有独立的虚拟地址空间至少包含一个线程是资源分配和调度的基本单位。x86分段保护模式下的进程概念这是x86硬件级别的概念通过任务状态段TSS和任务门来实现硬件任务切换。在保护模式下x86架构支持通过任务切换来改变CPU的整个执行环境包括所有寄存器、地址空间等。每个任务进程由一个TSS描述其中保存了该任务的状态并且每个任务有自己的地址空间通过LDT实现和特权级。然而现代操作系统包括Windows并没有完全使用x86硬件提供的任务切换机制来管理进程而是使用软件操作系统管理进程切换原因包括硬件任务切换效率较低且不够灵活。软件切换可以更精细地控制需要保存和恢复的上下文并且可以跨平台。下面我们通过实例来说明两者的区别和联系。实例1Windows进程创建和切换软件管理在Windows中进程创建通常通过系统调用如CreateProcess实现切换则由操作系统调度器完成。步骤a. 创建进程分配和初始化进程控制块EPROCESS、创建虚拟地址空间、创建初始线程等。b. 切换进程保存当前进程的上下文寄存器、栈指针等加载下一个进程的上下文并切换地址空间通过设置CR3寄存器切换页表。代码示例概念性// Windows内核中进程切换的简化示例voidSwitchContext(Thread*nextThread){Thread*currentThreadGetCurrentThread();Process*currentProcesscurrentThread-Process;Process*nextProcessnextThread-Process;// 保存当前线程的上下文寄存器等SaveContext(currentThread);// 如果进程不同切换地址空间if(currentProcess!nextProcess){// 切换页目录CR3SetCR3(nextProcess-PageDirectory);}// 恢复下一个线程的上下文RestoreContext(nextThread);// 切换栈指针等SetKernelStack(nextThread-KernelStack);}实例2x86硬件任务切换x86硬件任务切换通过任务门或调用任务门、中断等触发CPU会自动保存当前任务状态到当前TSS并加载新任务的TSS。步骤a. 定义一个TSS结构包含任务的寄存器状态、LDT选择子、CR3页目录基址等。b. 在GDT中设置TSS描述符。c. 通过任务门或直接跳转到TSS选择子来触发任务切换。代码示例汇编; 假设我们有两个任务TSS1和TSS2分别对应两个进程 ; 在GDT中定义TSS描述符 GDT: ; ... 其他描述符 TSS1_Desc: dw TSS1_Size-1, TSS1_Base_Low, TSS1_Base_Mid, 0x89, 0x00, TSS1_Base_High TSS2_Desc: dw TSS2_Size-1, TSS2_Base_Low, TSS2_Base_Mid, 0x89, 0x00, TSS2_Base_High ; 定义TSS结构 TSS1: .back_link: dw 0 .esp0: dd 0x2000 ; 特权级0的栈指针 .ss0: dw 0x10 ; 内核数据段选择子 ; ... 其他寄存器 .cr3: dd PageDir1_Base ; 任务1的页目录基址 .eip: dd Task1_Entry ; 任务1的入口点 ; ... .io_map_base: dw 0 TSS2: .back_link: dw 0 .esp0: dd 0x3000 .ss0: dw 0x10 .cr3: dd PageDir2_Base .eip: dd Task2_Entry ; ... .io_map_base: dw 0 ; 任务切换 jmp TSS1_Selector ; 切换到任务1 ; 在任务1中可以通过以下指令切换到任务2 jmp TSS2_Selector ; 切换到任务2区别和联系联系两者都是用来实现多任务进程的机制都涉及保存和恢复任务进程的上下文。都可以实现地址空间的隔离x86任务通过LDT和CR3Windows进程通过页表切换。区别抽象级别不同x86任务切换是硬件机制由CPU直接支持。Windows进程是操作系统提供的软件抽象不依赖于特定的硬件机制虽然会使用硬件特性如分页。上下文保存的内容和方式不同x86任务切换时CPU自动保存所有寄存器到TSS并加载新任务的TSS。这包括通用寄存器、段寄存器、控制寄存器如CR3等。Windows进程切换由操作系统软件处理可以选择保存哪些上下文通常不会保存全部寄存器而是由软件约定并且可以跨平台。灵活性和效率x86硬件任务切换不够灵活且速度较慢因为要保存大量寄存器。软件切换更灵活可以根据需要保存最小上下文并且可以优化例如如果两个进程属于同一个地址空间则不需要切换CR3。地址空间管理x86任务可以通过LDT实现段级别的隔离也可以通过CR3切换页表实现页级别的隔离。Windows进程主要使用分页机制切换CR3来实现地址空间隔离并且每个进程有独立的虚拟地址空间。实际使用现代操作系统包括Windows很少使用x86硬件任务切换因为软件切换更高效、更灵活。Windows仅在需要切换内核栈时使用TSS用于特权级切换而不是进程切换但并不用于完整的进程上下文切换。因此虽然x86硬件提供了任务切换的机制但Windows并没有直接使用它来实现进程。Windows的进程概念是更高级的软件抽象而x86的任务是硬件级别的概念。两者不是同一个概念但在实现多任务和地址空间隔离方面有相似的目标。概述Windows进程是操作系统级别的概念而x86任务进程是硬件级别的概念。Windows在实现进程时借鉴了x86硬件任务的一些思想如使用CR3切换地址空间但并没有使用硬件任务切换机制而是使用软件切换以获取更好的性能和灵活性。Windows进程与x86硬件任务概念深度对比一、本质区别软件抽象 vs 硬件实体1.Windows进程概念软件抽象Windows进程是操作系统级别的软件抽象是系统资源管理和调度的基本单位但不直接对应任何特定的硬件机制。// Windows进程对象结构简化版typedefstruct_EPROCESS{KPROCESS Pcb;// 内核进程控制块EX_FAST_REF Lock;LARGE_INTEGER CreateTime;// 创建时间LARGE_INTEGER ExitTime;// 退出时间HANDLE UniqueProcessId;// 进程IDPIDLIST_ENTRY ActiveProcessLinks;// 活动进程链表SIZE_T VirtualSize;// 虚拟地址空间大小PVOID SectionBase;// 映像基地址PEPEB Peb;// 进程环境块用户态PVOID Win32Process;// Win32子系统进程结构PVOID PageDirectoryPte;// 页目录指针PVOID Session;// 会话LIST_ENTRY ThreadListHead;// 线程链表KAPC_STATE ApcState;// APC状态// ... 更多字段总共约100个字段}EPROCESS;// 进程环境块PEB- 用户态可见typedefstruct_PEB{BYTE InheritedAddressSpace;BYTE ReadImageFileExecOptions;BYTE BeingDebugged;BYTE SpareBool;PVOID Mutant;PVOID ImageBaseAddress;// 映像基地址PPEB_LDR_DATA Ldr;// 模块加载信息PRTL_USER_PROCESS_PARAMETERS ProcessParameters;// 进程参数PVOID SubSystemData;PVOID ProcessHeap;// ... 很多字段}PEB;2.x86硬件任务概念硬件实体x86硬件任务是CPU架构直接支持的硬件机制通过任务状态段TSS和任务门来实现硬件级别的任务切换。; x86硬件任务数据结构TSS struc TSS32 .back_link: resw 1 ; 前一个任务的选择子 .reserved0: resw 1 .esp0: resd 1 ; 特权级0的栈指针 .ss0: resw 1 ; 特权级0的栈段选择子 .reserved1: resw 1 .esp1: resd 1 ; 特权级1的栈指针 .ss1: resw 1 .reserved2: resw 1 .esp2: resd 1 ; 特权级2的栈指针 .ss2: resw 1 .reserved3: resw 1 .cr3: resd 1 ; 页目录基址寄存器关键 .eip: resd 1 ; 指令指针 .eflags: resd 1 .eax: resd 1 .ecx: resd 1 .edx: resd 1 .ebx: resd 1 .esp: resd 1 ; 栈指针特权级3 .ebp: resd 1 .esi: resd 1 .edi: resd 1 .es: resw 1 ; 段寄存器 .reserved4: resw 1 .cs: resw 1 .reserved5: resw 1 .ss: resw 1 .reserved6: resw 1 .ds: resw 1 .reserved7: resw 1 .fs: resw 1 .reserved8: resw 1 .gs: resw 1 .reserved9: resw 1 .ldt: resw 1 ; LDT选择子 .reserved10: resw 1 .debug_trap: resw 1 .io_map_base: resw 1 ; I/O权限位图基址 endstruc二、核心区别实例分析1.创建过程的对比Windows进程创建软件// Windows CreateProcess API调用链BOOLCreateProcessW(LPCWSTR lpApplicationName,LPWSTR lpCommandLine,LPSECURITY_ATTRIBUTES lpProcessAttributes,LPSECURITY_ATTRIBUTES lpThreadAttributes,BOOL bInheritHandles,DWORD dwCreationFlags,LPVOID lpEnvironment,LPCWSTR lpCurrentDirectory,LPSTARTUPINFOW lpStartupInfo,LPPROCESS_INFORMATION lpProcessInformation){// 1. 验证参数和权限// 2. 创建进程对象内核对象NtCreateProcessEx(processHandle,...);// 内核中的实际创建过程NTSTATUSNtCreateProcessEx(OUT PHANDLE ProcessHandle,IN ACCESS_MASK DesiredAccess,IN POBJECT_ATTRIBUTES ObjectAttributes OPTIONAL,IN HANDLE ParentProcess OPTIONAL,IN ULONG Flags,IN HANDLE SectionHandle OPTIONAL,IN HANDLE DebugPort OPTIONAL,IN HANDLE ExceptionPort OPTIONAL,IN BOOLEAN InJob){// 3. 分配和初始化EPROCESS结构EPROCESS*processObCreateObject(KernelMode,PsProcessType,sizeof(EPROCESS),objectAttributes);// 4. 初始化进程控制块KPROCESSKeInitializeProcess(process-Pcb);// 5. 创建地址空间分页机制process-DirectoryTableBaseMmCreateProcessAddressSpace(ParentProcess?ParentProcess-DirectoryTableBase:0);// 6. 创建PEB用户态进程环境process-PebMmCreatePeb(process);// 7. 设置进程IDprocess-UniqueProcessIdPsGetNextProcessId();// 8. 插入到全局进程链表InsertTailList(PsActiveProcessHead,process-ActiveProcessLinks);// 9. 创建初始线程CreateInitialThread(process,...);returnSTATUS_SUCCESS;}}x86硬件任务创建硬件; x86硬件任务创建实例 create_hardware_task: ; 1. 在内存中分配TSS结构 mov eax, TSS_SIZE call allocate_memory mov [current_tss], eax ; 2. 初始化TSS字段 mov edi, eax mov ecx, TSS_SIZE / 4 xor eax, eax rep stosd ; 清零 mov edi, [current_tss] mov dword [edi TSS32.esp0], KERNEL_STACK_TOP mov word [edi TSS32.ss0], KERNEL_DATA_SELECTOR mov dword [edi TSS32.cr3], NEW_PAGE_DIRECTORY mov dword [edi TSS32.eip], TASK_ENTRY_POINT mov dword [edi TSS32.eflags], 0x202 ; 中断使能 mov dword [edi TSS32.esp], USER_STACK_TOP ; 3. 在GDT中创建TSS描述符 mov eax, [current_tss] mov [gdt_tss_entry 2], ax ; 基址低16位 shr eax, 16 mov [gdt_tss_entry 4], al ; 基址中8位 mov [gdt_tss_entry 7], ah ; 基址高8位 mov word [gdt_tss_entry], TSS_SIZE - 1 ; 限长 mov byte [gdt_tss_entry 5], 0x89 ; P1, DPL0, Type9(32位TSS) ; 4. 加载任务寄存器TR mov ax, TSS_SELECTOR ltr ax ; 5. 现在可以通过任务门或直接跳转来启动任务 jmp TSS_SELECTOR:0 ; 硬件任务切换2.上下文切换的对比Windows线程切换软件调度// Windows线程切换的核心函数VOIDKiSwapContext(IN PKTHREAD OldThread,IN PKTHREAD NewThread){// 保存旧线程上下文OldThread-KernelStackESP;OldThread-NpxStatecurrent_fpu_state();// 检查是否需要切换地址空间if(OldThread-ApcState.Process!NewThread-ApcState.Process){// 切换页目录CR3__writecr3(NewThread-ApcState.Process-DirectoryTableBase);}// 更新当前线程指针KeGetCurrentPrcb()-CurrentThreadNewThread;// 恢复新线程上下文ESPNewThread-KernelStack;load_fpu_state(NewThread-NpxState);// 执行新线程return;}// 实际的调度器入口VOIDKiDispatchInterrupt(){PKTHREAD oldThreadKeGetCurrentThread();PKTHREAD newThreadSelectNextThread();if(oldThread!newThread){KiSwapContext(oldThread,newThread);}}x86硬件任务切换硬件自动; x86硬件任务切换示例 ; 假设有两个任务TaskA和TaskB section .data TaskA_TSS: dd 0 ; back_link dd 0x00100000 ; esp0 dw 0x10 ; ss0 (内核数据段) dd 0x00110000 ; cr3 (TaskA的页目录) dd TaskA_Main ; eip dd 0x00000202 ; eflags ; ... 其他寄存器 TaskB_TSS: dd 0 ; back_link dd 0x00200000 ; esp0 dw 0x10 ; ss0 dd 0x00210000 ; cr3 (TaskB的页目录) dd TaskB_Main ; eip dd 0x00000202 ; eflags ; ... 其他寄存器 section .text global _start _start: ; 初始化为TaskA mov ax, TASK_A_SELECTOR ltr ax jmp TASK_A_SELECTOR:0 TaskA_Main: mov eax, 1 mov ebx, 2 ; 执行一些操作... ; 切换到TaskB硬件任务切换 jmp TASK_B_SELECTOR:0 ; CPU自动执行 ; 1. 保存所有寄存器到TaskA_TSS ; 2. 加载TaskB_TSS到TR ; 3. 从TaskB_TSS恢复所有寄存器 ; 4. 加载CR3切换地址空间 ; 5. 开始执行TaskB_Main TaskB_Main: ; 现在在TaskB中执行 add eax, ebx ; ... jmp TASK_A_SELECTOR:0 ; 切换回TaskA3.内存管理的对比Windows进程地址空间分页// Windows进程地址空间布局32位/* 0x00000000-0x0000FFFF: 预留空指针访问 0x00010000-0x7FFEFFFF: 用户模式地址空间 - 0x00400000: EXE映像基地址默认 - 0x10000000: DLL加载区域 - 0x20000000: 堆区域 - 0x30000000: 栈区域从上往下增长 0x7FFF0000-0x7FFFFFFF: 用户模式不可访问边界保护 0x80000000-0xFFFFFFFF: 内核模式地址空间 */// Windows分页管理实例NTSTATUSMmCopyVirtualMemory(PEPROCESS SourceProcess,PVOID SourceAddress,PEPROCESS TargetProcess,PVOID TargetAddress,SIZE_T BufferSize,KPROCESSOR_MODE PreviousMode,PSIZE_T ReturnSize){// 通过页表操作复制内存PMMPTE source_pteMiGetPteAddress(SourceAddress);PMMPTE target_pteMiGetPteAddress(TargetAddress);// 如果页面不在内存中触发缺页异常if(!source_pte-Valid){MmAccessFault(SourceAddress,FALSE);}// 复制物理页内容PHYSICAL_ADDRESS source_physMmGetPhysicalAddress(SourceAddress);PHYSICAL_ADDRESS target_physMmGetPhysicalAddress(TargetAddress);PVOID source_virtMmMapIoSpace(source_phys,PAGE_SIZE,MmNonCached);PVOID target_virtMmMapIoSpace(target_phys,PAGE_SIZE,MmNonCached);RtlCopyMemory(target_virt,source_virt,BufferSize);returnSTATUS_SUCCESS;}x86硬件任务内存LDT分页; x86硬件任务的LDT隔离 ; 每个任务有自己的LDT实现段级隔离 LDT_TaskA: ; 描述符0: 代码段 dw 0xFFFF ; 限长 dw 0x0000 ; 基址低16位 db 0x00 ; 基址中8位 db 0xFA ; P1, DPL3, Type1010代码段 db 0xCF ; G1, D1, 限长高4位0xF db 0x00 ; 基址高8位 ; 描述符1: 数据段 dw 0xFFFF dw 0x0000 db 0x00 db 0xF2 ; Type0010数据段 db 0xCF db 0x00 LDT_TaskB: ; 完全不同的基址实现隔离 dw 0xFFFF dw 0x1000 ; 基址不同 db 0x00 db 0xFA db 0xCF db 0x00 dw 0xFFFF dw 0x1000 db 0x00 db 0xF2 db 0xCF db 0x00 ; 任务切换时自动加载LDT选择子 ; 每个任务只能访问自己的LDT描述符三、联系与相似之处虽然实现机制不同但两者都试图解决相同的问题1.都需要隔离的地址空间// Windows进程通过分页隔离ProcessA:VA0x00400000→ PA0x12345000ProcessB:VA0x00400000→ PA0x56789000// 相同的虚拟地址映射到不同的物理地址// x86硬件任务通过LDT分页隔离TaskA:段基址0x00000000→ 线性地址偏移 → PA TaskB:段基址0x10000000→ 线性地址偏移0x10000000→ PA2.都需要保存执行状态// Windows保存线程上下文typedefstruct_CONTEXT{DWORD ContextFlags;DWORD Dr0,Dr1,Dr2,Dr3,Dr6,Dr7;FLOATING_SAVE_AREA FloatSave;DWORD SegGs,SegFs,SegEs,SegDs;DWORD Edi,Esi,Ebx,Edx,Ecx,Eax;DWORD Ebp;DWORD Eip;DWORD SegCs;DWORD EFlags;DWORD Esp;DWORD SegSs;// ...}CONTEXT;// x86 TSS保存任务状态// 见前面的TSS32结构3.现代Windows对x86任务机制的部分使用// Windows实际上使用了x86 TSS但不是用于任务切换// 而是用于特权级切换时保存内核栈指针voidKiInitializeTSS(){// 初始化单个TSS每个CPU一个PTSS32 tssExAllocatePool(NonPagedPool,sizeof(TSS32));// 设置内核栈指针用于中断/异常处理tss-esp0KernelStackTop;tss-ss0KGDT_R0_DATA;// 设置I/O权限位图为空表示禁止所有I/Otss-io_map_basesizeof(TSS32);// 加载TSSKGDTENTRY*gdtEntryKeGetCurrentPrcb()-Gdt[KGDT_TSS];gdtEntry-BaseLow(WORD)((DWORD)tss0xFFFF);gdtEntry-HighWord.Bytes.BaseMid(BYTE)((DWORD)tss16);gdtEntry-HighWord.Bytes.BaseHi(BYTE)((DWORD)tss24);gdtEntry-LimitLowsizeof(TSS32)-1;gdtEntry-HighWord.Bits.Type9;// 32位可用TSS__ltr(KGDT_TSS);}// 当发生中断从用户模式进入内核模式时voidKiTrapEnter(){// CPU自动从TSS.esp0加载内核栈指针// 这使得每个CPU都有独立的内核栈}四、演进与现状1.为什么Windows不使用硬件任务切换// 硬件任务切换的缺点voidHardwareTaskSwitchProblems(){// 1. 性能问题保存/恢复所有寄存器即使不需要// TSS包含所有通用寄存器、段寄存器、控制寄存器等// 2. 不灵活无法实现轻量级线程// 每个任务需要完整的TSS线程切换开销大// 3. 内存开销每个任务需要TSS至少104字节// 对于成千上万的线程内存浪费严重// 4. 兼容性问题硬件任务机制在x86-64被弱化// x64模式不再支持硬件任务切换// 5. 软件控制有限无法实现现代调度策略// 如优先级调度、时间片轮转、负载均衡等}// 软件切换的优势voidSoftwareSwitchingAdvantages(){// 1. 只保存必要的状态SaveContext(){// 对于同进程线程切换不需要保存// - CR3页目录// - 段寄存器如果使用平坦模型// - 大部分通用寄存器由调用约定保存}// 2. 可以实现各种调度策略// - 优先级调度// - 多级反馈队列// - 实时调度// - 处理器亲和性// 3. 支持跨平台// 不依赖x86特定硬件// 4. 更好的可扩展性// 支持多核、NUMA等}2.x86-64的简化; x86-64模式进一步简化 ; 64位TSS结构更小 struc TSS64 .reserved0: resd 1 .rsp0: resq 1 ; 特权级0栈指针 .rsp1: resq 1 ; 特权级1栈指针 .rsp2: resq 1 ; 特权级2栈指针 .reserved1: resq 1 .ist1: resq 1 ; 中断栈表 .ist2: resq 1 .ist3: resq 1 .ist4: resq 1 .ist5: resq 1 .ist6: resq 1 .ist7: resq 1 .reserved2: resq 1 .reserved3: resw 1 .io_map_base: resw 1 endstruc ; x64不再支持 ; - 硬件任务切换通过TSS ; - LDT本地描述符表 ; - 段寄存器用于地址计算基址强制为0 ; 但保留了TSS用于 ; - 保存每个特权级的内核栈指针 ; - I/O权限位图 ; - 中断栈表IST3.现代Windows进程的复杂性// Windows进程包含的丰富信息typedefstruct_EPROCESS{// 1. 基本标识HANDLE UniqueProcessId;LIST_ENTRY ActiveProcessLinks;// 2. 内存管理PVOID SectionBaseAddress;PPEB Peb;PVOID PageDirectoryPte;SIZE_T VirtualSize;// 3. 安全信息PACCESS_TOKEN Token;SECURITY_QUALITY_OF_SERVICE SecurityQos;// 4. 作业和会话PVOID Job;PVOID Session;// 5. 性能统计LARGE_INTEGER CreateTime;LARGE_INTEGER ExitTime;LARGE_INTEGER KernelTime;LARGE_INTEGER UserTime;// 6. 资源限制SIZE_T PeakVirtualSize;SIZE_T VirtualSize;ULONG HandleCount;// 7. 子系统信息PVOID Win32Process;PVOID Wow64Process;// 8. 线程管理LIST_ENTRY ThreadListHead;KAPC_STATE ApcState;// 9. 调试和异常PVOID DebugPort;PVOID ExceptionPort;// 10. 很多其他字段...// 总计32位Windows约100个字段64位更多}EPROCESS;// 对比x86 TSS的简单性// TSS只有约30个字段主要是寄存器状态五、实例对比创建和执行场景启动一个记事本程序Windows方式// 用户调用CreateProcessSTARTUPINFO si{sizeof(si)};PROCESS_INFORMATION pi;CreateProcess(C:\\Windows\\notepad.exe,NULL,NULL,NULL,FALSE,0,NULL,NULL,si,pi);// 内核执行// 1. 解析PE文件格式// 2. 创建EPROCESS对象// 3. 设置地址空间// 4. 创建PEB// 5. 加载DLLkernel32.dll, user32.dll等// 6. 创建主线程// 7. 设置线程上下文入口点notepad!WinMain// 8. 将线程放入就绪队列// 9. 调度器最终调度线程执行硬件任务方式假想; 1. 需要手动管理 ; - 分配TSS ; - 设置GDT描述符 ; - 加载可执行文件到内存 ; - 设置页表 ; 2. 创建TSS mov edi, NOTEPAD_TSS mov dword [edi TSS32.cr3], NOTEPAD_PAGE_DIR mov dword [edi TSS32.eip], NOTEPAD_ENTRY_POINT ; 3. 手动加载所有DLL代码到内存 ; 4. 设置所有段描述符 ; 5. 启动任务 jmp NOTEPAD_TSS_SELECTOR:0 ; 6. CPU自动 ; - 保存当前任务状态 ; - 加载notepad任务状态 ; - 开始执行 ; 问题没有文件系统、没有动态加载、没有系统调用机制六、总结它们不是同一个概念特性Windows进程软件抽象x86硬件任务硬件机制本质操作系统资源容器CPU任务切换机制实现软件数据结构EPROCESS硬件数据结构TSS创建系统调用CreateProcess设置TSSGDT描述符切换软件调度器KiSwapContext硬件自动JMP/CALL TSS状态保存选择性保存CONTEXT全部保存所有寄存器内存隔离分页CR3切换LDT分页段基址CR3灵活性高支持各种调度策略低固定机制现代使用广泛使用仅用于特权级栈切换复杂度高100字段低~30字段关键结论Windows进程是高级软件抽象不直接对应任何硬件机制x86硬件任务是低级硬件机制被现代操作系统有意避免使用Windows借用了一些硬件特性如TSS保存内核栈但完全重新设计了进程模型两者有相似目标任务隔离、状态保存但实现方式完全不同现代系统倾向于软件控制因为更灵活、可移植、可扩展类比说明Windows进程像是一个完整的公司有组织结构、资源、员工、规章制度x86硬件任务像是一个工作台有工具和材料但没有组织架构Windows进程管理包含硬件任务能做的所有事情但以更高级、更灵活的方式实现因此当我们在Windows应用程序中谈论进程时我们指的是Windows操作系统的进程概念而不是x86的硬件任务概念。前者是一个丰富、复杂的软件抽象后者是一个简单、固定的硬件机制。现代操作系统构建在前者之上而将后者仅用于特定的底层支持。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询