文档章节

linux内核基础层的学习(1)

陈洪波
 陈洪波
发布于 2015/05/19 19:35
字数 724
阅读 35
收藏 2

一:内核基础层数据结构
1:双向链表list
a):链表的定义

struct list_head{
 struct list_head *next,*pre;
 }

b):container对象和list_entry

#define container_of(ptr,type,member){ \
    const typeof(((type *)0->member) *_mptr = (ptr); \
    (type*)((char*)_mptr-offset(type,member));})
#define list_entry(ptr,type,member) \
    container_of(ptr,type,member)

对双向链表的详细介绍请参考我的博客:

linux内核list.h的学习

2:hash链表
a):定义

struct hlist_head{
    struct hlist_head *first;
}

b):hash链表库
与list相同

请参考下面文章的后面部分就是hash链表的内容:

linux内核list.h的学习

3:红黑树

a):实质上是自平衡二叉树
b):定义在rbtree.c文件中(静待博客更新,对rbtree的介绍)
c):应用场景
主要用在内存管理,IO调度算法等实现了红黑树

4:radix输–基树

a):定义在/lib/radix_tree.c中
b):radix树是一种空间换时间的数据结构,通过空间的冗余减少了时间上的消耗
(静待博客更新,对radix_tree的介绍)
c):page cache的管理使用了radix tree

二:内核基础层的同步机制
1:自旋锁
a):作用
(1):如果数据未锁,那么就获取锁并运行,如果数据已锁,那么就一定旋转(其实是反复执行一条指令)
(2):单处理器环境(非抢占式内核)下,自旋锁其实不起作用
(3):单处理器,抢占式内核环境下,自旋锁起的作用就是禁止抢占
b):自旋锁的调用
(1):spin_lock
(2):spin_unlock

2:内核信号量

a):定义在文件semaphore.h文件里
b):semaphore和mutex
(1):sema_init:计数可以为多
(2):init_mutex:计数为1的信号量
c):信号量的操作
(1):up:释放信号量
(2):down:获取信号量,如果不能获取,则进入睡眠状态
(3):down_trylock:获取信号量,如果不能获取则立即返回,进程不进入睡眠状态

注意:
自旋锁和信号量的区别
1:自旋锁可以用在中断处理函数和tasklet等不可睡眠的场景,而信号量不行
2:可睡眠的场景既可以使用信号量,也可以使用自旋锁,自旋锁通常用在轻量级场景

3:同步机制–原子变量
a):原子变量提供了一种原子的数据结构,对这种数据结构的读写不可被细分和打断
b):原子变量提供的调用
(1):atomic_add:加一个整数到原子变量
(2):automic_sub:从原子变量减去一个整数
(3):automic_set:设置原子变量的数值
(4):automic_read:读取原子变量的数值
4:同步机制–completion
a):completion提供了一种等待完成的机制
b):提供的调用
(1):wait_for_completion:等待操作完成
(2):complete:完成的信号
5:其他内核同步机制
a):CPU变量 DEFINE_PER_CPU
b):RCU锁
c):顺序锁

本文转载自:http://blog.csdn.net/hongbochen1223/article/details/45072905

下一篇: 绪论
陈洪波
粉丝 2
博文 76
码字总数 1552
作品 0
济南
程序员
私信 提问
你为什么看不懂Linux内核驱动源码?

学习嵌入式Linux驱动开发,最核心的技能就是能够编写Linux内核驱动、深入理解Linux内核。而做到这一步的基础,就是你要看得懂Linux内核源码,了解其基本的框架和具体实现,了解其内核API的使...

宅学部落
2018/04/28
0
0
Android系统源代码分析步骤

目前,互联网行业正在朝着移动互联网方向强劲地发展,而移动互联网的发展离不开背后的移动平台的支撑。众所周知,如今在移动平台市场上,苹果的iOS、谷歌的Android和微软的Windows Phone系统...

紫地瓜
2012/11/19
0
0
迅为4412开发板Linux驱动教程之内核开发基础

视频教程:http://v.youku.com/v_show/id_XMTMwNjAwMDc0OA==.html 主要内容 • Linux体系结构 • Linux内核结构 • Linux内核源码目录结构 Linux体系结构 从上图可知,Linux体系结构由用户空...

topeet
2015/08/10
242
0
分享12本关于Linux学习方面的书籍(免费下载)

分享12本关于Linux学习方面的书籍(免费下载) 1、鸟哥的Linuix私房菜简体 2、ARM+Linux的启动分析(zImage) 3、linux2.6内核启动分析 4、Linux Kernel核心中文手册(内核图解) 5、Linux必学的...

邓剑彬
2012/12/05
540
3
Linux内核修炼之道 之 前言

至此落笔之际,恰至Linux问世18周年,18年的成长,如梦似幻,风雨颇多,感慨颇多。 犹自忆起多年以前一位前辈训导时的箴言:今天的必然正是由之前一系列的偶然所决定的。过去的某年某月,我偶...

任桥伟
2010/02/24
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Visual Paradigm 教程[UML]:如何绘制封装图?(上)

下载Visual Paradigm最新试用版 查看本教程视频文件 在项目开始时,您只有有限数量的图表,一切都简单而美观。然而,当时间过得匆匆时,已经创建了越来越多的图表,并且它们开始变得无法管理...

xiaochuachua
33分钟前
0
0
Pure-ftpd服务安装及虚拟用户设置

安装 sudo apt-get install pure-ftpd 虚拟用户设置 首先,可以在系统中添加相应的用户和组,如用户ftpuser 和组ftpgroup ,专门用来管理ftp服务。也可以是能登录系统的用户,但最好是不能登...

Gm_ning
34分钟前
0
0
一位面试了阿里,滴滴,网易,蚂蚁金服,最终有幸去了网易的Java程序员【面试题分享】

前言 15年毕业到现在也近三年了,最近面试了阿里集团(菜鸟网络,蚂蚁金服),网易,滴滴,点我达,最终收到点我达,网易offer,蚂蚁金服二面挂掉,菜鸟网络一个月了还在流程中... 最终有幸去...

Java领航员
36分钟前
1
0
“大团队”和“敏捷开发”,谁说不可兼得?

阿里妹导读:当小团队的产出跟不上业务需要,团队就面临规模化的问题。从1个团队到3个团队,仍可以通过简单的团队沟通保持高效协作。当产品复杂到需要5个以上团队同时开发时,我们需要一定的...

阿里云云栖社区
40分钟前
0
0
基于虹软人脸识别Demo android人脸识别

参加一个比赛,指定用虹软的人脸识别功能,奈何虹软人脸识别要自己建人脸库,不然就只能离线用,总不能装个样子,简单看了下虹软Demo,下面决定用这种简单方法实现在线人脸识别: Android端(...

是哇兴哥棒棒哒
45分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部