WinCE5读核笔记(二) 系统调用
来源:互联网 发布:golang.org host 编辑:程序博客网 时间:2024/06/06 00:11
KernelInit是MMU启用以后,一段软件结构的初始化函数。它负责system call函数表的建立,和NK.exe这个进程的构建,当然也包括NK.exe的第一次以进程的身份调度运行。就此一个类似于《黑客帝国》的虚拟环境就被建立起来了。或者说由单一线程启动的环境,转为一个多线程并发执行的环境。不过KernelInit只是完成建立这个环境,真的虚拟环境开始不是这个函数的内容。
这个函数最值得看的地方是system call函数表的建立。因为其他的部分是call相应的函数,还看不见具体实现。
SystemAPISets是个32元素的结构体数组。可以看出微软将系统调用函数分成了32组,而每组APT set有一个函数表。
const CINFO *SystemAPISets[NUM_SYSTEM_SETS];
这就是SystemAPISets这个全局变量的声明。它是指针数组。
typedef struct cinfo {
char acName[4]; /* 00: object type ID string */
uchar disp; /* 04: type of dispatch */
uchar type; /* 05: api handle type */
ushort cMethods; /* 06: # of methods in dispatch table */
const PFNVOID *ppfnMethods;/* 08: ptr to array of methods (in server address space) */
const DWORD *pdwSig; /*
PPROCESS pServer; /* 10: ptr to server process */
} CINFO; /* cinfo */
CINFO最重要的成员变量就是ppfnMethods,它是真正的函数列表。
看看我们最常用的一些函数在哪里?
SystemAPISets[SH_WIN32] = &cinfWin32;
而cinfWin32如下这样定义:
const CINFO cinfWin32 = {
"Wn32",
DISPATCH_I_KPSL,
0,
sizeof(Win32Methods)/sizeof(Win32Methods[0]),
Win32Methods,
};
真正的函数列表是Win32Methods,
const PFNVOID Win32Methods[] = {
(PFNVOID)SC_Nop,
(PFNVOID)SC_NotSupported,
(PFNVOID)SC_CreateAPISet, // 2
(PFNVOID)EXT_VirtualAlloc, // 3
(PFNVOID)EXT_VirtualFree, // 4
(PFNVOID)EXT_VirtualProtect, // 5
(PFNVOID)EXT_VirtualQuery, // 6
(PFNVOID)SC_VirtualCopy, // 7
(PFNVOID)0, // 8 Was SC_LoadLibraryW
(PFNVOID)SC_FreeLibrary, // 9
(PFNVOID)SC_GetProcAddressW, // 10
(PFNVOID)SC_ThreadAttachOrDetach, // 11 Was SC_ThreadAttachAllDLLs
(PFNVOID)0, // 12 Was SC_ThreadDetachAllDLLs
(PFNVOID)SC_GetTickCount, // 13
XXXXXXXX还有很多就不一一列举了。
将系统调用分组的一个重要原因是DISPATCH_I_KPSL这个定义,它定义了这些函数在什么进程空间里,以什么方式调用到。
- WinCE5读核笔记(二) 系统调用
- WinCE5读核笔记
- WinCE5读核笔记(四) 重新整理启动过程
- WinCE5读核笔记(五) KCall的实现
- 系统调用(二)
- WinCE5读核笔记(三) 进程控制块(PCB)的初始化
- WinCE5读核笔记(一) exception vector到底在哪里?
- Linux内核笔记(二) 系统调用
- 关于系统调用(二)
- 操作系统from清华大学向勇,陈渝 笔记(二)操作系统的启动、中断、异常、系统调用
- Windows XP/2003 系统调用(二)
- Java调用系统命令学习(二)
- Windows XP/2003 系统调用(二)
- NFS系统read调用过程(二)
- NFS系统write调用过程(二)
- linux内核--系统调用(二)
- linux系统调用fork()总结(二)
- [文件系统]read系统调用剖析(二)
- WinCE5读核笔记(一) exception vector到底在哪里?
- [修改]公历转农历
- Install Oracle 10g and 11g in Windows XP SP2.
- winform中通用的数据库操作类
- c/c++中变量存放的区域
- WinCE5读核笔记(二) 系统调用
- 正式落户CSDN博客
- 炸乱
- 我想我做
- 我想我做
- 解决Visual Studio 2008来生VisualBasic 项目的性能问题
- 半年了,总结一下
- 校内网开放平台协议被指霸王条款
- 2008年7月12号,晴天,今天是博士生涯我过的第一个星期六,昨天和太太的打电话的场景还沥沥在目,太太真的是我不可或缺的人