问题标签 [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.
android - 我的一个应用程序调用另一个应用程序后显示错误的屏幕
我的应用程序(应用程序 A)可以选择将位置数据发送到
- 谷歌地图,或
- 我编写的用于显示地形图的应用程序(应用程序 B)
应用 A 中调用这两个应用的代码基本相同
使用调用应用程序 B (mymap) 的选项后,任务切换器为应用程序 A 和应用程序 B 显示相同的缩略图(应用程序 B 中显示的地图)。如果我然后使用任务切换器重新打开应用程序 A 它打开并显示来自应用程序 B 的地图。如果我从主屏幕或应用程序抽屉重新打开应用程序 A,也会发生同样的情况。我必须使用后退按钮让应用程序 A 显示它自己的屏幕。
如果我从应用程序 A 调用 Google 地图,任务切换器会显示与我预期不同的缩略图:Google 地图的 Google 地图缩略图和应用程序 A 的应用程序 A 屏幕的缩略图,这就是我重新打开应用程序 A 时看到的内容。
如何在调用应用程序 B 时获得与调用 Google 地图时相同的行为?
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_constant
egjmp 0x13d
会jmp 0x200013d
在我运行时出现xp /16 0x200013d
(我本来希望它是jmp 0x13d
)
(我认为这是相关的,因为我假设 Qemu 通过 xp 报告的内容正是 CPU 看到指令的方式。)