鏈接了dpdk的進程啟動core在 Illegal instruction


失敗后的core棧像下面這樣:

Program terminated with signal SIGILL, Illegal instruction.
#0  0x00000000036a3fdd in rte_cpu_get_flag_enabled ()
[Current thread is 1 (Thread 0x7fc26fda21a0 (LWP 10988))]
(gdb) bt
#0  0x00000000036a3fdd in rte_cpu_get_flag_enabled ()
#1  0x0000000003694f4e in rte_hash_crc_init_alg ()
#2  0x000000000388074f in __libc_csu_init ()
#3  0x00007fc26df6092e in __libc_start_main () from /lib64/libc.so.6
#4  0x0000000000bec929 in _start ()

core的原因很顯然:"Illegal instruction",指令非法,查看core處的匯編代碼:

shrx指令屬於bmi2指令集,查看運行該binary的機器上有無bmi2指令集:

cat /proc/cpuinfo | grep flags

發現該CPU上沒有bmi2指令集,所以core掉了。

 

所以根源是:編譯dpdk library的機器的CPU版本更高,支持了bmi2指令,但是運行dpdk的機器的CPU版本更低,不支持bmi2指令。

網上有博文說在編譯dpdk的時候將CONFIG_RTE_MACHINE設置成default能解,我們嘗試了無果,最后找了一個CPU版本較低的機器編譯了整套dpdk library,core未出現。不過這個解法只是權宜之計,長期來看,還是要做好不同CPU和機型的適配工作。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM