如果我尝试使用多个--num-cpus=8
内核,例如 16、32 或 64,终端将保持空白。
在提交 2a9573f5942b5416fb0570cf5cb6cdecba733392 和 Linux 内核 4.16 处使用 gem5 进行了测试。
相关主题:https ://www.mail-archive.com/gem5-users@gem5.org/msg15469.html
如果我尝试使用多个--num-cpus=8
内核,例如 16、32 或 64,终端将保持空白。
在提交 2a9573f5942b5416fb0570cf5cb6cdecba733392 和 Linux 内核 4.16 处使用 gem5 进行了测试。
相关主题:https ://www.mail-archive.com/gem5-users@gem5.org/msg15469.html
如果我在 Ciro 的回答中添加更多内容,则由于这行代码,gem5 中的当前 GICv2 模型默认支持单核。如果不启用gem5ExtensionsEnabled
,它不会highest_int
用接收中断号更新,因此接收到的中断不会被发布到指定的 cpu 以调用处理程序。也就是说,没有跳转到中断处理程序。另外,即使我们打开gem5ExtensionsEnabled
,我认为它最多可以支持 4 个核心,因为 和 的默认值INT_BITS_MAX
分别itLines
是 32 和 128(请参阅此); 它检查跨 4 个内核的每个内核的 32 条中断线。例如,假设一个系统具有 16 个内核,并且 cpu 5 执行循环。另外,假设另一个核心(比如核心 11)已经有一个比这更高优先级的中断。然后,循环将忽略来自核心 11 的另一个中断,因为循环索引x
最多可以增长到 3。
要打开gem5ExtensionsEnabled
,您可以将选项传递--param='system.realview.gic.gem5_extensions=True'
给您的命令,如 Ciro 所述。但是,请注意,该参数用于在此处haveGem5Extensions
设置变量,而不是设置,仅当固件代码在 GICD_TYPER 偏移处将一些数据(0x200)写入 GIC 分配器寄存器时才启用(请参阅此)。 gem5ExtensionsEnabled
较新的方法:GICv3
由于 GICv3 于 2019 年 2 月在https://gem5-review.googlesource.com/c/public/gem5/+/13436实施,您可以直接使用它。
GICv3 硬件本身支持超过 8 个 CPU,因此它可以正常工作。
截至 2020 年 7 月 gem5 3ca404da175a66e0b958165ad75eb5f54cb5e772,GICv3 是默认的 GIC,VExpress_GEM5_V2
但默认的 fs.py 机器VExpress_GEM5_V2
位于该提交处,因此您只需选择它:
fs.py --machine-type VExpress_GEM5_V2
一旦我这样做了,它就起作用了,与单个 CPU 相比,原子启动在 16 个内核上花费了大约 6 倍。使用此设置进行测试:https ://github.com/cirosantilli/linux-kernel-module-cheat/tree/d0ada7f58c6624662bbfa3446c7c26422d1c5afb#gem5-arm-full-system-with-more-than-8-cores
旧方法:GICv2 扩展
如前所述:https: //www.mail-archive.com/gem5-dev@gem5.org/msg24593.html gem5 有一个 GICv2 扩展 + 内核补丁,允许这样做:
fs.py
选项--param 'system.realview.gic.gem5_extensions = True' --generate-dtb
使用此设置进行测试:https ://github.com/cirosantilli/linux-kernel-module-cheat/tree/bab029f60656913b5dea629a220ae593cc16147d#gem5-arm-full-system-with-more-than-8-cores (gem5 4c8efdbef45d98109769cf675ee3411393e8ed06,Linux内核fork v4.15,aarch64)。