小弟最近在看Windows核心编程,对于第三章的内核非常不解。疑问如下:
(1)内核拥有哪些特权?为什么它有那些特权?
(2)我们平常所谓的内核都在一个进程中吗?内核进程是不是也拥有4G的虚拟地址空间,或者说内核根本就不使用虚拟地址空间?
(3)内核代码可以随意访问一般程序的虚拟地址空间中的内容吗?
(4)API术语一般代码还是内核代码?如果是一般代码,它又是怎么进入内核代码的?
(5)我们的程序怎样才能拥有和内核同样高的权限?欢迎大家发表评论,共同探讨!谢谢

解决方案 »

  1.   

    1 内核是操作系统中的,操作系统想让它拥有最高的权限,它就有了
    (让它运行在ring0)4 API也是ring3的,但API一般通过调用运行在ring0的驱动完成
    当用户模式程序需要读取设备数据时,它就调用Win32 API函数,如ReadFile:Win32子系统模块(如KERNEL32.DLL)通过调用平台相关的系统服务接口实现该API,而平台相关的系统服务将调用内核模式支持例程。在ReadFile调用中,调用首先到达系统DLL(NTDLL.DLL)中的一个入口点,NtReadFile函数。然后这个用户模式的NtReadFile函数接着调用系统服务接口,最后由系统服务接口调用内核模式中的服务例程,该例程同样名为NtReadFile。5网上很多从ring3跳得ring0的
      

  2.   

    内核有操作系统维护,运行在ring0,具有最高的权限
      

  3.   

    API,表面上是这个函数,实际最终实现都是NTXXX,通过内核函数来实现的,因而可以访问到内核
    当然,也可以从ring3跳到ring0
      

  4.   

    (1)内核所拥有的特权就是ring0级的特权。他是由系统维护并创建,所以会有比较高的权限。
    (2)内核并不是在一个进程中,或者说你这种说法是完全错误的。每一个进程都有4G的虚拟空间可以使用。但是高2G或高1G的地址空间是你所不能使用的(我是说编一个ap程序)。这里边就存放系统创建的所有的内核对象。
    (3)答案是可以,但要是特定进程上下文中。也就说,当前的低2G中是某一个进程的空间。
    (4)api 就好像一个窗户,你把要求递进去,他把结果传出来。你在ring3级,窗户里边就是ring0级。一般进入ring0级是通过中断来完成的。
    (5)我们的程序在正常情况下永远也不会有ring0级别。
      

  5.   

    joncooper(小强) :按你的说法,每个应用程序的2G-4G里面的内容都是一样的了,是不是?
    所有的应用程序都通过内存映射文件机制共享2G-4G空间的内容。?大家说的系统究竟指的时是哪几个进程,我们可以通过资源管理器看见吗?我问一个比较弱智的问题,大家别见笑,我见有ring0,ring3,那么有没有ring1,ring2之类的?
      

  6.   

    对,我认为2G-4G的内容是一样的。
    最重要的系统进程是system。
    也有ring1,ring2。但ms没有用。但他至少是定义了。
      

  7.   

    应用程序分配的4G虚拟内存中,有2G是被系统占用了的,其他的2G才给应用程序自己使用,当然这个大小可以通过一些方法来调整的
      

  8.   

    系统需要这个地址空间,供内核代码、设备驱动程序代码、设备I / O高速缓存、非页面内存池的分配和进程页面表等使用。实际上M i c r o s o f t将内核压缩到这个2 G B空间之中
      

  9.   

    就是关注,打个标记,日后自己好找。请查阅CSDN的使用帮助。
      

  10.   

    以下答案不一定完全正确,仅供参考:(1)内核可以修改一些特殊的寄存器,可以调用部分只有在内核模式下能够调用的CPU指令,之所以拥有这样的特权是因为现在的CPU在设计时也要结合操作系统的安全性进行考虑,因此能够通过一些特殊的方法切换模式,至少我了解到ARM是这样的(2)实际上一个进程的执行在不同的时候可以分别处于内核态和用户态,但Windows是将核心的操作较集中地在一些特殊的进程中处理,但普通的进程也是可以通过特定的方法切换到内核态的,对于内核来说更多的是区分分页内存或非分页内存,应该和虚拟地址空间不完全是同一概念(3)虚拟地址空间实际上是通过硬件结合软件的一个映射过程来完成的,只要它愿意,它是可以根据设计原则来访问任意的存储空间(4)API 是指 Application Programming Interface,你也可以将 DDK 中在内核态中使用的函数称为 API,如 ZwXXX, NtXXX, 你可以将他们理解为内核态的,如果要仔细理解系统内核态与用户态的层次问题,不妨看看Windows NT 的 WDM 驱动程序模型,或许会有些帮助(5)在 Windows NT 系统中建议按照系统的 WDM 之类的规范通过驱动程序等方法来获取更高的权限
      

  11.   

    Intel CPU 分四个权限等级 ,windows仅用ring0 和ring 3.前者的权限最大,解决软件权限的最好方法就是写驱动,当然如果不是windows xp sp2和windows 2003 sp1的话,最简单的就是(不用驱动)\Device\PhysicalMemory漏洞进入ring0,不过有了新的sp补订包,当然也可以用修改windows的加载器 NTLDR的IDT GDT之类的东东,你可以分析win2000源代码,更改gidt特权就可以了,其实也有内核级的api,均以KeXXX、PsXXX、ZwXXX、NtXXX,的native api,普通api的调用都要通过调用这些native api来完成功能,大多是未公开的,你可以看看泄露的win2000源代码研究,这些api要动态加载。呵呵,这是windows 的内核文件ntoskrnl.exe和hal.dll,里面东西很好,对应源代码的private文件夹下的东东