ReactOS学习笔记--编译和调试

前言

本文为该系列博客的第一篇,本人学习ReactOS的新手一枚,因为很喜欢Windows NT系列的操作系统,一直想要深入的学习和研究一下其内部的原理,以前很早就看到有人说开源操作系统ReactOS架构和Windows NT极其相似,那么此种情况下,用ReactOS来当做学习的对象最好不过了。

 

为什么要学习ReactOS?

我现在本身正在从事软件开发的职业,见识了程序中各种五花八门的技术,但是这些技术的本身来讲,是由Windows NT内核提供的支持,那么如果在熟悉操作系统结构的情况下,对以后的编程以及代码编写将会有很多的好处。正好打算以后想往游戏反外挂的方向去发展,所以学习操作系统结构更是势在必行了。

 

ReactOS

ReactOS(官方网站:http://www.reactos.org)是一款完全开源的仿Windows NT 5 Service Pack 2(5.2)的操作系统,其内核结构和Windows Server 2003的内核结构基本一致。

 

下载

目前我使用的版本为0.4.10-dev, 代码Git地址:(https://github.com/reactos/reactos)。以下为我使用的详细的编译版本:                                                                                    

 

编译

编译整体来说其实非常简单,只是可能我的搜索技巧有问题,在编译过程中一直没有找到有效的方法。编译通过加能正常调试用了好几天的时候。编译方式目前提供了三种方式:

  • 1. ReactOS提供的编译环境;
  • 2. 基于VS IDE命令行的编译方式;
  • 3. 生成VS sln的方式进行编译;

基于 ReactOS提供的编译环境方式:

该方式非常简单,只需要从ReactOS官方网站下载编译环境,然后下载安装然后就可以执行编译了。地址(ReactOS开发环境下载),ReactOS学习笔记--编译和调试_第1张图片

打开编译环境之后,执行源码根目录下configure.cmd

ReactOS学习笔记--编译和调试_第2张图片

完成之后,进入生成的output-MinGW-i386

ReactOS学习笔记--编译和调试_第3张图片

然后再执行Ninja, 这时候就会进入编译阶段了, 等待编译完成之后,所有的模块就编译完成了。

这时候再执行ninja livecd, 或者 ninja bootcd.就会生成可引导的ISO文件了。

ReactOS学习笔记--编译和调试_第4张图片, 这时候用这个文件就可以放到虚拟机里面运行测试了。

 

2. 基于VS IDE命令行的编译方式和生成VS sln的方式进行编译

为什么这两种方式要放在一起讲,因为其实他们都是使用的相同的方式进行的编译,一个是基于命令行,都是VS IDE环境进行的编译,它们在编译的过程中遇到的问题都是类似的。

我这里选择的是VS 2015进行编译的,还可以使用其他的环境进行编译。

 

首先打开VS 2015 开发者命令行并切换到ReactOS源码的根目录下:

ReactOS学习笔记--编译和调试_第5张图片

这里分开讲一下,

1. 基于VS IDE命令行的编译方式, 使用和ReactOS类似的方法进行的配置和编译,首先执行configure.cmd, 然后切换到生成的同级目录output-VS-i386下,执行ninja,

2. 生成VS sln的方式进行编译, 他的方式略微不同,同样打开VS 2015开发者命令行,并切换到源码根目录下,并执行"configure.cmd VSSoution" , 这个时候用VS开发环境去打开output-VS-i386-sln下的REACTOS.sln编译,也可以在命令行内使用msbuild REACTOS.sln /m执行编译。

 

编译和运行的问题

额外的设置

以上为没有出错的编译过程, 不出错的情况下,整个过程完成不过20多分钟。

第一种基于ReactOS编译环境编译的文件,一般不会出现问题;1W多个文件10多分钟就编译完成了。但是我的目的并不是为了编译和运行它, 我还需要对操作系统进行调试,ReactOS提供的编译环境并不支持直接用VS或者Windbg调试,(没有PDB文件)。所以我们需要编译一个调试的版本能让VS环境或者Windbg进行调试以观察流程。

 

在尝试过程中遇到了很多的错误,比如:错误报告说文件内文字编码无法识别,反正就是各种错误都出现了。最后都解决不了。 - -,大体错误如下:ReactOS学习笔记--编译和调试_第6张图片

f:\open_source\reactos\base\setup\usetup\lang/bg-BG.h: warning C4819: The file contains a character that cannot be represented in the current code page (936). Save the file in Unicode format to prevent data loss

f:\open_source\reactos\base\setup\usetup\lang/bg-BG.h(47): error C2001: newline in constant
f:\open_source\reactos\base\setup\usetup\lang/bg-BG.h(48): error C2059: syntax error: 'constant'
f:\open_source\reactos\base\setup\usetup\lang/bg-BG.h(56): error C2059: syntax error: '}'
f:\open_source\reactos\base\setup\usetup\lang/bg-BG.h(75): error C2001: newline in constant
f:\open_source\reactos\base\setup\usetup\lang/bg-BG.h(76): error C2059: syntax error: 'constant'

主要需要设置一下操作系统的一些选项并重启电脑,然后这些编译问题都可以被解决。

设置1:

ReactOS学习笔记--编译和调试_第7张图片

将当前操作系统的 locale设置为English, 并且你还需要安装一个英文的语言。

以前很多的国外项目编译都是切换一下这个locale就可以正常编译了,但是这一招对于ReactOS编译居然不好使。

 

设置2(修改当前时区并重启):

ReactOS学习笔记--编译和调试_第8张图片

以上设置修改并重启电脑之后,重新去编译项目你会发现都没有问题了。

 

无法加载VS编译的ISO问题

使用VS编译的ISO文件无法在虚拟机里面成功引导,估计某个地方有点儿什么问题。如果不想用VS编译的文件,那么使用第二个编译方式编译的出来的文件就可以满足调试需求,如果一定要使用VS里面编译的文件来测试等等。那么以下方法可以解决VS编译的ISO无法加载问题。

首先使用ReactOS编译环境编译一个可引导的ISO,此处以为bootcd.iso,编译完成之后,使用软碟通(ISO编辑软件)打开这个ISO, 然后将里面的文件都删除,并将VS编译的ISO的文件替换进去,最后保存。 保存之后就可以用这个ISO来引导和运行了。 

因为编译环境的原因,无法直接使用VS编译的文件去替换部分的ReactOS编译环境编译的文件,需要完全替换才行正常运行。否则就会出现错误。

 

调试

调试我目前使用的方式是Windbg和VS调试的,其他的调试方式请参见《ReactOS Debugging》。

关于Windbg的调试设置, 官网原文如下:

To take full advantage of WinDBG, you need to compile ReactOS with MSVC to get PDB symbols. For MSVC builds this is the default debugging style. If you want to use gcc builds, you need to compile with WINKD option set to TRUE (you can either use CMake-GUI and edit the value after configuring and then reconfigure, or you can edit the default value in the options.cmake file) Another possibility is to replace ntoskrnl.exe and kdcom.dll built with the WINKD = TRUE option. You can also replace kdcom.dll with the one from Windows 2003, which has a few more features such as reconnect and break-in which do not work properly with ReactOS's own kdcom.

大概意思就是,如果要使用Windbg进行调试的话,那么需要重新编译KDCOM.exe和NTOSKRNL.exe,并且需要在编译的时候加入已处理定义:_WINKD_=1,或者将Windows 2003里面的kdcom.dll 替换到\ReactOS\system32\kdcom.dll也行。

 

VS调试ReactOS

我比较喜欢使用VS进行调试ReactOS,因为这样可以直接进行源码级调试,就像直接用VS写的程序一样方便,而且同时还支持Windbg命令。

VS调试的准备:

首先下载适合VS使用的WDK环境,下载地址:https://docs.microsoft.com/zh-cn/windows-hardware/drivers/download-the-wdk

安装完成之后,打开VS是这样的,

ReactOS学习笔记--编译和调试_第9张图片

首次运行需要去配置调试目标,

ReactOS学习笔记--编译和调试_第10张图片,

设置完成之后,使用VS附加功能,如下图所示:

ReactOS学习笔记--编译和调试_第11张图片

点击附加就进入等待状态了。

 

附上一张成功调试的图.

ReactOS学习笔记--编译和调试_第12张图片

 

结语

完成这些操作才仅仅是学习ReactOS的第一小步,同时也希望能遇到一样喜欢ReactOS,我们一起成长一起学习。

欢迎加群QQ群号:931238114, 备注:ReactOS学习, 希望大佬来入驻(PS:我还是新手).

下一篇帖子我会介绍ReactOS的启动流程,以及一些可能作为新手最关心的问题。

你可能感兴趣的:(ReactOS学习笔记)