《Linux内核设计分析》 第二章 读书笔记 从内核出发

《Linux内核设计分析》 第二章 读书笔记 从内核出发
内核开发的特点:

1.内核编程时既不能访问C库也不能访问标准的C头文件

​ 这就是一个先有鸡还是先有蛋的问题了,大部分常用的C库函数在内核中已经得到了实现

2.内核编程必须使用GNU C

内核代码中使用到的C语言扩展

内联函数:函数在它调用的位置展开,可以消除函数调用和返回带来的开销(寄存器存储和恢复),由于编译器会把调用函数的代码和函数本身放在一起优化,有进一步优化的可能。内联函数会使代码变长,占用更多的内存或者更多的指令缓存,所以把对时间要求比较高,本身长度比较短的函数定义成内联函数。一般在头文件中定义内联函数,使用static作为关键字进行限制,内核优先使用内联函数而不是复杂的宏。

内联汇编:gcc支持在C函数中嵌入汇编指令。用asm()指令嵌入汇编代码

分支声明:gcc建立了一条指令优化条件选择语句,也就是分支预测。内核把这条指令封装成了宏,比如likely()和unlikely()。

3.内核编程时缺乏像用户空间那样的内存保护机制

用户程序进行非法的内存访问的时候,内核发现这个错误,发送SIGSEGV信号,结束整个进程。内核自己非法访问了内存,就会导致oops。在内核中,不应该去访问非法内存地址,引用空指针之类的事情。

内核的内存不分页,每用掉一个字节,物理内存减少一个字节。

4.内核编程时难以执行浮点运算

用户进程进行浮点操作运行的时候,内核完成从整数操作到浮点数操作的模式转换。内核通常捕获陷阱着手于整数到浮点方式的转变。

内核并不能完美支持浮点操作,因为内核本身不能陷入。在内核中使用浮点数时,需要人工保存和恢复浮点寄存器,还有其它的琐碎事情。

5.内核给每个进程只有一个很小的定长堆栈

用户可以从栈上分配大量的空间来存放变量,因为用户空间的栈本身比较大,而且能动态增长。

内核栈随着体系结构而变,栈的大小在编译时配置,内核栈的大小是两页。32位的内核栈是8KB,64位是16KB,是固定的,每个处理器都有自己的栈。

6.由于内核支持异步中断,抢占和SMP,因此必须时刻注意同步和并发

内核很容易产生竞态条件,内核许多特性要求并发访问共享数据。

  • Linux是抢占多任务操作系统,内核的进程调度程序即兴对进程进行调度和重新调度,内核必须和任务同步。
  • Linux内核支持对称多处理系统(SMP),没有适当的保护,同时在两个或两个以上的处理器上执行的内核代码很可能会同时访问共享同一个资源。
  • 中断是异步的,完全不顾当前执行的程序,不加以适当保护,中断可能在代码访问资源的时候到来,中断处理程序可能访问同一个资源。
  • Linux内核可以抢占,不加以适当保护,内核中一段正在执行的代码可能会被另一段代码抢占,可能导致几段代码同时访问相同的资源。

常用的解决竞争方式就是自旋锁信号量

7.要考虑可移植性的重要性

Linux是一个可移植的操作系统,大部分的C代码和体系结构无关,在许多不同的体系结构计算机上都能编译和执行。必须把体系结构相关的代码从内核代码树的特定目录中适当分离。保持字节序、64位对齐、不假定字长和页面长度等一系列准则都有助于移植性。

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值