读书笔记--《LINUX内核设计与实现》

  初涉linux内核,正在看这本书。书非常不错,使我对内核不再无从入手。我是新手,所以写点新手笔记,非常肤浅,高手莫笑。

 

 

制作帮助文档,非常有用
============================
make htmldocs

将帮助文档装入man
============================
make mandocs
make installmandocs

内核空间与用户空间数据交换
============================
copy_to_user
copy_from_user /*注:它们可能会引起阻塞*/

capable 检查用户进程是否具有指定权限


进程放弃执行权
============================
schedule 选定下一个进程并切换运行,内核
         代码休眠时调用此函数


新建一个sys_call
=============================
1.在ENTRY(sys_call_table)添加系统调用
ENTRY(sys_call_table)
...
.long sys_myfun

2.在<asm/unistd.h>中添加系统调用号
#define _NR_myfun XXX

3.在sys.c文件中添加相关代码
4.最后在用户空间以_syscalln(...)系统调用
用户态程序访问内核可以通过系统调用或者/proc文件系统,
但系统调用更快,比如当想得到jiffies时

注册并激活一个中断线
=============================
request_irq
free_irq

中断下半部函数
=============================
MOC: DECLEAR_TASKLET()
tasklet_init()
tasklet_schedule() //调度tasklet
tasklet_enable()
tasklet_disable()
tasklet_kill()
Note:tasklet和软中断都不可睡眠

下半部控制函数
=============================
local_bh_disable() //禁止本地软中断和tasklet的处理
local_bh_enable()

原子操作函数
=============================
原子整数操作见<asm/atomic.h>
原子位操作见<asm/bitops.h>

自旋锁操作 (比较耗CPU,适用短期加锁)
=============================
spin_lock
spin_unlock
Note: 自旋锁不可递归,否则自己将进入死锁

spin_lock_irqsave()  保存中断当前状态,并禁止当前本地中断,获取指定锁
spin_unlock_irqrestore() 对指定锁解锁,恢复中断加锁前状态
更多见
<linux/spinlock.h>
<linux内核设计及实现> P125
效率更高的读写锁见
<linux内核设计及实现> P126

锁一般用在中断中


信号量
==============================
适用于锁很长时间的情况
不适用于中断,因为中断无法调度信号量锁
Note:
不能同时占有信号量锁和自旋锁,因为,信号量锁可能睡眠,而自旋锁不允许睡眠(由自旋锁体制决定了)
信号量锁允许同时有多个任务持有同一个信号锁

DECLARE_SEMAPHORE_GENERIC() 创建信号量
DECLARE_MUTEX()   创建互斥信号量
sema_init()   初始化信号量
init_MUTEX()   初始化互斥体
down_interruptible  试图获取信号量,若信号量已被争用则进入可中断睡眠状态
更多见
<linux/semaphore.h>
<linux内核设计及实现> P129

读写信号量
===============================
所有读写信号量都是互斥体,引用计数为1
更多见
<linux内核设计及实现> P130

BKL(大内核锁)
===============================
BKL是全局的
BKL是递归锁
BKL不要用,太大了,而且意义不清

Seq锁
===============================
2.6内核新引入
机制:通过判断序列值的奇偶状态判定。
      write操作时会获得锁,完成会解除锁。

      有且仅有write操作时序列值增加
      获锁+1,释放+1
      所以比较read操作前后序列制
      奇偶可以判定数据是否被改写

相关:
      preempt_disable() 禁止内核抢占
      preempt_enable() 启用内核抢占
      在既没有自旋锁也没有禁止内核抢占的情况下访问共享资源
      会导致数据破坏。
      有SMP情况下应该可以用自旋锁来解决这些问题,但单CPU
      上为提高效率可能不使用自旋锁。此时preempt_disable应该
      是解决问题的办法,需要查看源代码。。。

Timer
===============================
jiffies -- 硬件嘀嗒数

使用定时器
1.设定expires
2.setup_timer
3.add_timer
4.记得在时间调用中del_timer_sync,否则系统崩溃

延迟执行
===============================
set_current_state(TASK_INTERRUPTIABLE)  //设置当前可中断睡眠
schedule_timeout()    //睡眠一段时间


内存分配
===============================
alloc_pages()  //分配内存页并返回物理地址,只有它才能够分配高端地址
__get_free_pages() //分配内存页并返回逻辑地址
free_pages()  //释放内存页
更多见
<linux内核设计及实现> P161

一般用不了页那么大的内存,更多的是使用kmalloc分配基于字节的内存
分配的内存至少为所申请的内存大小(因为基于页的)或者为NULL
kmalloc   //分配一段物理地址和逻辑地址都连续的内存块
kfree
vmalloc   //分配一段逻辑地址连续的内存块
vfree

内存分配标志
===============================
一般使用GFP_KERNEL
中断中使用GFP_ATOMIC

 

 

TO BE CONTINUED...

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。 1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md或论文文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。 5、资源来自互联网采集,如有侵权,私聊博主删除。 6、可私信博主看论文后选择购买源代码。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值