Principal Engineer _CTO’s Office
NextHire
Job Summary
CIMware is seeking a Principal Engineer for the CTO's Office in Bangalore, India. This full-time, onsite role involves developing and maintaining Linux PCIe device drivers, ensuring seamless hardware-software interaction. The ideal candidate will possess deep expertise in Linux kernel programming, C/C++, PCIe protocol, and device driver lifecycle management. Responsibilities include designing, implementing, optimizing, and documenting drivers, collaborating with hardware teams, and contributing to open-source projects.
Must Have
- Design, implement, and maintain PCIe device drivers for the Linux kernel.
- Collaborate with hardware engineers to define device requirements and troubleshoot issues.
- Optimize driver performance for reliability, low latency, and high throughput.
- Write and maintain technical documentation for driver software and APIs.
- Participate in code reviews, testing, and release processes.
- Contribute to upstream Linux kernel or open-source projects as needed.
- 15+ years of experience with Linux device driver development, preferably with a focus on PCIe devices.
- Bachelor’s or Master’s Degree in Computer Science, Electrical or Computer Engineering, or a related technical field.
Good to Have
- Experience contributing to the Linux kernel or relevant open-source projects.
- Knowledge of Other Operating Systems (Windows, FreeBSD, RTOS driver models).
- Experience with FPGA, SoC, or Custom Hardware.
- Performance Tuning (profiling and optimizing for low-latency, high-throughput data paths).
- Community Engagement (Linux kernel mailing lists, conferences, speaking at industry events).
Job Description
Introduction
CIMware is an equal job opportunity employer and looking forward to having team of 4 engineers for CTO’s office, reporting directly to CTO.
A Linux PCIe (Peripheral Component Interconnect Express) device driver developer occupies a crucial role in the creation and maintenance of hardware interface software, enabling a wide variety of PCIe devices — such as network cards, storage controllers, graphics adapters and custom hardware accelerators — to function seamlessly with the Linux operating system. Developing drivers for PCIe devices, a keen understanding of kernel subsystems and a disciplined approach to software engineering. This document outlines the typical requirements, competencies, and expectations for a professional specializing in this domain.
Core Technical Skills
Linux Kernel Programming
- Deep Understanding of Linux Kernel Architecture: Familiarity with kernel space versus user space, kernel modules, device driver concepts, and memory management.
- Kernel Module Development: Experience writing loadable kernel modules (LKMs) and integrating them with the Linux build system.
- Debugging and Profiling: Proficiency with debugging tools such as kgdb, ftrace, perf, dmesg, and sysfs interfaces to troubleshoot and optimize drivers.
C/C++ Programming
- Expertise in C Language: Mastery of C for low-level, performance-sensitive code, including bitwise operations, memory management, pointer arithmetic, and data structure optimization.
- Familiarity with C++: Advantageous for certain projects, though most Linux kernel drivers are written in C. Understanding object-oriented concepts in a C context is also helpful.
PCIe Protocol and Hardware Knowledge
- Comprehensive Understanding of PCIe Specification: Knowledge of the PCIe standard, including enumeration, configuration space, BARs (Base Address Registers), MSI/MSI-X interrupts, and bus mastering.
- Device Datasheet Interpretation: Ability to read and interpret PCIe device hardware documentation, including register maps, timing requirements, and signaling protocols.
- Interfacing with Firmware/BIOS: Understanding how PCIe devices are initialized during system boot, and the mechanisms by which firmware and BIOS communicate with hardware.
Device Driver Development Lifecycle
- Probing and Initialization: Experience writing probe() and remove() functions to handle device enumeration and teardown.
- Resource Management: Skills in managing memory and hardware resources, including DMA (Direct Memory Access), I/O regions, and interrupt lines.
- Interrupt Handling: Ability to write efficient and robust interrupt handlers, using mechanisms such as bottom halves, tasklets, work queues, and threaded interrupts.
- Power Management: Familiarity with runtime and system power management interfaces, including suspend/resume operations.
- Concurrency and Synchronization: Understanding race conditions, atomic operations, spinlocks, mutexes, and semaphores in a preemptible kernel environment.
Required Experience and Education
- Bachelor’s or Master’s Degree: In Computer Science, Electrical or Computer Engineering, or a related technical field.
- Professional Experience: 15+ years of experience with Linux device driver development, preferably with a focus on PCIe devices.
- Open Source Contribution: Experience contributing to the Linux kernel or relevant open-source projects is highly valued.
Familiarity with Linux Driver Subsystems
- Character and Block Device Drivers: Understanding the differences and appropriate use-cases for each device class.
- Sysfs and Procfs Interfaces: Skills in exposing driver parameters and status to user space, and handling configuration via these interfaces.
- Networking, Storage, and Graphics Stacks: Knowledge of subsystem-specific APIs when developing drivers for devices in these categories.
Development Tools and Environment
- Cross-Compilation and Toolchains: Familiarity with building for different hardware architectures (x86, ARM, PowerPC, etc).
- Version Control: Proficiency with git and collaborative workflows such as pull requests and code reviews.
- Continuous Integration: Experience with automated build and test systems, static analysis, and quality assurance for kernel code.
- Emulators and Hardware Debuggers: Working knowledge of QEMU, JTAG, and other hardware-in-the-loop debugging tools.
- Testing and Validation: Skills in writing and executing test cases, using tools like KUnit, LTP, or custom user space utilities for driver validation.
Soft Skills and Professional Qualities
- Analytical Thinking: Ability to decompose complex problems and design robust, maintainable solutions.
- Attention to Detail: Careful and methodical approach to low-level programming, where small mistakes can have significant consequences.
- Collaboration: Strong communication skills for working with hardware teams, QA, and other software engineers.
- Documentation: Ability to write clear, comprehensive documentation for driver interfaces, installation, and troubleshooting.
- Adaptability: Willingness to learn new technologies, adapt to evolving kernel APIs, and respond to feedback from code reviews and the open-source community.
Security and Reliability Considerations
- Secure Coding Practices: Understanding common vulnerabilities in kernel code, such as buffer overflows, race conditions, and privilege escalation risks.
- Robust Error Handling: Ensuring drivers handle hardware faults, invalid inputs, and unexpected states gracefully, without compromising system stability.
- Compliance: Awareness of licensing and intellectual property guidelines for kernel code, especially when integrating proprietary firmware or hardware components.
Desirable Additional Qualifications
- Knowledge of Other Operating Systems: Familiarity with Windows, FreeBSD or RTOS driver models for cross-platform development.
- Experience with FPGA, SoC, or Custom Hardware: Useful for teams working on nonstandard PCIe endpoints or accelerators.
- Performance Tuning: Skills in profiling and optimizing for low-latency, high-throughput data paths.
- Community Engagement: Involvement in Linux kernel mailing lists, conferences (such as Linux Plumbers Conference), or speaking at industry events.
Job Description of a Principal Engineer
- Design, implement, and maintain PCIe device drivers for the Linux kernel.
- Collaborate with hardware engineers to define device requirements and troubleshoot issues.
- Optimize driver performance for reliability, low latency, and high throughput.
- Write and maintain technical documentation for driver software and APIs.
- Participate in code reviews, testing, and release processes.
- Contribute to upstream Linux kernel or open-source projects as needed.
Conclusion
A Principal Engineer must master both the art and science of low-level software engineering, combining a deep technical understanding of hardware and kernel architectures with the discipline to write maintainable, robust, and secure code.