原始碼分析(1)helloworld
原始碼:
/*- * BSD LICENSE * * Copyright(c) 2010-2014 Intel Corporation. All rights reserved. * All rights reserved. * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of Intel Corporation nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */#include #include #include #include #include #include #include #include #include #include #include #include static intlcore_hello(__attribute__((unused)) void *arg){unsigned lcore_id;lcore_id = rte_lcore_id();printf("hello from core %u\n", lcore_id);return 0;}intmain(int argc, char **argv){int ret;unsigned lcore_id;ret = rte_eal_init(argc, argv);if (ret < 0)rte_panic("Cannot init EAL\n");/* call lcore_hello() on every slave lcore */RTE_LCORE_FOREACH_SLAVE(lcore_id) {rte_eal_remote_launch(lcore_hello, NULL, lcore_id);}/* call it on master lcore too */lcore_hello(NULL);rte_eal_mp_wait_lcore();return 0;}
分析:
helloworld為dpdk的入門範例程式,程式的編寫和系統編程一樣都是從main函數作為入口函數。
rte_eal_init()啟動基礎運行環境,該函數完成的工作比較複雜,讀取入口參數,解析並儲存DPDK啟動並執行系統資訊,並根據這些資訊構建包處理的運行環境。
配置初始化
記憶體初始化
記憶體池初始化
隊列初始化
警告初始化
中斷初始化
PCI初始化
定時器初始化
…………
使用DPDK這些操作已經被EAL封裝,如果需要進行深度定製二次開發,則需要進一步的研究。
RTE_LCORE_FOREACH_SLAVE(lcore_id) {rte_eal_remote_launch(lcore_hello, NULL, lcore_id);}
DPDK面向多核設計,程式試圖獨佔運行在邏輯核(lcore)上,RTE_LCORE_FOREACH_SLAVE遍曆EAL指定的可用邏輯核,然後在每個邏輯核上執行被指定的線程,本文中為
lcore_hello。(大家可以執行設計lcore_hello)。