月度归档: 2026 年 2 月
KiCAD的Courtyard层如何使用?
“ 使用Allegro的小伙伴应该很清楚Courtyard层的用法,但使用Altium Designer的小伙伴可能对Courtyard层完全没有概念。Courtyard层到底是什么?在KiCad中如何使用?”。
或者执行“封装检查”报错“没有定义外框”英文 “Footprint has no courtyard defined”,那这个报错的含义是什么?

Courtyard是指装配或其他功能所需的物理元件周围的区域。该区域内不应放置其他元件。如果元件之间的距离太近,组装可能会很困难或是不可能。
在讨论装配时,需要的区域取决于装配方式(自动或手动)以及其他可能的细节。没有一个绝对正确的区域、形状或Courtyard的尺寸可以保证无问题的装配,同时又是最优的(小)尺寸,可以密集的放置。需要在“方便装配”与“装配区域尽可能小”之间取得妥协。
作为一个粗略的指导,KiCad可以检查组件是否太靠近,即检查Courtyard的碰撞情况,也就是检查重叠的Courtyard区域。Courtyard区域必须是一个封闭的形状。该形状以图形方式绘制在F.Courtyard或B.Courtyard层上。要求与Edge.Cuts 板框层完全相同:每条线必须在下一条开始的地方结束,它们不能交叉,最后一条必须在第一条开始的地方结束。除了这个封闭的形状之外,该层的封装中不能有其他东西。
Courtyard通常用一个长方形表示。
如果一个绘制Courtyard时不遵守这些规则,或者Courtyard存在其他问题,DRC会报错:


第一个错误表示Courtyard图形不封闭;第二个错误表示Courtyard自相交;第三个错误表示两个元件的Courtyard重叠。
违规的严重度可以在“电路板设置”中更改:

如果你设计或修改你自己的封装,由于没有任何硬性规定可以遵循,你可以画一个“足够好”的Courtyard来满足你的目的。如果你想对此进行优化,则需要知道装配过程的限制以及该元件与周围部件之间的相互作用。例如:想象一个很高的元件和一个很矮的元件并排放在一起:高的可能很容易放置,但高的放置完成后,再装配矮的元件可能会有问题,即使Courtyard本身估计足够大。
需要在元件周围留出足够的制造空间。如果需要更严格的设计,需要根据具体情况决定一些Courtyard是否可以与其他Courtyard重叠。DRC中两个组件之间的违规行为可以被排除或忽略。
请注意,虽然从逻辑上讲,在有理想Courtyard的理想情况下,每个元件只需要其周围由自己的Courtyard形成的空间,但重叠的Courtyard是允许的。DRC会检查这种重叠。然而,尽管可以允许两个元件的Courtyard重叠,但这种重叠应该排除一个元件的焊盘,或者元件轮廓(通常是在Fab层上绘制),与另一个元件的Courtyard重叠的情况。
在现实世界中,现代的自动装配过程可以做到相当密集的元件放置。例如,对于0402元件,铜的间隙限制了放置,而不是KiCad官方封装所建议的Courtyard。
参考链接
如何在macOS开发中给 PKG 签名和公证(productsign+notarytool)
在 macOS 中,给 PKG 文件进行签名是一个确保用户能够顺利无警告地安装软件的重要步骤。以下是给 PKG 签名的详细步骤:
一、准备阶段
获取开发者账号和证书:
- 首先,需要在苹果开发者网站(Apple Developer)注册一个有效的开发者账号。
- 登录开发者账号后,进入 “Certificates, IDs & Profiles” 页面。
- 创建并下载 “Developer ID Application” 证书和 “Developer ID Installer” 证书。这两个证书分别用于签名应用程序和 PKG 安装包。
- 将下载的证书双击安装到“钥匙串访问”中。
打包PKG文件:
- 使用 Packages 工具或其他打包工具,将需要分发的应用程序和相关文件打包成一个 PKG 安装包。
- 在打包过程中,可以添加安装前和安装后的脚本来执行一些自定义操作。
二、签名阶段
获取证书名称:
- 打开终端,输入命令 security find-identity -v,列出所有已安装的证书。
- 找到与 “Developer ID Installer” 相关的证书名称,通常格式为 “Developer ID Installer: 开发者名称 (证书标识符)”。
签名PKG文件:
使用 productsign 命令对 PKG 文件进行签名。命令格式如下:
|
1 |
$ productsign --sign "Developer ID Installer: 开发者名称 (证书标识符)" 原始PKG文件路径 签名后的PKG文件路径 |
例如:
|
1 |
$ productsign --sign "Developer ID Installer: Your Company, Co., LTD (2988ZTAM4B)" App.pkg App-Signed.pkg |
这将生成一个新的签名后的 PKG 文件。
三、验证签名
验证PKG文件签名:
使用 pkgutil 命令验证 PKG 文件的签名是否有效。命令格式如下:
|
1 |
$ pkgutil --check-signature 签名后的PKG文件路径 |
如果签名有效,命令将输出 “signed by a developer certificate issued by Apple for distribution”。
四、公证阶段(可选)
从 macOS 10.14.5 开始,苹果要求所有分发的软件都必须经过公证(Notarization)。公证过程如下:
准备已签名的软件包:
在公证之前,你需要确保你的 .pkg 文件已经使用 codesign 命令进行了签名。
将公证凭证存储到 macOS 的钥匙串中:
|
1 2 3 4 |
$ xcrun notarytool store-credentials "$KEYCHAIN_PROFILE" \ --apple-id "$APPLE_ID" \ --team-id "$TEAM_ID" \ --password "$APP_SPECIFIC_PASSWORD" |
上传PKG文件到苹果服务器:
使用 notarytool 提交你的软件包进行公证。这一步会将你的软件包上传到 Apple 的公证服务,并启动公证流程。
|
1 |
$ xcrun notarytool submit $ /path/to/your/signed/package.pkg --keychain-profile $KEYCHAIN_PROFILE --wait |
- /path/to/your/signed/package.pkg 是你的已签名软件包的路径。
- --keychain-profile 参数用于指定包含你签名证书的钥匙串配置文件(可选,如果证书在默认钥匙串中则不需要)。
- --wait 参数告诉 notarytool 等待公证完成并返回结果。
如果公证成功,notarytool 会返回一个 RequestUUID,你可以使用这个 UUID 来查询公证状态或进行后续操作。
检查公证结果(如果未使用 --wait):
如果你没有使用 --wait 参数,你需要使用返回的 RequestUUID 来检查公证状态。
|
1 |
$ xcrun notarytool status <RequestUUID> |
替换 <RequestUUID> 为你实际获得的 UUID。
五、盖章步骤
一旦你的软件包通过了公证,你就可以使用 stapler 工具对其进行盖章。
对软件包进行盖章:
使用 stapler 工具对你的软件包进行盖章,以表明它已经通过了 Apple 的公证服务。
|
1 |
$ xcrun stapler staple /path/to/your/signed/package.pkg |
/path/to/your/signed/package.pkg 是你的已签名且已公证的软件包的路径。
验证盖章结果(可选):
你可以使用 stapler 工具来验证你的软件包是否已经被正确盖章。
|
1 |
$ xcrun stapler validate /path/to/your/stapled/package.pkg |
/path/to/your/stapled/package.pkg 是你的已盖章软件包的路径。
如果所有步骤都成功完成,你的软件包现在应该已经准备好分发给用户了。
用户可以通过 macOS 的“安装未知开发者应用”的安全设置来安装你的软件包,而不会因为未经验证的应用程序而被阻止。
六、命令集合
以下是一个简要的流程,以及一个相应的 .sh 脚本示例:
1.用于签名 .pkg 文件( productsign.sh )。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
#!/bin/bash # 证书名称,使用"security find-identity -v"命令查找并替换 CERT_NAME="Developer ID Installer: Your Company Co., Ltd. (4H8C8HR626)" # 原始PKG文件路径,替换为你的PKG文件路径 PKG_PATH="Install App.pkg" # 签名后的PKG文件路径,替换为你想要保存的签名PKG文件路径 SIGNED_PKG_PATH="../Install App.pkg" # 签名PKG文件 echo "正在签名PKG文件..." productsign --sign "$CERT_NAME" "$PKG_PATH" "$SIGNED_PKG_PATH" if [ $? -ne 0 ]; then echo "签名PKG文件失败" exit 1 fi echo "PKG文件签名成功" # 验证签名 echo "正在验证PKG文件签名..." pkgutil --check-signature "$SIGNED_PKG_PATH" if [ $? -ne 0 ]; then echo "验证PKG文件签名失败" exit 1 fi echo "PKG文件签名验证成功" echo "所有脚本执行成功!" |
2.用于签名和公证 .pkg 文件(productsign-online-notarytool.sh)。
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 |
#!/bin/bash # 证书名称,使用"security find-identity -v"命令查找并替换 CERT_NAME="Developer ID Installer: Your Company Co., Ltd. (4H8C8HR626)" # 开发者团队ID # 从CERT_NAME中提取TEAM_ID # 假设TEAM_ID总是位于最后一对括号内 # TEAM_ID="4H8C8HR626" TEAM_ID=$(echo "$CERT_NAME" | awk -F'[()]' '{print $2}') # 原始PKG文件路径,替换为你的PKG文件路径 PKG_PATH="Install App.pkg" # 签名后的PKG文件路径,替换为你想要保存的签名PKG文件路径 SIGNED_PKG_PATH="../Install App.pkg" # 苹果开发者账号 APPLE_ID="apple@163.com" # 应用专属密码(不是账号的登录密码),替换为你的应用专属密码 # 申请链接:https://account.apple.com/account/manage APP_SPECIFIC_PASSWORD="wet-erwc-ssdf-hqaf" KEYCHAIN_PROFILE="my_notary_credentials" # 钥匙串配置文件名称 # 签名PKG文件 echo "正在签名PKG文件..." productsign --sign "$CERT_NAME" "$PKG_PATH" "$SIGNED_PKG_PATH" if [ $? -ne 0 ]; then echo "签名PKG文件失败" exit 1 fi echo "PKG文件签名成功" # 验证签名 echo "正在验证PKG文件签名..." pkgutil --check-signature "$SIGNED_PKG_PATH" if [ $? -ne 0 ]; then echo "验证PKG文件签名失败" exit 1 fi echo "PKG文件签名验证成功" # ==== Xcode 16 === # 存储公证凭证到钥匙串 echo "正在存储公证凭证..." xcrun notarytool store-credentials "$KEYCHAIN_PROFILE" \ --apple-id "$APPLE_ID" \ --team-id "$TEAM_ID" \ --password "$APP_SPECIFIC_PASSWORD" if [ $? -ne 0 ]; then echo "存储凭证失败!" exit 1 fi # 上传PKG文件进行公证并获取RequestUUID echo "正在上传PKG文件进行公证, 请稍等..." OUTPUT=$(xcrun notarytool submit "$SIGNED_PKG_PATH" \ --keychain-profile "$KEYCHAIN_PROFILE" \ --wait 2>&1) echo "上传输出信息:" echo "$OUTPUT" # 检查是否成功获取到RequestUUID REQUEST_UUID=$(echo "$OUTPUT" | awk -F': ' '/id: / {print $2; exit}') if [ -z "$REQUEST_UUID" ]; then echo "上传PKG文件进行公证失败,未获取到RequestUUID" echo "错误信息: $OUTPUT" exit 1 fi echo "PKG文件已上传进行公证,RequestUUID: $REQUEST_UUID" # 查询公证进度 echo "正在等待公证完成..." WAIT_TIME=0 INTERVAL=30 MAX_WAIT_TIME=600 # 10分钟=600秒 while [ $WAIT_TIME -lt $MAX_WAIT_TIME ]; do xcrun notarytool info "$REQUEST_UUID" --keychain-profile "$KEYCHAIN_PROFILE" > ./notary_info.log STATUS=$(grep -i "status:" ./notary_info.log | awk -F': ' '{print $2}') if [ "$STATUS" == "Accepted" ]; then echo "公证完成!" break elif [ "$STATUS" == "Success" ]; then echo "公证成功!" break elif [ "$STATUS" == "invalid" ]; then echo "公证失败,状态为无效!" exit 1 else echo "公证进行中($WAIT_TIME)..." echo "等待$INTERVAL 秒后再次检查..." sleep $INTERVAL WAIT_TIME=$((WAIT_TIME + INTERVAL)) fi if [ $WAIT_TIME -ge $MAX_WAIT_TIME ]; then echo "公证超时!" exit 1 fi done # 盖章 echo "正在对签名的安装包进行盖章..." xcrun stapler staple "$SIGNED_PKG_PATH" if [ $? -ne 0 ]; then echo "盖章失败!" else echo "盖章成功!" exit 1 fi # 验证 echo "正在验证已经盖章的签名的安装包..." xcrun stapler staple -v "$SIGNED_PKG_PATH" if [ $? -ne 0 ]; then echo "验证失败!" exit 1 else echo "盖章和验证成功!" fi echo "PKG文件签名和公证流程全部完成" echo "所有脚本执行成功!" |
请注意,这些步骤假设你已经具备了必要的 Apple Developer 账户、证书和配置文件,并且你的 macOS 系统已经安装了 Xcode 和 Xcode Command Line Tools。如果你遇到任何问题,请检查你的证书、配置文件和路径是否正确,以及你是否拥有执行这些命令的适当权限。
|
1 2 3 4 5 6 7 8 9 |
$ cd build $ chmod +x productsign.sh $ chmod +x productsign-online-notarytool.sh $ ./productsign.sh #或者仅签名 $ ./productsign-online-notarytool.sh # 或者签名加公正[用于需要自动更新] |

参考:
- https://taoofcoding.tech/blogs/2022-11-13/use-notarytool-to-notary-macos-app
- https://blog.csdn.net/Crystal_Mr_Rose/article/details/136351429
- macOS 工具 - 查看PKG文件内容, App下载安装 SuspiciousPackage官方下载地址(免费): http://www.mothersruin.com/software/SuspiciousPackage/get.html
- Mac OS平台下应用程序PKG安装包制作工具Packages, App下载安装Packages官方下载地址(免费): http://s.sudre.free.fr/Software/Packages/resources.html
参考链接
DMAR: ERROR: DMA PTE for vPFN 0xf1f7f already set (to f1f7f003 not 17039b003)
前置条件
- HP ProLiant MicroServer Gen8
- Intel® Xeon® E3-1265L V2 × 8
- Ubuntu 24.04.4 LTS / Linux Kernel 6.8.0-40-generic
问题详情
系统稳定性差,长时间运行之后出现不稳定现象,尤其是远程桌面 RDP,经常出现无法连接的情况。内存 CPU占用都不高,但是系统反应感觉非常卡顿。
执行 sudo dmesg 函数之后,可以观察到如下报错信息:
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 |
[ 97.194200] DMAR: ERROR: DMA PTE for vPFN 0xf1f7f already set (to f1f7f003 not 17039b003) [ 97.194215] ------------[ cut here ]------------ [ 97.194217] WARNING: CPU: 6 PID: 3630 at drivers/iommu/intel/iommu.c:2210 __domain_mapping+0x2c5/0x320 [ 97.194222] Modules linked in: snd_seq_dummy snd_hrtimer snd_seq_midi snd_seq_midi_event snd_rawmidi snd_seq snd_seq_device snd_timer snd soundcore qrtr overlay zram binfmt_misc nls_iso8859_1 ipmi_ssif intel_rapl_msr intel_rapl_common x86_pkg_temp_thermal intel_powerclamp coretemp kvm_intel kvm irqbypass crct10dif_pclmul polyval_clmulni polyval_generic ghash_clmulni_intel gpio_ich sha256_ssse3 sha1_ssse3 aesni_intel input_leds crypto_simd joydev cryptd rapl intel_cstate acpi_power_meter serio_raw mgag200 lpc_ich hpilo acpi_ipmi ipmi_si ipmi_devintf i2c_algo_bit ipmi_msghandler ie31200_edac mac_hid sch_fq_codel msr parport_pc ppdev lp parport efi_pstore nfnetlink dmi_sysfs ip_tables x_tables autofs4 btrfs blake2b_generic raid10 raid456 async_raid6_recov async_memcpy async_pq async_xor async_tx xor raid6_pq libcrc32c raid0 hid_generic usbhid hid raid1 crc32_pclmul psmouse tg3 xhci_pci xhci_pci_renesas pata_acpi uas usb_storage [ 97.194309] CPU: 6 PID: 3630 Comm: upowerd Tainted: G W I 6.8.0-40-generic #40-Ubuntu [ 97.194313] Hardware name: HP ProLiant MicroServer Gen8, BIOS J06 04/04/2019 [ 97.194315] RIP: 0010:__domain_mapping+0x2c5/0x320 [ 97.194319] Code: b0 48 c7 c7 c0 ec cd 95 e8 58 5c 64 ff 8b 05 26 cb bb 01 4c 8b 4d b0 41 bb 00 00 00 00 85 c0 74 09 83 e8 01 89 05 0f cb bb 01 <0f> 0b e9 f9 fe ff ff 41 80 e5 7f e9 da fe ff ff ba 01 00 00 00 e9 [ 97.194322] RSP: 0018:ffffa0d18b1b6dc0 EFLAGS: 00010046 [ 97.194325] RAX: 0000000000000000 RBX: ffff9498c473ebf8 RCX: 0000000000000000 [ 97.194328] RDX: 0000000000000000 RSI: 0000000000000000 RDI: 0000000000000000 [ 97.194330] RBP: ffffa0d18b1b6e20 R08: 0000000000000000 R09: ffff9498c473ebf8 [ 97.194332] R10: 0000000000000000 R11: 0000000000000000 R12: 0000000000000001 [ 97.194334] R13: 000000017039b003 R14: ffff9498c1949100 R15: 0000000000000001 [ 97.194336] FS: 0000000000000000(0000) GS:ffff949bb9d00000(0000) knlGS:0000000000000000 [ 97.194339] CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033 [ 97.194342] CR2: 000077c061890008 CR3: 000000016333e006 CR4: 00000000001706f0 [ 97.194344] Call Trace: [ 97.194346] <TASK> [ 97.194348] ? show_regs+0x6d/0x80 [ 97.194351] ? __warn+0x89/0x160 [ 97.194356] ? __domain_mapping+0x2c5/0x320 [ 97.194360] ? report_bug+0x17e/0x1b0 [ 97.194364] ? handle_bug+0x51/0xa0 [ 97.194368] ? exc_invalid_op+0x18/0x80 [ 97.194372] ? asm_exc_invalid_op+0x1b/0x20 [ 97.194378] ? __domain_mapping+0x2c5/0x320 [ 97.194383] intel_iommu_map_pages+0xe1/0x140 [ 97.194388] __iommu_map+0x121/0x280 [ 97.194392] iommu_map_sg+0xbf/0x1f0 [ 97.194397] iommu_dma_map_sg+0x463/0x4f0 [ 97.194403] ? __pfx_ata_scsi_rw_xlat+0x10/0x10 [ 97.194408] __dma_map_sg_attrs+0x35/0xd0 [ 97.194411] dma_map_sg_attrs+0xe/0x30 [ 97.194415] ata_qc_issue+0xfc/0x2d0 [ 97.194419] ? __pfx_ata_scsi_rw_xlat+0x10/0x10 [ 97.194423] ? __pfx_ata_scsi_rw_xlat+0x10/0x10 [ 97.194427] __ata_scsi_queuecmd+0xf2/0x3a0 [ 97.194430] ata_scsi_queuecmd+0x44/0x80 [ 97.194434] scsi_dispatch_cmd+0x91/0x240 [ 97.194437] scsi_queue_rq+0x2c4/0x670 [ 97.194441] blk_mq_dispatch_rq_list+0x137/0x520 [ 97.194445] ? sbitmap_get+0x73/0x180 [ 97.194451] __blk_mq_do_dispatch_sched+0xbb/0x300 [ 97.194455] ? finish_task_switch.isra.0+0x93/0x300 [ 97.194460] __blk_mq_sched_dispatch_requests+0x151/0x190 [ 97.194464] blk_mq_sched_dispatch_requests+0x2c/0x70 [ 97.194467] blk_mq_run_hw_queue+0x1bf/0x210 [ 97.194472] blk_mq_get_tag+0x1ef/0x2f0 [ 97.194476] ? __pfx_autoremove_wake_function+0x10/0x10 [ 97.194481] __blk_mq_alloc_requests+0xd6/0x290 [ 97.194485] blk_mq_submit_bio+0x190/0x6b0 [ 97.194489] __submit_bio+0xb3/0x1c0 [ 97.194492] submit_bio_noacct_nocheck+0x13c/0x1f0 [ 97.194495] submit_bio_noacct+0x162/0x5b0 [ 97.194499] submit_bio+0xb2/0x110 [ 97.194502] ext4_mpage_readpages+0x37e/0xaa0 [ 97.194505] ? __mod_memcg_lruvec_state+0xd6/0x1a0 [ 97.194512] ext4_readahead+0x3f/0x50 [ 97.194516] read_pages+0x95/0x290 [ 97.194522] page_cache_ra_unbounded+0x167/0x1c0 [ 97.194528] page_cache_ra_order+0x2a9/0x350 [ 97.194531] ? xas_load+0xf/0x60 [ 97.194535] ondemand_readahead+0x21c/0x4d0 [ 97.194539] page_cache_sync_ra+0x8a/0xa0 [ 97.194541] filemap_get_pages+0x109/0x3b0 [ 97.194547] filemap_read+0xf7/0x470 [ 97.194551] ? __ext4_ext_check+0x1ff/0x500 [ 97.194558] generic_file_read_iter+0xbb/0x110 [ 97.194562] ext4_file_read_iter+0x63/0x210 [ 97.194566] vfs_read+0x258/0x390 [ 97.194570] ksys_read+0x73/0x100 [ 97.194574] __x64_sys_read+0x19/0x30 [ 97.194577] x64_sys_call+0x1ada/0x25c0 [ 97.194580] do_syscall_64+0x7f/0x180 [ 97.194583] ? terminate_walk+0xf0/0x100 [ 97.194587] ? path_openat+0x140/0x2d0 [ 97.194591] ? do_filp_open+0xaf/0x170 [ 97.194598] ? putname+0x5b/0x80 [ 97.194602] ? do_sys_openat2+0x9f/0xe0 [ 97.194607] ? __x64_sys_openat+0x55/0xa0 [ 97.194610] ? syscall_exit_to_user_mode+0x89/0x260 [ 97.194615] ? do_syscall_64+0x8c/0x180 [ 97.194619] ? handle_pte_fault+0x114/0x1d0 [ 97.194623] ? __handle_mm_fault+0x653/0x790 [ 97.194627] ? __count_memcg_events+0x6b/0x120 [ 97.194631] ? count_memcg_events.constprop.0+0x2a/0x50 [ 97.194635] ? restore_fpregs_from_fpstate+0x47/0xf0 [ 97.194640] ? switch_fpu_return+0x55/0xf0 [ 97.194645] ? irqentry_exit_to_user_mode+0x7e/0x260 [ 97.194649] ? irqentry_exit+0x43/0x50 [ 97.194653] ? exc_page_fault+0x94/0x1b0 [ 97.194657] entry_SYSCALL_64_after_hwframe+0x78/0x80 [ 97.194661] RIP: 0033:0x7e2a20834be8 [ 97.194671] Code: 48 3d 00 f0 ff ff 77 0a c3 66 0f 1f 84 00 00 00 00 00 f7 d8 89 05 c8 36 01 00 48 c7 c0 ff ff ff ff c3 f3 0f 1e fa 31 c0 0f 05 <48> 3d 00 f0 ff ff 77 08 c3 0f 1f 80 00 00 00 00 f7 d8 89 05 a0 36 [ 97.194674] RSP: 002b:00007fff7a1c5b28 EFLAGS: 00000246 ORIG_RAX: 0000000000000000 [ 97.194678] RAX: ffffffffffffffda RBX: 00007e2a2044b530 RCX: 00007e2a20834be8 [ 97.194680] RDX: 0000000000000340 RSI: 00007fff7a1c5bf8 RDI: 0000000000000003 [ 97.194682] RBP: 00007fff7a1c5b70 R08: 00007fff7a1c5bd7 R09: 0000000000000000 [ 97.194685] R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000000003 [ 97.194687] R13: 00007fff7a1c5bf8 R14: 0000000000000340 R15: 00007fff7a1c5bf0 [ 97.194692] </TASK> [ 97.194693] ---[ end trace 0000000000000000 ]--- |
问题原因
Linux 内核的 intel_iommu 与 HP ProLiant MicroServer Gen8 的 BIOS 冲突导致的。
解决方案
修改引导的内核参数:
|
1 |
$ sudo vim /etc/default/grub |
修改如下配置:
|
1 |
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash intel_iommu=off" |
配置修改后,使用如下命令生效内核配置:
|
1 |
$ sudo update-grub |
重启系统
|
1 |
$ sudo reboot |
参考链接
- 如何修复DMAR故障?
- Updated to 8.2 - DMA error
- DMAR: ERROR: DMA PTE for vPFN 0x... Errors
- Microserver Gen8 with P222 + debian testing. (5.15 kernel)
- Re: [PATCH] iommu/dma: Reserve iova ranges for reserved regions of all devices
- Advisory: (Revision) Red Hat Enterprise Linux 5.9 - Linux Will Panic During Boot When "intel_iommu=on" Is Set as a Kernel Parameter if the HP ProLiant Server Is Configured With an Intel Xeon E5-14xx v2 Processor