小编Ale*_*hol的帖子

使用iret切换到用户模式

我正在编写一个小型操作系统,它将在用户模式下执行一些代码(权限级别3).从该用户级代码,我想将中断调回到打印消息的操作系统.现在我真的不关心我的中断处理程序如何接受参数或类似的东西,我真的只想要一个中断处理程序来通知我(用户)代码已执行.

我的问题是:如何在用户模式下运行代码?我有一个函数,它设置一个带有代码段和数据段的本地描述符表(都具有用户模式权限).我不明白是我应该如何这些段装入cs,ssds.我成功加载了我的LDT,但我不知道如何实际使用它.我听说我应该使用iret,但我不知道具体如何.

我的另一个问题是我的中断处理程序应该如何工作.假设我为向量号0x40安装了一个中断处理程序,我想打印"你好,用户模式!".我知道如何设置中断处理程序,但我不完全理解从用户模式进入内核中断处理程序时如何切换上下文.我知道cs寄存器必须更改,因为我的例程将从我的IDT条目中指定的代码段运行.我也明白堆栈选择器可能也会改变,但我无法确定.

有人可以向我解释当调用中断门时会发生什么情况变化吗?

x86 nasm osdev

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

使用ARC返回自动释放的CFTypeRef

我是LLVM和Objective-C自动引用计数的新手,并且有一个关于从Objective-C函数返回CGImageRefs的问题.在手动引用计数的时代,可以简单地将CGImageRef转换为id自动释放它,然后返回原始的CGImageRef.使用ARC,我知道您可以指示ARC系统自动释放并返回您的可保留对象,但我没有看到为CFTypeRefs执行此操作的方法.

以下是我禁用ARC的方法:

- (CGImageRef)image {
    CGImageRef myImage;
    id myImageID = (id)myImage;
    [myImageID autorelease];
    return myImage;
}
Run Code Online (Sandbox Code Playgroud)

所以,我想基本上创建一个方法,使用ARC,返回一个不属于调用者的CGImageRef.如果有更好的方法做同样的事情,我对所有想法都持开放态度.我知道UIImage这与CGImage财产有关.

编辑:虽然为特定文件禁用ARC是一种有效的方法,但我更喜欢在整个代码中使用纯ARC.这在与其他人共享特定文件的特定代码时非常方便,因为他们不需要更改任何给定文件的构建设置.为了利用ARC系统自动释放CFTypeRef,您可以这样做:

__attribute__((ns_returns_autoreleased))
id CGImageReturnAutoreleased (CGImageRef original) {
    // CGImageRetain(original);
    return (__bridge id)original;
}
Run Code Online (Sandbox Code Playgroud)

然后只需return (__bridge CGImageRef)CGImageReturnAutoreleased(myImage)返回一个自动释放的图像.

core-graphics objective-c core-foundation ios automatic-ref-counting

9
推荐指数
1
解决办法
3268
查看次数

优雅地获取并重新设置后台应用程序焦点以进行对话

我正在开发一个小型Mac应用程序,它通常会在后台无形地运行.但是,当用户在其桌面或Finder中的其他位置重命名文件时,应用程序的主要功能将发挥作用.发生这种情况时,我想提供一个类似于用户通过Finder更改文件扩展名时出现的对话框.因为这需要我的应用程序获得最前面的焦点(而不是Finder),所以当用户在我的对话框中点击"OK"时,我想将Finder作为最前面的应用程序返回.

我目前正在使用Apple的Process Manager功能SetFrontProcessWithOptions(),但在以下场景中遇到了麻烦:

  • 用户在其工作区中的某个位置打开Finder窗口
  • 然后用户点击他们的桌面,使窗口失焦.
  • 用户在其桌面上重命名文件
  • 我的应用程序使自己专注于使用 SetFrontProcessWithOptions()
  • 用户点击OK对话框,我的应用程序使用FinderSetFrontProcessWithOptions()
  • 当Finder重新聚焦时,它会聚焦用户之前打开的窗口,尽管事实上当Finder之前最前面时它没有聚焦.

如果在重命名桌面上的文件之前在其他空间中打开Finder窗口,这会非常烦人:在这种情况下,在对话框中点击"确定"会导致Finder自动切换空格并返回窗口.

这只是因为SetFrontProcessWithOptions()函数的性质,它只能聚焦给定应用程序的窗口.由于桌面显然不算作窗口,因此该功能会找到另一个要关注的窗口,尽管用户以前没有关注该窗口.

如果有人对如何进行某种基于对话的事情有更好的想法,那将是很好的,甚至可能根本不需要聚焦和不专注Finder.

编辑:我发现在大多数情况下修复此行为有点丑陋的方法,但它涉及脚本桥,并且在重命名其中的项目时它不会重新聚焦桌面.这是我执行此操作的代码:

FinderApplication * app = [SBApplication applicationWithBundleIdentifier:@"com.apple.finder"];
if (!app || ![app isRunning]) {
    SetFrontProcessWithOptions(&processSerial, kSetFrontProcessFrontWindowOnly);
    return;
}
SBElementArray * selArray = app.selection.get;
if ([selArray count] == 0) {
    SetFrontProcessWithOptions(&processSerial, kSetFrontProcessFrontWindowOnly);
    return;
} else {
    FinderWindow * window = [[[selArray objectAtIndex:0] container].get containerWindow].get;
    if ([window isKindOfClass:NSClassFromString(@"FinderFinderWindow")]) {
        SetFrontProcessWithOptions(&processSerial, kSetFrontProcessFrontWindowOnly);
    } else {
        // TODO: …
Run Code Online (Sandbox Code Playgroud)

cocoa objective-c nswindow

9
推荐指数
1
解决办法
1206
查看次数

使用LLDT并为其配置GDT

我正在开发一个小型操作系统,它将为每个进程使用单独的本地描述符表.我知道我需要使用该lldt指令从我的GDT加载LDT段.我已经使用有效的GDT在保护模式下运行我的内核,但我无法弄清楚我的LDT的GDT条目应该是什么样子.我知道它的基地址应该指向我的LDT,但我不知道特权级别和其他属性应该是什么.这是代表我的GDT中的LDT条目的NASM代码:

localTable equ $-gdt            ; GDT entry #5 (selector 20h)
dw 0x1FF                        ; limit to 64 descriptors
dw 0x8000                       ; base address
db 0x0
db 0x89                         ; probably incorrect...
db 0x1f                         ; possibly incorrect...
db 0x0
Run Code Online (Sandbox Code Playgroud)

如果您不熟悉NASM语法,则此表条目的基址为0x8000,限制为511(总共512个字节,或64个条目).我在i486程序员的参考手册中已经阅读了关于GDT和LDT的部分,但我无法完全理解我的GDT条目应该是什么样子.

无论如何,我像这样加载LDT:

mov ax, 0x20
lldt ax
Run Code Online (Sandbox Code Playgroud)

此代码使处理器生成一般保护错误(我通过中断处理它).我想知道两件事:

1)我是否在GDT中正确描述了我的LDT?如果没有,需要改变什么?2)LLDT由于LDT本身存在无效选择器,指令是否会失败?我读了LLDT指令规范,在我看来它甚至没有读取LDT的内存,但我只是想确定LLDT没有失败,因为我的LDT数据中有一个拼写错误.

x86 assembly nasm osdev

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

Python程序中的'StringVar'问题

我正在尝试使用Tkinter在Python中编写一个非常简单的UI.我在StringVar班上遇到了一个小问题.问题是,当我运行python脚本时,我在初始化StringVar变量的行上得到一个错误.我已经编写了一个示例程序来解决这个问题,我想让它工作:

from Tkinter import *

var = StringVar()
var.set('test');
Run Code Online (Sandbox Code Playgroud)

当我通过python运行它时,我看到这个错误:

$ python test.py
Traceback (most recent call last):
  File "test.py", line 3, in <module>
    var = StringVar()
  File "/usr/lib/python2.6/lib-tk/Tkinter.py", line 254, in __init__
    Variable.__init__(self, master, value, name)
  File "/usr/lib/python2.6/lib-tk/Tkinter.py", line 185, in __init__
    self._tk = master.tk
AttributeError: 'NoneType' object has no attribute 'tk'
Exception AttributeError: "StringVar instance has no attribute '_tk'" in <bound method StringVar.__del__ of <Tkinter.StringVar instance at 0xb73cc80c>> ignored
Run Code Online (Sandbox Code Playgroud)

我觉得这是我的Python安装的一个问题,但可能是我做错了什么?我在Ubuntu Linux上使用python版本2.6.5,如果这有所作为.

python string user-interface tkinter widget

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

在后台线程中加载UIImage会导致ImageIO错误

我正在开发一个iOS项目,它从后台线程中的URL加载UIImages,并在水平分页滚动视图中显示它们.此行为应该模仿iPhone的本机照片库应用程序.我以一种我认为应该工作的方式设置所有内容,但是在主UI图形上下文中绘制UIImages时,我偶尔会在控制台中看到此消息:

ImageIO: <ERROR>  CGImageReadSessionGetCachedImageBlockData *** CGImageReadSessionGetCachedImageBlockData: bad readSession [0x685e590]
Run Code Online (Sandbox Code Playgroud)

尽管出现此错误,但似乎应用程序功能完美,并且图像按预期绘制.我应该简单地忽略这个"错误",还是应该改变我在后台线程中加载图像的方法?目前,我使用UIImage initWithData:方法在后台线程中加载图像:

- (void)backgroundLoadThread:(NSURL *)url {
    @autoreleasepool {
        NSData * imageData = [NSData dataWithContentsOfURL:url];
        UIImage * theImage = [[UIImage alloc] initWithData:imageData];
        if ([[NSThread currentThread] isCancelled]) {
#if !__has_feature(objc_arc)
            [theImage release];
#endif
            return;
        }
        [self performSelectorOnMainThread:@selector(loadComplete:)
                               withObject:theImage waitUntilDone:NO];
    }
}
Run Code Online (Sandbox Code Playgroud)

我的loadComplete:方法只是保留作为实例变量传递的图像,稍后在视图的drawRect:方法中绘制.在drawRect:,我正在使用UIImage drawInRect:方法,它似乎是控制台中错误消息的实施者.但是,使用图像的基础CGImageRef CGContextDrawImage仍会导致相同的错误.完整的源代码可以在这个项目的Github存储库中的ANAsyncImageView.m文件中找到.

编辑:我现在已经更改后台线程从文件加载CGImage,然后回调到主线程,使用免费桥接传递CGImageRef.不幸的是,这仍然会产生同样的问题,向我证明UIImage imageWithCGImage:必须以某种方式保留对原始CGImage的引用.查看上面链接的文件中的代码(到Github存储库)以获取完整代码:

NSData * imageData = [NSData dataWithContentsOfURL:url];
CGDataProviderRef provider = CGDataProviderCreateWithCFData((CFDataRef)imageData);
CGImageRef loaded = …
Run Code Online (Sandbox Code Playgroud)

cocoa-touch core-graphics uikit uiimage ios

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