# airos-kernel **Repository Path**: cudar/airos-kernel ## Basic Information - **Project Name**: airos-kernel - **Description**: Kernel作为AIR-OS的依赖组件,提供了运行AIROS软件栈所需的内核级支持。 - **Primary Language**: C++ - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 6 - **Created**: 2022-08-02 - **Last Updated**: 2022-08-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 介绍 Kernel作为AIR-OS的依赖组件,提供了运行AIROS软件栈所需的内核级支持。 该模块参考自开源 Apollo,详情参阅:https://github.com/ApolloAuto/apollo ---- ## 与Linux Kernel的关系 Apollo Linux内核基于Linux的官方内核[Linux Kernel 4.4.32](https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.4.32.tar.gz) ,做了一些拓展和修改 ### Apollo Kernel与Linux Kernel的区别 * 包含实时补丁(https://rt.wiki.kernel.org/index.php/RT_PREEMPT_HOWTO) * 含有最新的 e1000e 英特尔以太网驱动程序 * 含有实时补丁下 Nvidia 驱动程序的错误修复 * 含有 inet_csk_clone_lock 函数的双重释放漏洞补丁 * 其他 cve 安全补丁 [Kernel配置文档](https://github.com/ApolloAuto/apollo-kernel/tree/master/linux/configs) 基于Ubuntu的config-4.4.0-X-generic,面向Apollo场景进行了调整。 Apollo 团队感谢开源社区的每一个人。 项目中的apollo-kernel/linux基于Linux内核,目前由Apollo团队维护。在不久的将来,我们会将这些补丁提交给Linux社区。 ## 如何添加ESD CAN支持 如果需要支持使用ESD CAN卡,则需要添加ESD CAN驱动。信息请参考[linux/ESDCAN-README.md](linux/ESDCAN-README.md`) ## 如何下载发布包 从Github上下载发布包: ``` https://github.com/ApolloAuto/apollo-kernel/releases ``` ## 如何安装 下载发布包后执行以下命令: ``` tar zxvf linux-4.4.32-apollo-1.0.0.tar.gz cd install sudo ./install_kernel.sh ``` ## 如何编译 如果您想定制和构建自己的内核,只需执行以下命令: ``` ./build.sh ``` 可以在如下目录下找到安装的内核包: ``` ./install/rt ``` ## 快速开始-以“Hello World”为例 (https://rt.wiki.kernel.org/index.php/RT_PREEMPT_HOWTO#A_Realtime_.22Hello_World.22_Example) * 设置实时调度策略和优先级 * 内存锁定以避免虚拟内存产生的页错误破坏确定性行为 * 对堆栈进行预断层处理以避免栈故障破坏确定性行为 以下示例展示了一段包含实时抢占补丁的实时应用程序示例代码。 执行以下命令编译: ``` gcc -o test_rt test_rt.c -lrt ``` 源代码如下: ``` #include #include #include #include #include #include #define MY_PRIORITY (49) /* we use 49 as the PRREMPT_RT use 50 as the priority of kernel tasklets and interrupt handler by default */ #define MAX_SAFE_STACK (8*1024) /* The maximum stack size which is guaranteed safe to access without faulting */ #define NSEC_PER_SEC (1000000000) /* The number of nsecs per sec. */ void stack_prefault(void) { unsigned char dummy[MAX_SAFE_STACK]; memset(dummy, 0, MAX_SAFE_STACK); return; } int main(int argc, char* argv[]) { struct timespec t; struct sched_param param; int interval = 50000; /* 50us*/ /* Declare ourself as a real time task */ param.sched_priority = MY_PRIORITY; if(sched_setscheduler(0, SCHED_FIFO, ¶m) == -1) { perror("sched_setscheduler failed"); exit(-1); } /* Lock memory */ if(mlockall(MCL_CURRENT|MCL_FUTURE) == -1) { perror("mlockall failed"); exit(-2); } /* Pre-fault our stack */ stack_prefault(); clock_gettime(CLOCK_MONOTONIC ,&t); /* start after one second */ t.tv_sec++; while(1) { /* wait until next shot */ clock_nanosleep(CLOCK_MONOTONIC, TIMER_ABSTIME, &t, NULL); /* do the stuff */ /* calculate next shot */ t.tv_nsec += interval; while (t.tv_nsec >= NSEC_PER_SEC) { t.tv_nsec -= NSEC_PER_SEC; t.tv_sec++; } } } ``` ## 声明 Apollo Linux内核基于Linux的官方内核做了拓展和修改,专门用于支持在Apollo 1.0相关的硬件平台上运行Apollo的软件栈 (参见 [*Apollo 1.0 Hardware and System Installation Guide*](https://github.com/ApolloAuto/apollo/blob/master/docs/quickstart/apollo_1_0_hardware_system_installation_guide.md)获取更多信息),不建议用于任何其他目的。