内核开发时应该注意的点

1. 内核编程时不能访问C库
  • 访问C库,代码空间大,效率低;但是大部分常用的C库在内核中都已经实现了,如操作字符串的函数组位于linux/string.h路径下;
  • 内核无法调用printf()函数,但可以调用printk()函数;printk():将格式化好的字符串拷贝到内核日志缓冲区中,这样,syslog程序可以通过读取该缓冲区获取内核信息。printk()允许通过一个标志设置优先级,syslog根据这个优先级标志决定在什么地方显示这条系统信息

2.内核编程时必须使用GNU C;
  • 内联函数(inline)(一般在头文件中定义):消除函数调用和返回开销,有进一步优化代码的可能;但占用更多内存空间或指令缓存,内核开发者常常把时间要求较高、代码比较短的函数定义为内联函数。(要用static作为关键字,并使用inline限定);(优先使用内联函数,并非复杂的宏)
  • 内联汇编:C函数中嵌入汇编指令;
  • 分支说明:对于条件选择指令,gcc内建了一条指令用于优化,某个条件经常出现或很少出现时,编译器会根据这条指令对条件分支选择进行优化
3.缺乏像用户空间那样的内存保护机制
  • 导致oops错误;内核中不应该去做访问非法内存、引用空指针之类的事情;
  • 内核中内存不分页,没用掉一个字节,物理内存就少一个字节;
4.浮点数很难使用
5.由于内核支持异步中断、抢占和SMP,因此必须时刻注意同步和并发
  • linux是抢占多任务操作系统,内核必须对任务进行同步;
  • linux内核支持多处理器,可能存在多个进程同时访问一个共享资源;
  • 中断异步到来,中断可能在访问共享资源时到来,则中断处理程序和正在运行的程序可能共享同一资源;
  • linux内核可以抢占,内核中一段正在执行的代码可能被另一个进程抢占,导致多个进程同时访问相同资源。
常用的解决竞争的方法:自旋锁&&信号量;

6.容量小而固定的栈
  • x86上,栈的大小在编译时可配置,可以是4KB、8KB;历史上说,内存栈大小为量页,即:32位机,8KB;64位机,16KB
6.要考虑可移植性的重要性
  • 保持字节序、64位对齐、不假定字长和页面长度等;
原文地址:https://www.cnblogs.com/cyjsegull/p/4526291.html