小编dat*_*elk的帖子

特权指令,陷阱和系统调用之间的关系

我试图了解虚拟机监视器(VMM)如何虚拟化CPU.

我现在的理解是,当CPU处于用户模式时,即将执行特权指令时,CPU会发出保护错误中断.在像C这样的高级语言中,特权指令包含在系统调用中.例如,当应用程序需要当前日期和时间(与I/O设备交互的指令具有特权)时,它会调用某个库函数.此库函数的汇编版本包含一个名为"int"的指令,该指令会在CPU中生成陷阱.CPU从用户模式切换到特权模式,并跳转到操作系统提供的陷阱处理程序.每个系统调用都有自己的陷阱处理程序.在此示例中,陷阱处理程序从硬件时钟读取日期和时间并返回,然后CPU将自身从特权模式切换到用户模式.(来源:http://elvis.rowan.edu/~hartley/Courses/OperatingSystems/Handouts/030Syscalls.html)

但是,我不太确定这种理解是否正确.本文提到的(特权)的x86指令POPF不会导致陷阱的概念,从而为VMM复杂的事情:http://www.csd.uwo.ca/courses/CS843a/papers/intro-vm.pdf.根据我的理解,当用户程序显式调用而不是通过系统调用时,popf指令不应该导致陷阱,而应该导致保护错误中断.

所以我的两个具体问题是:

  • 当用户程序在CPU处于用户模式时执行特权指令时会发生什么?
  • 用户程序执行系统调用时会发生什么?

virtualization x86 operating-system computer-architecture

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

在Objective-C中"推"动画

我有两个视图:A和B. A位于屏幕顶部,B位于屏幕底部.

当用户按下按钮时,视图B使用EaseInEaseOut贝塞尔曲线向上动画,直到达到y = 0.当B到达目的地时,它应该在A到达A时向上推A.换句话说,当B有在从底部到顶部的过渡期间传递了一个y坐标(A的y原点+高度),A应该粘在B上,所以看起来B向上推A.

到目前为止我尝试了什么:

  • 用户按下按钮后立即将目标+选择器注册到CADisplayLink.在此选择器内,通过访问其presentationLayer请求视图B的y坐标,并相应地调整A的y坐标.然而,这种方法证明不够准确:presentationLayer的帧落后于B在屏幕上的当前位置(这可能是因为-presentationLayer重新计算动画视图在当前时间的位置,这需要超过1帧) .当我增加B的动画持续时间时,此方法可以正常工作.
  • 用户按下按钮后立即将目标+选择器注册到CADisplayLink.在此选择器内,通过求解x =经过时间/动画持续时间(应该返回行进的距离/总距离)的贝塞尔方程来计算B的当前y坐标.我使用了Apple的开源UnitBezier.h(http://opensource.apple.com/source/WebCore/WebCore-955.66/platform/graphics/UnitBezier.h).但是,结果不正确.

关于我接下来可以尝试什么的任何建议?

iphone core-animation objective-c ios

8
推荐指数
1
解决办法
1007
查看次数

在reloadData之后隐藏UICollectionView内容

我有一个UICollectionView显示来自的内容NSFetchedResultsController.collectionView有一个部分,在该部分中有一个标题.标头允许用户过滤集合视图中的内容.标题视图的委托连接到UIViewController包含集合视图.

一旦用户更改其中一个过滤器选项,标题视图就会向其委托发出消息.委托变化对谓词fetchRequestNSFetchedResultsController和电话-[NSFetchedResultsController performFetch:].接下来,必须通知集合视图内容已更改.这可以通过多种方式完成,但我喜欢的方式是通过调用-[UICollectionView reloadData].不幸的是,这种方法不能像预期的那样工作:当我调用这个方法时,整个集合视图就会消失.以下是我就此问题所做的一些观察:

  1. 所有单元格和第一个(也是唯一的)部分的标题都将其hidden标志设置为YES.我尝试通过设置符号断点来跟踪导致此问题的方法-[UIView setHidden:].不幸的是,它从未打破UICollectionView子视图.
  2. collectionView:cellForItemAtIndexPath:在打电话后从未打过电话-[UICollectionView reloadData].
  3. collectionView:viewForSupplementaryElementOfKind:atIndexPath:在打电话后从未打过电话-[UICollectionView reloadData].
  4. numberOfSectionsInCollectionView: 仍然被调用并仍然返回正确的数字(在这种情况下为1).
  5. collectionView:numberOfItemsInSection 仍然被调用并仍然返回正确的数字(在这种情况下为1).

到目前为止我尝试过解决这个问题的方法:

  1. 禁用实例上的所有自定义(sectionInset,itemSize)UICollectionViewFlowLayout
  2. 禁用实例separatorInset上的所有自定义()UICollectionView
  3. 将标题添加为子视图UICollectionView并相应地进行设置contentInset.不幸的是UICollectionView,当我这样做时,不喜欢我的自动布局约束和崩溃.
  4. 打电话[UICollectionView reloadSections:]而不是[UICollectionView reloadData].这有效,但我不喜欢动画.
  5. 在第一部分中手动插入,删除和更新行.只要包含集合视图的视图控制器在内存中,这就可以工作.一旦解除分配,应用程序就会因断言失败而崩溃-[UICollectionView dealloc].

以这种方式设置标头感觉不对,但遗憾的UICollectionView是没有像UITableView(tableHeaderView)这样的全局标头.

iphone cocoa-touch objective-c ios uicollectionview

5
推荐指数
1
解决办法
1502
查看次数

键值观察NSCache

我希望在NSCache实例中某个键对应的对象发生更改时收到通知.我试过没有运气使用键值观察(控制台不记录任何东西).

- (void)viewDidLoad
{
    [super viewDidLoad];
    [self.cache addObserver:self forKeyPath:@"myKey" options:NSKeyValueObservingOptionNew context:NULL];
    [self.cache setObject:@"myObject" forKey:@"myKey"];
}

- (void)observeValueForKeyPath:(NSString *)keyPath ofObject:(id)object change:(NSDictionary *)change context:(void *)context
{
    NSLog(@"KEYPATH CHANGED: %@", keyPath);
}
Run Code Online (Sandbox Code Playgroud)

如何观察NSCache的内容?

iphone objective-c key-value-observing ios nscache

3
推荐指数
1
解决办法
1099
查看次数