自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

周寅的专栏

勤于思考,挖掘事物本质,追求思维的不断超越与思想的不断提升!

  • 博客(29)
  • 收藏
  • 关注

原创 C++必知系列(三)——对象内存模型

    C++最初只是一个带类的C,后来给类加了继承功能,有了继承,自然就发展出多态的概念。那么当定义一个C++类对象时,它的内存模型是怎样的呢?了解它的内存模型应该会让我们在编程时心中更有数。下面就依C++的自然发展顺序来简单探讨一下其类对象的内存模型。1. 无继承,无多态    这是最简单的情况,在C里有结构体,只是一个多数据类型的集合,C++的类最初做的就是将数据和其操作封装在一起,

2009-05-02 23:31:00 1431

原创 C++必知系列(二)——类型转换

    为了保持与C的兼容性,C++保留了C的所有类型转换约定与机制,在C里分隐式与显式类型转换,隐式类型转换有如下两种常见情况:1. 所有基本类型间;2. 所有类型指针与void*之间;在C++里,增加了三类隐式类型转换,前两种属于自定义隐式类型转换:1. 通过有参构造函数,将指定参数类型的对象隐式转换为构造函数调用创建的对象;class CA{public:  

2009-05-02 00:38:00 906

原创 C++必知系列(一)——构造/析构/赋值

一. 编译器何时为类生成合适的特殊默认函数      当声明如下一个空类时:                        class CA {};一般认为C++编译会在背后默默帮你生成5个函数:默认构造函数,拷贝构造函数,析构函数,赋值运算符重载函数,取地址运算符重载函数,结果类被扩展为如下形式:                       class CA()       

2009-04-29 23:37:00 987

转载 漫谈兼容内核之五:Kernel-win32的系统调用机制

 正如许多网友所言,要在Linux内核中实现Windows系统调用(或别的系统调用),最简单的办法莫过于把这些系统调用“搭载”在Linux系统调用上。具体又有几种不同的方法:    1. 为Linux系统调用ioctl()增加一些“命令码”,每个新的命令码都代表着一个Windows系统调用。    2. 为Linux增加一个新的系统调用、例如win32_syscall()、作为总的入口和载体,然后

2009-03-13 00:56:00 1160

转载 漫谈兼容内核之十一:Windows DLL的装入和连接

  在PE映像的装入和启动过程中,DLL的装入和连接是一个重要的环节。读者在上一篇漫谈中看到,Windows的DLL装入(除ntdll.dll外)和连接是通过ntdll.dll中的一个函数LdrInitializeThunk()实现的。在Wine中,这个环节也是通过一个同名的函数实现的,只不过这个函数不在ntdll.dll中,而是wine-kthread里面的一个函数。在ReactOS中则同样也是

2009-03-13 00:55:00 4293

转载 漫谈兼容内核之四:Kernel-win32的进程管理

     由于进程管理与对象管理不可分割,我在谈论Kernel-win32的对象管理时也谈到了一些有关进程管理的内容,例如对task_struct数据结构的扩充,以及对Linux内核有关代码所打的补丁。但是这还不够,还需要进一步讨论。    对于任何现代操作系统而言,进程(线程)管理都是一个十分重要的环节。Windows与Linux在这方面恰恰有着相当大的差异,有的是概念上的,有的是实现细节上的:

2009-03-13 00:55:00 1252

转载 漫谈兼容内核之十五:Windows线程的等待/唤醒机制

 对于任何一个现代的操作系统,进程间通信都是不可或缺的。    共享内存区显然可以用作进程间通信的手段。两个进程把同一组物理内存页面分别映射到各自的用户空间,然后一个进程往里面写,另一个进程就可以读到所写入的内容。所以,共享内存区天然就是一种进程间通信机制。但是这又是很原始的手段,因为这里有个读出方如何知道共享区的内容已经被写入方改变的问题。轮询,或者定期轮询,当然也是个办法,但是一般而言效率毕竟

2009-03-13 00:54:00 1896

转载 漫谈兼容内核之十四:Windows的跨进程操作

 Jeffrey Richter在他的“Advanced Windows”一书第18章“打破进程壁垒(Breaking Through Process Boundary Walls)”中讲述了一个有趣的实验,就是利用OpenProcess()、CreateRemoteThread()、VirtualAllocEx()、WriteProcessMemory()等等Win32 API函数从一个进程向另

2009-03-13 00:53:00 2090 1

转载 漫谈兼容内核之十三:关于“进程挂靠”

     上一篇漫谈在介绍APC机制时提到:线程在Windows内核中运行时有时候需要暂时“挂靠(Attach)”到别的进程的用户空间,即暂时切换到另一个进程的用户空间。这称为“进程挂靠”,因为用户空间是一个进程最主要的特征。    显然,要是当前线程的操作与用户空间无关、不需要访问用户空间,那么当时的用户空间到底是谁的用户空间根本就无关紧要,所以这必定发生在与用户空间有关的操作中。    一般而

2009-03-13 00:52:00 2011

转载 漫谈兼容内核之十七:再谈Windows的进程创建

     在漫谈之十中。我根据“Microsoft Windows Internals 4e”一书第六章的叙述介绍了Windows的进程创建和映像装入的过程。但是,由于缺乏源代码的支撑,这样的叙述对于只是想对此有个大致了解的读者固然不无帮助,可是对于需要实际从事研发、特别是兼容内核开发的读者就显得过于抽象笼统了。不幸,Windows内核的代码是不公开的,我们无法通过Windows内核的代码来确切地

2009-03-13 00:51:00 1428

转载 漫谈兼容内核之十六:Windows的进程间通信

 对于任何一个现代的操作系统,进程间通信都是其系统结构的一个重要组成部分。而说到Windows的进程(线程)间通信,那就要看是在什么意义上说了。因为正如“Windows的跨进程操作”那篇漫谈中所述,在Windows上一个进程甚至可以“打开”另一个进程,并在对方的用户空间分配内存、再把程序或数据拷贝过去,最后还可以在目标进程中创建一个线程、让它为所欲为。显然,这已经不只是进程间的“通信”,而是进程间

2009-03-13 00:49:00 2462

转载 漫谈兼容内核之十九:Windows线程间的强相互作用

     在现代的计算机系统中,一项作业(Job)往往需要多个进程或线程的协作,而操作系统则要为进程或线程间的协作提供基础设施和机制上的支持。操作系统、特别是内核,提供什么样的设施和手段,系统中的进程之间和线程之间就会有什么样的相互作用。如果把一个系统比作一个社会,那么系统中的进程和线程就好像是社会中的成员。成员的行为和成员之间的关系有其“社会性”的一面、即互相影响的一面。例如一个线程的调度优先级

2009-03-13 00:48:00 1896

转载 漫谈兼容内核之十二:Windows的APC机制

  前两篇漫谈中讲到,除ntdll.dll外,在启动一个新进程运行时,PE格式DLL映像的装入和动态连接是由ntdll.dll中的函数LdrInitializeThunk()作为APC函数执行而完成的。这就牵涉到了Windows的APC机制,APC是“异步过程调用(Asyncroneus Procedure Call)”的缩写。从大体上说,Windows的APC机制相当于Linux的Signal机

2009-03-13 00:47:00 3067

转载 漫谈兼容内核之十八:Windows的LPC机制

  LPC是“本地过程调用(Local Procedure Call)”的缩写。所谓“本地过程调用”是与“远程过程调用”即RPC相对而言的。其实RPC是广义的,RPC可以发生在不同的主机之间,也可以发生在同一台主机上,发生在同一台主机上就是LPC。所以在Unix语境下就没有LPC这一说,即使发生在同一台主机上也称为RPC。在历史上,RPC是“开放软件基金会(OSF)”设计和提出的一种用以实现“Un

2009-03-13 00:45:00 4849

转载 漫谈兼容内核之七:Wine的二进制映像装入和启动

  上一篇漫谈中介绍了几种二进制可执行映像的识别方法,而识别的目的当然是为了要装入并启动这些映像的执行。映像的装入和启动一般总是和创建进程相连系,所以本来就是个相当复杂的过程。而对于Wine,则在进程创建方面又增添了一些额外的复杂性。    为什么呢?我们这样来考虑:在Windows或ReactOS中,创建进程是由CreateProcessW()完成的,系统中的“始祖”进程就是个Windows进程

2009-03-13 00:44:00 2325

转载 漫谈兼容内核之六:二进制映像的类型识别

 除了某些嵌入式系统之外,一般而言操作系统都有个在创建(或转化成)新进程时如何装入目标程序的二进制映像并启动其运行的问题。由于在计算机技术的发展历史中并没有形成某种单一的、为所有操作系统和编译/连接工具所共同遵循的标准,这个装入/启动的过程就不可避免地呈现出多样性。而且,即使是同一种操作系统,也会在其发展的过程中采用多种不同的目标映像格式和装入机理。而动态连接库技术的出现,则又使这个过程进一步地复

2009-03-13 00:43:00 1086

转载 漫谈兼容内核之九:ELF映像的装入(二)

 上一篇漫谈介绍了在通过execve()系统调用启动一个ELF格式的目标映像时发生于Linux内核中的活动。简而言之,内核根据映像头部所提供的信息把目标映像映射到(装入)当前进程用户空间的某个位置上;并且,如果目标映像需要使用共享库的话,还要(根据映像头部所提供的信息)将所需的“解释器”的映像也映射到用户空间的某个位置上,然后在从系统调用返回用户空间的时候就“返回”到解释器的入口,下面就是解释器的

2009-03-13 00:42:00 1647

转载 漫谈兼容内核之二十六:Windows的结构化异常处理(三)

  用户空间的异常机制是对于系统空间的异常机制的模拟。在内核中,并非所有的异常都是一来就进入“基于SEH框架(Frame-Based)”的异常处理, 而是先进入_KiTrap14()等等类似于向量中断的入口,在那里可以被拦截进行一些优先的处理,例如页面换入和对Copy-On-Write页面的处 理等等。这些处理是全局性质的,而不属于某个SEH域。这相当于是一层全局性的过滤。只有不属于这个层次的异常

2009-03-13 00:40:00 2995

转载 漫谈兼容内核之八:ELF映像的装入(一)

上一篇漫谈中介绍了Wine的二进制映像装入和启动,现在我们来看看ELF映像的装入和启动。    一般而言,应用软件的编程不可能是“一竿子到底”、所有的代码都自己写的,程序员不可避免地、也许是不自觉地、都会使用一些现成的程序库。对于C语言的编程,至少C程序库是一定会用到的。从编译/连接和运行的角度看,应用程序和库程序的连接有两种方法。一种是固定的、静态的连接,就是把需要用到的库函数的目标(二进制)代

2009-03-13 00:40:00 2358

转载 漫谈兼容内核之二十五:Windows的结构化异常处理(二)

 先看调用参数。异常纪录块ExceptionRecord就是前面准备好的;指针ExceptionFrame是NULL,这是个 KEXCEPTION_FRAME结构指针,但是从代码中看这只是为PowerPC芯片而设的,用于保存一些附加寄存器的内容,386架构的处理器芯片无 此要求;而陷阱框架指针Tf指向堆栈上因异常而形成的框架,我们在前面倒是称之为“异常框架”。此外,PreviousMode为Ker

2009-03-13 00:38:00 1098

转载 漫谈兼容内核之二十四:Windows的结构化异常处理(一)

  结构化异常处理(Structured Exception Handling),简称SEH,是Windows操作系统的一个重要组成部分。在ReactOS内核的源代码中,特别是在实现系统调用的代码中,读者已经看到很多类似于这样的代码:    if(MaximumSize != NULL && PreviousMode != KernelMode)   {     _SE

2009-03-13 00:36:00 1238

转载 漫谈兼容内核之二:关于kernel-win32的对象管理

近来屡有网友提到一个旨在将Wineserver移入内核的开源项目kernel-win32;有问及其本身,希望能对其代码作一些分析、讲解的,也有问及兼容内核与此项目之间关系的。所以从这篇漫谈开始就来谈谈kernel-win32。首先,兼容内核项目应当从所有(能找到的)相关开源项目吸取营养,有时候甚至就采取“拿来主义”,反正都是开源项目,只要遵守有关的规定就行。从这个意义上说,我们对于kernel-w

2009-03-13 00:09:00 920

转载 漫谈兼容内核之三:Kernel-win32的文件操作

 上一篇漫谈中分析/介绍了Kernel-win32的对象管理机制。在各种对象类型中,文件显然是最重要、最复杂(就其操作而言)的类型。如果说像“信号量”之类的简单对象还有可能独立地加以实现,那么像文件这样的复杂对象这就不太现实,并且实际上也不合适了。所以,本文的目的就是通过几个典型文件操作的实现介绍kernel-win32是怎样把Windows用于文件操作的系统调用“嫁接”到Linux内核中的有关成

2009-03-13 00:08:00 867

转载 漫谈兼容内核之十:Windows的进程创建和映像装入

   关于Windows的进程创建和映像装入的过程,“Microsoft Windows Internals 4e”一书的第六章中有颇为详细的说明。本文就以此为依据,夹译、夹叙、夹议地作一介绍。书中说,创建进程的过程分成六个阶段,发生于操作系统的三个部分中,那就是:Windows客户端即某个应用进程的包括Kernel32.dll在内的动态连接库,Windows的“执行体”、即内核(确切地说是内核的

2009-03-13 00:07:00 1246

转载 漫谈兼容内核之二十一:Windows进程的用户空间

  进程的用户空间是应用软件活动的舞台,所以搞清楚Windows进程用户空间的格局和轮廓对于深入理解Windows进程的运行有着重要的意义。而对于兼容内核的开发者,则这个问题更是非搞清楚不可,因为开发兼容内核的意图就是要让Windows应用软件得以在Linux系统上运行。其实,在前面的一些漫谈中,随着当时话题的开展也曾讲到过有关这个问题的一些大概,但是一方面只是散见于各处,不够集中;另一方面也不够

2009-03-13 00:06:00 1875

转载 漫谈兼容内核之二十三:关于TLS

 TLS是“线程局部存储(Thread Local Storage)”的缩写,“Local”这个词有“局部”、“本地”的意思,所以也可以说是“线程本地存储”。顾名思义,这就是局部于唯一的线程、为具体线程所“私用、专用”的存储空间。这里所说的“空间”并不是“用户空间”、“系统空间”那个意义上的空间,而是指用户空间中个别变量、数组、或数据结构所占据的存储空间。    我们知道,线程并不独立拥有用户空间

2009-03-13 00:04:00 2236

转载 漫谈兼容内核之二十二:Windows线程的调度和运行

  了解Windows线程的系统空间堆栈以后,还有必要对Windows线程的调度、切换、和运行也有所了解。当然,就兼容内核的开发而言,内核的线程调度/切换/运行机制只能有一套,而且必定是基本上沿用Linux的这套机制,而不可能在一个内核中有两套调度/运行机制。但是对于Windows这套机制的了解对于兼容内核的开发也很重要,并且还是必须的。举例来说,大家都知道在Windows系统中段寄存器FS在用户

2009-03-12 23:59:00 3420

转载 漫谈兼容内核之二十:Windows线程的系统空间堆栈

在计算机技术的发展史上,堆栈的发明有着划时代的意义。从那以后,实际上已经不再存在可以脱离堆栈而运行的程序。我们从堆栈的用途和内容可以看出其重要性: l 记录子程序调用的轨迹,使嵌套的(多层的)子程序调用成为可能。 l 通过堆栈传递子程序调用参数,使程序设计得以简化。要是不能通过堆栈传递参数,实际上就不会有现代的程序设计。 l 在堆栈上为子程序内部的“局部变量”分配空间,这既使“模块化程序设计

2009-03-12 23:56:00 1312

原创 VC-CRT调试功能

        基于VC系列工具做开发的程序员肯定对C运行库(以下简称CRT))概念不陌生,平时编写的大部分C/C++程序都需要静态或动态链接CRT,编译器一般将CRT作为默认库链接,不需要显式设置,可能大部分人使用CRT的功能仅限于一些工具类函数的调用,像字符串类,日期时间类,文件类,输入输出类,操作系统接口包装类等,却忽略了CRT强大的调试功能,本篇想简要介绍一下CRT提供的重要调试支持,很多

2008-12-07 15:32:00 2091

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除