问题标签 [task-switching]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
0 回答
12 浏览

android - 我的一个应用程序调用另一个应用程序后显示错误的屏幕

我的应用程序(应用程序 A)可以选择将位置数据发送到

  • 谷歌地图,或
  • 我编写的用于显示地形图的应用程序(应用程序 B)

应用 A 中调用这两个应用的代码基本相同

使用调用应用程序 B (mymap) 的选项后,任务切换器为应用程序 A 和应用程序 B 显示相同的缩略图(应用程序 B 中显示的地图)。如果我然后使用任务切换器重新打开应用程序 A 它打开并显示来自应用程序 B 的地图。如果我从主屏幕或应用程序抽屉重新打开应用程序 A,也会发生同样的情况。我必须使用后退按钮让应用程序 A 显示它自己的屏幕。

如果我从应用程序 A 调用 Google 地图,任务切换器会显示与我预期不同的缩略图:Google 地图的 Google 地图缩略图和应用程序 A 的应用程序 A 屏幕的缩略图,这就是我重新打开应用程序 A 时看到的内容。

如何在调用应用程序 B 时获得与调用 Google 地图时相同的行为?

0 投票
0 回答
320 浏览

assembly - 如何通过 x86 TSS 正确设置任务切换

我正在尝试开发一个基本内核,我想让它执行任务切换到我从附加磁盘加载到内存中的一些代码。

我已经尝试按照英特尔手册中的第 7 章进行操作,但我的尝试似乎都导致了三重故障。

特别是,我认为我的分页设置有问题。我希望切换到的任务使用自己的任意页面映射运行,因此您将在下面的代码片段中看到,此任务中的虚拟地址 0x0 应该映射到物理地址 0x2000000,这也是我加载的位置编码。

我尝试设置分页定义了一个整数数组,就像在setup_page_directory_and_page_tables用户和内核页表和页目录的函数中一样。内核页面映射是身份映射,而用户不是。需要注意的一件有趣的事情是,当我更改分页设置,使用户的页面映射也是身份映射时,任务切换成功。

完整的代码可以在这里获取(注意:相关分支是 dev 分支)。

毫米.c

任务.c

switch_task永远不会因为 CPU 三重故障而返回。我意识到在设置用户的 TSS 时,简单地复制当前段寄存器和堆栈指针可能不是我想要做的,但应用程序中的第一条指令是jmp $这样,因为我没有跨段跳转或使用堆栈我以为它仍然可以工作。

任务.h

kernel_entry.asm

内核编译为:

内核.ld

加载的应用程序是 app.s (没关系)

该应用程序编译为:

我通过使用 Qemu 命令手动检查 0x2000000 处的字节xp /16i 0x2000000并将它们与 hexdump -C app.bin -n 16. 有趣的是, 的输出objdump -d app.bin虽然包含类似于原始 app.s 的部分,但似乎没有匹配的字节。它以f3 0f 1e ..哪个 app.bin 开头7f 45 4c ...。我会把它贴在这里,剪掉一些部分。

objdump -d app.bin(截断):

我观察到的另一件事:在我的调查中,objdump 输出 DID 匹配hexdump并且xp字节(我不确定我做了什么现在阻止这种情况发生:() 我观察到在将二进制文件加载到 0x2000000 后,0x2000000 + offset_of_main (在本例中为 0x13d)处的指令最终将是:

一世。jmp 0x2000000 + offset_of_main如果我使用jmp $(我希望它是jmp offset_of_main

ii. jmp 0x2000000 + arbitrary_constant如果我使用jmp arbitrary_constantegjmp 0x13djmp 0x200013d在我运行时出现xp /16 0x200013d(我本来希望它是jmp 0x13d

(我认为这是相关的,因为我假设 Qemu 通过 xp 报告的内容正是 CPU 看到指令的方式。)