📄 pm.c
字号:
}/****************************************************************************REMARKS:Return the drive letter for the boot drive.****************************************************************************/char PMAPI PM_getBootDrive(void){ /* TODO: Return the boot drive letter for the OS. Normally this is 'c' */ /* for DOS based OS'es and '/' for Unices. */ return '/';}/****************************************************************************REMARKS:Return the path to the VBE/AF driver files (legacy and not used).****************************************************************************/const char * PMAPI PM_getVBEAFPath(void){ return PM_getNucleusConfigPath();}/****************************************************************************REMARKS:Return the path to the Nucleus driver files.****************************************************************************/const char * PMAPI PM_getNucleusPath(void){ /* TODO: Change this to the default path to Nucleus driver files. The */ /* following is the default for Unices. */ char *env = getenv("NUCLEUS_PATH"); return env ? env : "/usr/lib/nucleus";}/****************************************************************************REMARKS:Return the path to the Nucleus configuration files.****************************************************************************/const char * PMAPI PM_getNucleusConfigPath(void){ static char path[256]; strcpy(path,PM_getNucleusPath()); PM_backslash(path); strcat(path,"config"); return path;}/****************************************************************************REMARKS:Return a unique identifier for the machine if possible.****************************************************************************/const char * PMAPI PM_getUniqueID(void){ /* TODO: Return a unique ID for the machine. If a unique ID is not */ /* available, return the machine name. */ static char buf[128]; gethostname(buf, 128); return buf;}/****************************************************************************REMARKS:Get the name of the machine on the network.****************************************************************************/const char * PMAPI PM_getMachineName(void){ /* TODO: Return the network machine name for the machine. */ static char buf[128]; gethostname(buf, 128); return buf;}/****************************************************************************REMARKS:Return a pointer to the real mode BIOS data area.****************************************************************************/void * PMAPI PM_getBIOSPointer(void){ /* TODO: This returns a pointer to the real mode BIOS data area. If you */ /* do not support BIOS access, you can simply return NULL here. */ if (!zeroPtr) zeroPtr = PM_mapPhysicalAddr(0,0xFFFFF,true); return (void*)(zeroPtr + 0x400);}/****************************************************************************REMARKS:Return a pointer to 0xA0000 physical VGA graphics framebuffer.****************************************************************************/void * PMAPI PM_getA0000Pointer(void){ static void *bankPtr; if (!bankPtr) bankPtr = PM_mapPhysicalAddr(0xA0000,0xFFFF,true); return bankPtr;}/****************************************************************************REMARKS:Map a physical address to a linear address in the callers process.****************************************************************************/void * PMAPI PM_mapPhysicalAddr( ulong base, ulong limit, ibool isCached){ /* TODO: This function maps a physical memory address to a linear */ /* address in the address space of the calling process. */ /* NOTE: This function *must* be able to handle any phsyical base */ /* address, and hence you will have to handle rounding of */ /* the physical base address to a page boundary (ie: 4Kb on */ /* x86 CPU's) to be able to properly map in the memory */ /* region. */ /* NOTE: If possible the isCached bit should be used to ensure that */ /* the PCD (Page Cache Disable) and PWT (Page Write Through) */ /* bits are set to disable caching for a memory mapping used */ /* for MMIO register access. We also disable caching using */ /* the MTRR registers for Pentium Pro and later chipsets so if */ /* MTRR support is enabled for your OS then you can safely ignore */ /* the isCached flag and always enable caching in the page */ /* tables. */ return NULL;}/****************************************************************************REMARKS:Free a physical address mapping allocated by PM_mapPhysicalAddr.****************************************************************************/void PMAPI PM_freePhysicalAddr( void *ptr, ulong limit){ /* TODO: This function will free a physical memory mapping previously */ /* allocated with PM_mapPhysicalAddr() if at all possible. If */ /* you can't free physical memory mappings, simply do nothing. */}/****************************************************************************REMARKS:Find the physical address of a linear memory address in current process.****************************************************************************/ulong PMAPI PM_getPhysicalAddr(void *p){ /* TODO: This function should find the physical address of a linear */ /* address. */ return 0xFFFFFFFFUL;}void PMAPI PM_sleep(ulong milliseconds){ /* TODO: Put the process to sleep for milliseconds */}int PMAPI PM_getCOMPort(int port){ /* TODO: Re-code this to determine real values using the Plug and Play */ /* manager for the OS. */ switch (port) { case 0: return 0x3F8; case 1: return 0x2F8; } return 0;}int PMAPI PM_getLPTPort(int port){ /* TODO: Re-code this to determine real values using the Plug and Play */ /* manager for the OS. */ switch (port) { case 0: return 0x3BC; case 1: return 0x378; case 2: return 0x278; } return 0;}/****************************************************************************REMARKS:Allocate a block of (unnamed) shared memory.****************************************************************************/void * PMAPI PM_mallocShared( long size){ /* TODO: This is used to allocate memory that is shared between process */ /* that all access the common Nucleus drivers via a common display */ /* driver DLL. If your OS does not support shared memory (or if */ /* the display driver does not need to allocate shared memory */ /* for each process address space), this should just call PM_malloc. */ return PM_malloc(size);}/****************************************************************************REMARKS:Free a block of shared memory.****************************************************************************/void PMAPI PM_freeShared( void *ptr){ /* TODO: Free the shared memory block. This will be called in the context */ /* of the original calling process that allocated the shared */ /* memory with PM_mallocShared. Simply call PM_free if you do not */ /* need this. */ PM_free(ptr);}/****************************************************************************REMARKS:Map a linear memory address to the calling process address space. Theaddress will have been allocated in another process using thePM_mapPhysicalAddr function.****************************************************************************/void * PMAPI PM_mapToProcess( void *base, ulong limit){ /* TODO: This function is used to map a physical memory mapping */ /* previously allocated with PM_mapPhysicalAddr into the */ /* address space of the calling process. If the memory mapping */ /* allocated by PM_mapPhysicalAddr is global to all processes, */ /* simply return the pointer. */ /* NOTE: This function must also handle rounding to page boundaries, */ /* since this function is used to map in shared memory buffers */ /* allocated with PM_mapPhysicalAddr(). Hence if you aligned */ /* the physical address above, then you also need to do it here. */ return base;}/****************************************************************************REMARKS:Map a real mode pointer to a protected mode pointer.****************************************************************************/void * PMAPI PM_mapRealPointer( uint r_seg, uint r_off){ /* TODO: This function maps a real mode memory pointer into the */ /* calling processes address space as a 32-bit near pointer. If */ /* you do not support BIOS access, simply return NULL here. */ if (!zeroPtr) zeroPtr = PM_mapPhysicalAddr(0,0xFFFFF); return (void*)(zeroPtr + MK_PHYS(r_seg,r_off));}/****************************************************************************REMARKS:Allocate a block of real mode memory****************************************************************************/void * PMAPI PM_allocRealSeg( uint size, uint *r_seg, uint *r_off){ /* TODO: This function allocates a block of real mode memory for the */ /* calling process used to communicate with real mode BIOS */ /* functions. If you do not support BIOS access, simply return */ /* NULL here. */ return NULL;}/****************************************************************************REMARKS:Free a block of real mode memory.****************************************************************************/void PMAPI PM_freeRealSeg( void *mem){ /* TODO: Frees a previously allocated real mode memory block. If you */ /* do not support BIOS access, this function should be empty. */}/****************************************************************************REMARKS:Issue a real mode interrupt (parameters in DPMI compatible structure)****************************************************************************/void PMAPI DPMI_int86( int intno, DPMI_regs *regs){ /* TODO: This function calls the real mode BIOS using the passed in */ /* register structure. If you do not support real mode BIOS */ /* access, this function should be empty. */}/****************************************************************************REMARKS:Issue a real mode interrupt.****************************************************************************/int PMAPI PM_int86( int intno, RMREGS *in, RMREGS *out){ /* TODO: This function calls the real mode BIOS using the passed in */ /* register structure. If you do not support real mode BIOS */ /* access, this function should return 0. */ return 0;}/****************************************************************************REMARKS:Issue a real mode interrupt.****************************************************************************/int PMAPI PM_int86x( int intno, RMREGS *in, RMREGS *out, RMSREGS *sregs){ /* TODO: This function calls the real mode BIOS using the passed in */ /* register structure. If you do not support real mode BIOS */ /* access, this function should return 0. */ return 0;}/****************************************************************************REMARKS:Call a real mode far function.****************************************************************************/void PMAPI PM_callRealMode( uint seg, uint off, RMREGS *in, RMSREGS *sregs){
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -