📄 system.c
字号:
/******************************************************
Copyright(c) 版权所有,1998-2005微逻辑。保留所有权利。
******************************************************/
/*****************************************************
文件说明:操作系统系统功能
版本号:2.0.0
开发时期:2000
作者:李林
修改记录:
******************************************************/
#include <ewindows.h>
#include <coresrv.h>
#include <epcore.h>
#include <sysintr.h>
#include <oemfunc.h>
#include <epalloc.h>
extern BOOL _InitHandleMgr( void );
extern BOOL _InitSemMgr( void );
extern BOOL _InitAPIMgr( void );
extern BOOL _InitKernelHeap( void );
extern BOOL InitRegistry( void );
extern BOOL InitComputerName( void );
extern void RegisterInlineProgram( void );
extern BOOL InitElfModuleMgr( void );
extern BOOL InitAlarmMgr( void );
#ifdef VIRTUAL_MEM
extern void Seg_GetInfo( LPSEGMENT lpSeg,
LPDWORD lpdwAvailVirtual,
LPDWORD lpdwReserve,
LPDWORD lpdwCommit
);
#endif
#ifdef INLINE_PROGRAM
// ********************************************************************
// 声明:static BOOL RegisterDefaultShell( void )
// 参数:
// 无
// 返回值:
// 假如成功,返回TRUE;否则,返回失败
// 功能描述:
// 注册默认的shell程序,这是一个内联版的程序
// 引用:
//
// ********************************************************************
static BOOL RegisterDefaultShell( void )
{
extern int CALLBACK Shell_WinMain( HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow );
KL_RegisterApplication( "shell", Shell_WinMain, NULL ); // 注册到程序管理器
return TRUE;
}
#endif //INLINE_PROGRAM
// ********************************************************************
// 声明:BOOL InitialKingmosSystem( void * lpParam )
// 参数:
// IN lpParam - 保留(为NULL)
// 返回值:
// 假如成功,返回TRUE;否则,返回失败
// 功能描述:
// 初始化Kingmos系统
// 引用:
// 被start.c调用
// ********************************************************************
BOOL InitialKingmosSystem( void * lpParam )
{
extern void InitRomFsd(void);
extern BOOL InitialCoreServer( void );
extern BOOL InitialVirtualMgr( void );
extern BOOL KHeap_Init( void );
KL_DebugOutString( "InitialKingmosSystem entry.\r\n" );
lpParam = 0; // 去掉编译器警告
std_srand( KL_GetTickCount() ); //初始化内核随机数种子
//KL_DebugOutString( "ISR_Init.\r\n" );
if( ISR_Init() == FALSE ) // 中断服务管理器初始化
return FALSE;
//KL_DebugOutString( "_InitSysMem.\r\n" );
if( _InitSysMem() == FALSE ) // 初始化系统主内存
return FALSE;
//KL_DebugOutString( "KHeap_Init.\r\n" );
if( KHeap_Init() == FALSE ) //初始化快堆管理器
return FALSE;
//KL_DebugOutString( "InitScheduler.\r\n" );
if( InitScheduler() == FALSE ) // 初始化调度器
return FALSE;
//KL_DebugOutString( "_InitSemMgr.\r\n" );
if( _InitSemMgr() == FALSE ) //初始化信号量管理器
return FALSE;
//KL_DebugOutString( "InitHandleMgr.\r\n" );
if( _InitHandleMgr() == FALSE ) //初始化句柄管理器
return FALSE;
#ifdef VIRTUAL_MEM
//KL_DebugOutString( "InitialVirtualMgr.\r\n" );
if( InitialVirtualMgr() == FALSE ) //初始化虚存管理器
return FALSE;
#endif //VIRTUAL_MEM
//KL_DebugOutString( "_InitKernelHeap.\r\n" );
if( _InitKernelHeap() == FALSE ) //初始化动态堆管理器
return FALSE;
//KL_DebugOutString( "_InitAPIMgr.\r\n" );
if( _InitAPIMgr() == FALSE ) //初始化API服务管理器
return FALSE;
#ifndef INLINE_PROGRAM
//KL_DebugOutString( "InitRomFsd.\r\n" );
InitRomFsd(); //初始化ROM文件系统
#endif //INLINE_PROGRAM
//KL_DebugOutString( "InitialCoreServer.\r\n" );
if( InitialCoreServer() == FALSE ) //初始化核心服务功能
return FALSE;
//KL_DebugOutString( "InitComputerName.\r\n" );
if( InitComputerName() == FALSE )
{
return FALSE;
}
#ifndef INLINE_PROGRAM
//KL_DebugOutString( "InitElfModuleMgr.\r\n" );
if( InitElfModuleMgr() == FALSE )
{
return FALSE;
}
#endif
//KL_DebugOutString( "InitAlarmMgr.\r\n" );
if( InitAlarmMgr() == FALSE )
{
return FALSE;
}
//内核初始化完成,启动shell
#ifdef INLINE_PROGRAM
//KL_DebugOutString( "InstallSystemServer.\r\n" );
if( RegisterDefaultShell() == FALSE )
return FALSE;
//KL_DebugOutString( "run shell.exe...\r\n" );
KL_LoadApplication( "shell", NULL );
#else
KL_DebugOutString( "run shell.exe...\r\n" );
#ifdef __CHECK_MEM
{
extern int startCheckMem;
startCheckMem = 1;
}
#endif
KL_CreateProcess( "\\Kingmos\\shell.exe", NULL, NULL, FALSE, 0, NULL, NULL, NULL, NULL, NULL );
#endif
KL_DebugOutString( "InitialKingmosSystem leave.\r\n" );
return TRUE;
}
//查询所有的服务是否许可挂起
#define DEBUG_DoPowerQuerySuspend 1
static BOOL CALLBACK DoPowerQuerySuspend( APIINFO * lpAPI, LPVOID lpParam )
{
// CALLSTACK cs;
CALLSTACK * lpcs = KHeap_Alloc( sizeof( CALLSTACK ) );
BOOL bRetv = FALSE;
if( SwitchToProcess( lpAPI->lpProcess, lpcs ) )
{
lpcs->dwCallInfo |= CALL_ALLOC;
DEBUGMSG( DEBUG_DoPowerQuerySuspend, ( "DoPowerQuerySuspend call pServerHandler(%s).\r\n", lpAPI->lpProcess->lpszApplicationName ) );
bRetv = ( (PSERVER_HANDLER)lpAPI->lpServerCtrlInfo->pServerHandler )( lpAPI->hServer, SCC_BROADCAST_POWER, SBP_APMQUERYSUSPEND, 0 );
DEBUGMSG( DEBUG_DoPowerQuerySuspend, ( "DoPowerQuerySuspend pServerHandler(%s) return(%d).\r\n", lpAPI->lpProcess->lpszApplicationName, bRetv ) );
SwitchBackProcess();
}
KHeap_Free( lpcs, sizeof( CALLSTACK ) );
return bRetv;
}
// ********************************************************************
// 声明:void WINAPI KL_PowerOffSystem( void )
// 参数:
// 无
// 返回值:
// 无
// 功能描述:
// 执行关掉电源工作
// 引用:
//
// ********************************************************************
#define DEBUG_KL_PowerOffSystem 1
void WINAPI KL_PowerOffSystem( void )
{
DEBUGMSG( DEBUG_KL_PowerOffSystem, ( "KL_PowerOffSystem entry.\r\n" ) );
LOCK_SCHE();//锁住调度器
// power off
//EnumServerHandler( SCC_BROADCAST_POWEROFF, 0, 0 );//向所有服务程序广播关电源事件
//向所有服务程序请求关电源许可
DEBUGMSG( DEBUG_KL_PowerOffSystem, ( "KL_PowerOffSystem: call EnumServer.\r\n" ) );
if( EnumServer( DoPowerQuerySuspend, 0 ) )
{
//向所有服务程序广播关电源事件
DEBUGMSG( DEBUG_KL_PowerOffSystem, ( "KL_PowerOffSystem: call SBP_APMSUSPEND.\r\n" ) );
EnumServerHandler( SCC_BROADCAST_POWER, SBP_APMSUSPEND, 0 );
//执行物理关电源工作
DEBUGMSG( DEBUG_KL_PowerOffSystem, ( "KL_PowerOffSystem: call OEM_PowerOff.\r\n" ) );
OEM_PowerOff( 0 );
// 电源已打开。power on
// 向所有服务程序广播开电源事件
DEBUGMSG( DEBUG_KL_PowerOffSystem, ( "KL_PowerOffSystem: OEM_PowerOff return.\r\n" ) );
DEBUGMSG( DEBUG_KL_PowerOffSystem, ( "KL_PowerOffSystem: call SBP_APMRESUMESUSPEND.\r\n" ) );
EnumServerHandler( SCC_BROADCAST_POWER, SBP_APMRESUMESUSPEND, 0 );
}
else
{
DEBUGMSG( DEBUG_KL_PowerOffSystem, ( "KL_PowerOffSystem: call SBP_APMQUERYSUSPENDFAILED.\r\n" ) );
EnumServerHandler( SCC_BROADCAST_POWER, SBP_APMQUERYSUSPENDFAILED, 0 );
}
UNLOCK_SCHE();//解开调度器
DEBUGMSG( DEBUG_KL_PowerOffSystem, ( "KL_PowerOffSystem leave.\r\n" ) );
//#endif
}
// ********************************************************************
// 声明:
// 参数:
// IN
// 返回值:
//
// 功能描述:
//
// 引用:
//
// ********************************************************************
BOOL WINAPI KL_ExitSystem(
UINT uFlags, // shutdown operation
DWORD dwReserved // reserved
)
{
switch( uFlags )
{
case EXS_POWEROFF:
KL_PowerOffSystem();
return TRUE;
case EXS_REBOOT:
case EXS_SHUTDOWN:
//KL_SetEvent( hDeviceExitEvent );
EnumServerHandler( SCC_BROADCAST_SHUTDOWN, 0, 0 );
#ifdef EML_WIN32
{
extern void CPU_Reset( void );
CPU_Reset();
while(1);
}
#else
OEM_PowerOff( 0 );//执行物理关电源工作
break;
#endif
default:
return FALSE;
}
return TRUE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -