小编rov*_*ghn的帖子

(编写内核)如何修改中断描述符表?

我正在编写一个小内核,只是为了解决一些低级别的问题.现在,它在Virtual Box中启动,我可以在屏幕上显示文本,分配一些内存,以及其他非常基本的东西.它是用C++和一点点asm编写的.

我想探索的一件事是多任务背后的机制.据我了解,它是这样的:

  1. 内核初始化中断描述符表,以便定期发出中断(例如毫秒)并调用内核中定义的例程.
  2. 调用例程时,它可以决定将代码/数据段和堆栈指针设置为另一个程序上下文的指针,即"上下文切换".

因此,它在概念上似乎很简单,但我知道细节会变得更加毛茸茸.我发现了一些在线的东西,但术语变化很大,而且这些例子似乎来自我没有的上下文(比如Linux内核中的内容).

但是,设置描述符表的方式似乎是这样的:

  1. 将一些数据发送到PIC(outb以及什么不是)以初始化它.
  2. 在内存中准备一个中断表,其中包含指向所需例程的函数指针,注意这些函数可以作为信号处理程序.
  3. 用表加载表lidt.

但是,我找不到具体做这些事情,或者这是否正确.有没有人有一个困惑的内核作家的资源?

x86 kernel osdev context-switch interrupt-handling

13
推荐指数
1
解决办法
2583
查看次数

基于组件的游戏引擎设计中的事件处理

我想这个问题或它的变化会传递很多,所以如果我说的是重复的,答案在其他地方,请通知我.

我一直在研究游戏引擎设计,并且遇到了基于组件的实体模型.这听起来很有希望,但我仍在努力实施它.

我正在考虑一个系统,其中引擎安排了几个"子系统",它管理一些方面,如渲染,声音,健康,AI等.每个子系统都有一个与之关联的组件类型,就像健康的健康组件子系统."实体",例如NPC,门,某些视觉效果或播放器,简单地由一个或多个组件组成,这些组件一起为实体提供其功能.

我确定了四个主要的信息传递渠道:一个组件可以广播到其当前实体中的所有组件,一个组件可以广播到其子系统,一个子系统可以广播到其组件,一个子系统可以广播到其他子系统.

例如,如果用户想要移动他们的角色,他们会按一个键.此按键将由输入子系统拾取,然后输入子系统广播该事件并由播放器子系统拾取.然后,播放器子系统将此事件发送给所有播放器组件(以及这些组件组成的实体),并且这些播放器组件将与其自己的实体的位置组件通信以继续并移动.

所有这一切对于一个关键的新闻似乎有点啰嗦,我当然愿意改进这种架构.但无论如何,我的主要问题仍然存在.

至于事件本身,我考虑了事件在访客模式中的行为.我想要的重要性是,如果一个事件遇到它不支持的组件(因为在移动事件中没有与AI或健康直接相关),它将忽略该组件.如果一个事件没有找到它正在追踪的组件,那就没关系了.

访客模式几乎可行.但是,它需要我为每种类型的组件(即visitHealthComponent,visitPositionComponent等)提供虚函数,即使它与它们没有任何关系.我可以将这些函数留空(所以如果遇到这些函数,它会被忽略),但每次添加一个组件时我都要添加另一个函数.

我希望能够添加一个组件而不必将东西添加到其他地方,并添加一个事件而不会弄乱其他东西.

那么,我的两个问题:

  1. 在效率,灵活性等方面,我的设计是否可以改进?
  2. 处理事件的最佳方式是什么?

oop components visitor game-engine

10
推荐指数
1
解决办法
5266
查看次数

PHPUnit 提供程序无法使用依赖项

我正在使用 PHPUnit 3.4.9,但我在@depends注释方面遇到了一些问题。它的工作原理与示例中类似,但当生产者依赖提供者时就会中断。我不知道这是否意味着有效,但我的代码基本上采用以下形式:

<?php
    class StackTest extends PHPUnit_Framework_TestCase
    {
      /**
       * @dataProvider provider
       */
      public function testEmpty ($data)
      {
        $stack = array();
        $this->assertTrue(empty($stack));

        return $stack;
      }

      /**
       * @depends testEmpty
       */
      public function testPush (array $stack)
      {
        array_push($stack, 'foo');
        $this->assertEquals('foo', $stack[count($stack)-1]);
        $this->assertFalse(empty($stack));

        return $stack;
      }

      /**
       * @depends testPush
       */
      public function testPop (array $stack)
      {
        $this->assertEquals('foo', array_pop($stack));
        $this->assertTrue(empty($stack));
      }

      public function provider ()
      {
        return array(
           // Some testing data here...
        );
      }
    }
Run Code Online (Sandbox Code Playgroud)

上面的代码只是一个示例,但显示了我的代码的结构。运行时,它会跳过消费者测试,就像生产者失败一样。我期望对于提供者中的每组测试数据,生产者将使用该数据运行,并且其所有消费者也相应地运行。

php phpunit

6
推荐指数
1
解决办法
3328
查看次数

G ++不编译C++ 0x基于范围的for循环

我正在尝试使用G ++的一些新的C++ 0x功能.Lambdas auto和其他新功能就像魅力一样,但基于范围的for循环无法编译.这是我测试的程序:

#include <iostream>
#include <vector>

int main ()
{
    std::vector<int> data = { 1, 2, 3, 4 };

    for ( int datum : data )
    {
        std::cout << datum << std::endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

我编译它:

g++ test.cpp -std=c++0x
Run Code Online (Sandbox Code Playgroud)

我也试过gnu++0x,但输出是一样的.

这是输出:

test.cpp: In function ‘int main()’:
test.cpp:8:21: error: expected initializer before ‘:’ token
test.cpp:12:1: error: expected primary-expression before ‘}’ token
test.cpp:12:1: error: expected ‘;’ before ‘}’ token
test.cpp:12:1: error: expected primary-expression before ‘}’ token
test.cpp:12:1: error: …
Run Code Online (Sandbox Code Playgroud)

c++ g++ c++11

6
推荐指数
1
解决办法
5388
查看次数

包含boost库时未定义的引用

我正在尝试使用boost的asio库,但我一直在获取未定义的引用.我在Windows上使用Dev-Cpp,它使用的是G ++编译器.

我使用boostpro computing的安装程序为Boost 1.42.0 [ link ] 安装了boost .这是我试图制作的测试程序的代码:

#include <boost/asio.hpp>
#include <iostream>

int main(void){
    std::cout << "Boost test." << std::endl;
}
Run Code Online (Sandbox Code Playgroud)

我的提升包括标题,/include并且所有用于boost的lib都是/lib直接编译的.似乎有一些图书馆没有被收录,但我不知道是什么.我试过包括一些可能的但无济于事.

我得到的链接器错误类型是:

[Linker error] undefined reference to `boost::system::get_system_category()'
[Linker error] undefined reference to `boost::system::get_generic_category()' 
[Linker error] undefined reference to `boost::system::get_generic_category()' 
[Linker error] undefined reference to `boost::system::get_generic_category()' 
[Linker error] undefined reference to `boost::system::get_system_category()' 
[Linker error] undefined reference to `WSACleanup@0' 
[Linker error] undefined reference to `WSAStartup@8' 
[Linker error] undefined reference to `boost::system::get_system_category()' 
ld returned 1 …
Run Code Online (Sandbox Code Playgroud)

c++ boost boost-asio

2
推荐指数
1
解决办法
2467
查看次数