# 2024年「[資訊科技產業專案設計](https://hackmd.io/@sysprog/info2024/https%3A%2F%2Fhackmd.io%2F%40sysprog%2FH1-4KbanC)」作業 3 # [簡歷](https://docs.google.com/document/d/1WjCqEdisJU4pmmC21wcvYkNlpSovrIyI/edit?usp=sharing&ouid=102027140990335419329&rtpof=true&sd=true) # 符合自身興趣/規劃的職務: ## MediaTek ### [軟韌體開發 Embedded System software](https://careers.mediatek.com/eREC/JobSearch/JobDetail/MTK120240902008?returnUrl=%2FeREC%2FJobSearch%3FsortBy%3D%26order%3D%26page%3D2%26searchKey%3D%26category%3D9020%26workExp%3D0011%26branch%3D%26program%3D) :::spoiler ### **Job Description:** 我們在找這樣的你: 資工/資管/電子/電機/電信/通訊/電控相關研究所背景,對行動通訊、無線及寛頻連結、家庭娛樂晶片解決方案有濃厚興趣的2025年應屆畢業生。 勇於表達意見,以團隊成功為目標,面對困難不輕易放棄,總是在想更好的做法,擁有創新及不斷學習的精神。 聯發科技邀請您,與全球最頂尖的菁英一同合作,彼此激盪最新的創意與解法,共同挑戰每一個不可能。 ### **Requirement:** [2025年應屆碩士/博士畢業生適用,投遞履歷請附上大學/研究所成績單] 歡迎具備以下經驗及專長的你: 資工/資管/電機/電子/通訊相關研究所畢;嵌入式系統 (Embedded System) / Computer Organization & Architecture (計算機組織 & 結構) / 作業系統 (Operating System) / 資料結構 (Data Structure) / 程式語言 (Programming Language);RTOS (Real-time Operating System) / Linux / Android ### **匹配程度** * 有相關研究所 * 尚未學嵌入式系統、計算機架構 * 計算機組織、作業系統、資料結構有學過,只能說大概了解 * 尚未學RTOS * 程式語言只能說略懂,沒有做專案的經驗,可以寫出稍微複雜的程式。了解一些基礎的資料結構和常用函式庫。可以處理基礎錯誤並做簡單的除錯。 ::: ## Google ### [Software Engineer, Embedded Systems, Platforms](https://www.google.com/about/careers/applications/jobs/results/108754608012042950-software-engineer-embedded-systems-platforms?location=Taiwan&q=%22Software%20Engineer%22) ::: spoiler ### **Job Description:** * Collaborate with cross-functional teams to gather requirements. Write detailed specifications and design docs for software architecture and systems we build. * Work with open-source software, develop and integrate server management software. * Maintain and provide support for systems in the fleet. * Develop, maintain and integrate software test infrastructure, unit tests and integration tests. * Lead our vendors to achieve a high level of code quality. ### **Requirement:** #### Minimum qualifications: * Bachelor's degree in Computer Science, a related technical field, or equivalent practical experience. * 2 years of experience with software development in C or C++. * 2 years of experience working with embedded operating systems. #### Preferred qualifications: * Experience working with upstream linux, bootloader, or embedded firmware. * Experience in the BMC development, machine management software development. * Knowledge of high-speed IOs Peripherals (e.g., PCIe, USB, Ethernet, eMMC) or low-speed IOs Peripherals (e.g., UART, SPI, I2C, I3C, JTAG). * Familiarity with Linux kernel and driver development. * OOB manageability knowledge with exposure to standards like DMTF (PLDM, MCTP (over PCIe, I2C), Redfish, SPDM, etc.). ### **匹配程度** * 沒有 C 或 C++ 的軟體開發經驗 * 沒有嵌入式系統的工作經驗 * 沒有參與upstream Linux、引導程式或嵌入式韌體的工作經驗。 * 沒有BMC開發、機器管理軟體的開發經驗 * 沒有了解高速 IO 周邊裝置(e.g., PCIe, USB, Ethernet, eMMC)或低速 IO 周邊裝置(e.g., UART, SPI, I2C, I3C, JTAG) * 不熟悉Linux核心和驅動的開發 * 不了解 OOB 管理技術(包括 standards like DMTF (PLDM, MCTP (over PCIe, I2C), Redfish, SPDM, etc.) ::: ## NVIDIA ### [BMC Firmware Developer](https://nvidia.wd5.myworkdayjobs.com/en-US/NVIDIAExternalCareerSite/job/Taiwan-Taipei/BMC-Firmware-Developer_JR1981528?q=firmware&locationHierarchy1=2fcb99c455831013ea52ed162d4932c0) :::spoiler ### Job Description * Designing, implementing, and delivering innovations for managing GPU based AI servers with focus on OOB management, firmware development, server architecture and building systems for enterprise. * Working with a global team of BMC developers on NVIDIA server designs. * Designing and developing performance optimized active monitoring BMC solutions using DMTF Standards including MCTP, Redfish, SPDM and PLDM specifications. * Instrumenting code to ensure maximum code coverage, writing and automating unit tests for each implemented module and maintain detailed unit test case reports. * Providing software quality reports based on static analysis, code coverage, CPU load. * Working with security team to ensure developed code is in line with product security goals. * Working closely with hardware teams to influence hardware design and review HW architecture & schematics. * Working with QA/Test architects to come up with proper test tools and automation for qualifying the whole system software and firmware stack. ### Requirement #### What we need to see: * Domain expertise in BMC Firmware development on X86 or ARM Platforms including BMC-BIOS communication, thermal management, power management, firmware update, device monitoring, firmware security, etc. * Strong experience with AMI/Insyde or OpenBMC Firmware architecture. * Solid experience of end-to-end delivery of high-end enterprise servers from definition to customer deployment. * Solid understanding of low-level interfaces between SBIOS, BMC and OS like I2C/SPI/PCIe/JTAG etc. PCIe enumeration, IO at platform level for enterprise systems. * Experience working closely with HW teams, ODMs and vendors to introduce and support server platforms. * Experience with C/C++ development, bash/python for scripting, and debugging skills in embedded Linux operating environments. * You should possess excellent written and oral communication skills, good work ethics, high sense of team-work, love to produce quality work and commitment to finish your tasks every single day. You are a self-starter who loves to find creative solutions to exciting problems. * Bachelor’s Degree or higher in Electrical Engineering or Computer Science, and 2+ years of experience, with demonstrated strong ability as individual contributor. #### Ways to stand out from the crowd: * Contributor to industry standards like Open Compute, IPMI, DMTF Standards, and open source. * Proven record in delivering BMC or equivalent manageability stack for enterprise servers with AMI SPX firmware stack. ### **匹配程度** * 沒有 X86 或 ARM 平台上 BMC 韌體開發的領域專業知識,包括 BMC-BIOS 通訊、熱管理、電源管理、韌體更新、裝置監控、韌體安全性等 * 沒有在 AMI/Insyde 或 OpenBMC 韌體架構方面擁有豐富的經驗。 * 沒有從定義到客戶部署的高階企業伺服器端到端交付的豐富經驗。 * 沒有對 SBIOS、BMC 和作業系統之間的低階介面(如 I2C/SPI/PCIe/JTAG 等)有深入的了解。 * 沒有擁有與硬體團隊、ODM 和供應商密切合作來引入和支援伺服器平台的經驗。 * 沒有擁有 C/C++ 開發經驗、用於腳本編寫的 bash/python 以及嵌入式 Linux 操作環境中的偵錯技能。 * 不是開放計算、IPMI、DMTF 標準和開源等行業標準的貢獻者。 * 沒有在為具有 AMI SPX 韌體堆疊的企業伺服器提供 BMC 或等效可管理性堆疊方面擁有可靠的記錄。 ::: # 模擬面試 🧔: Interviewer 🙂: Interviewee ## 聯發科 > 🧔: 我們的一個系統中,有一個記憶體管理的模組使用了自由列表(free list)來追蹤可用的記憶體塊。當一個記憶體塊被釋放時,我們需要將它插入到適當的位置以保持列表的排序。請設計一個函數來完成這個操作。 > 🙂: 所以是我需要設計一個自由列表(free list),它是一個鏈結串列,用來追蹤記憶體管理中的可用記憶體塊。每次釋放記憶體時,我們會將新的記憶體塊插入到該列表中,同時需要保持列表中的記憶體塊按地址順序排列。如果列表為空,則直接將新塊插入。 🧔:是的。 🙂:那麼我想舉一個範例, 假設一開始 free list 是空的: 插入 50,結果為 50 -> NULL。 插入 20,結果為 20 -> 50 -> NULL。 插入 70,結果為 20 -> 50 -> 70 -> NULL。 插入 30,結果為 20 -> 30 -> 50 -> 70 -> NULL。 🧔:是的,你有清楚的了解了。 我目前想到的方法是,先定義節點的結構,包含了記憶體地址和指向下一個位置的指標。然後我們需要處理三種情況: 第一種是 free list 原本是空的,那我們只需要直接插入在頭部的位置即可。 第二種是 free list 不是空的,但是比頭部還小,那我們需要把它插入頭部。 第三種則是裡面是有排好的順序,那我們就需要找到適當的位置放我們的節點,我目前想到的方法就是遍歷,從頭部開始比直到找到一個比要插入節點小的節點的話,就插入到該節點後方,然後這樣的作法是 O(n) 。 ### 遍歷 code ```cpp #include <stdio.h> #include <stdlib.h> // Node definition struct Node{ int address; struct Node *next; } // function: Node create struct Node* create(int address) { struct Node* newNode = (struct Node*)malloc(sizeof(struct Node)); newNode->address = address; newNode->next = NULL; return newNode; } // Insert into free list void insertNode(struct Node **head, int address) { // create new node struct Node *newNode = createNode(address); // 如果 free list 一開始為空 if (*head == NULL) { *head = newNode; return; } // 如果插入地址小於頭節點地址,插入到頭部 if (address < (*head)->address) { newNode->next = *head; *head = newNode; return; } // 找到適合插入的位置 struct Node *current = *head; while (current->next != NULL && current->next->address < address) current = current->next; // 插入新節點 newNode->next = current->next; current->next = newNode; } // func: print free list void printFreeList(struct MemoryBlock *head) { printf("Free List: "); while (head != NULL) { printf("%d -> ", head->address); head = head->next; } printf("NULL\n"); } // test int main() { struct Node *freeList = NULL; // 初始化自由列表 // insert block insertNode(&freeList, 50); insertNode(&freeList, 20); insertNode(&freeList, 70); insertNode(&freeList, 30); // print printFreeList(freeList); return 0; } ``` 🧔:依照你的方法的話會是O(n),那請問在這個free list很長的情況下有沒有更高效的作法? 🧔:不好意思,目前我還沒想到其他的做法。