Jarson's Blog

静水深流,岁月安好


  • 首页

  • 分类

  • 关于

  • 归档

  • 标签

驱动开发三宝:spec、datasheet与内核源码

发表于 2014-04-17 | 分类于 Kernel , 内核修炼之道

原文:《Linux内核修炼之道》精华分享与讨论(13)——驱动开发三件宝:spec、datasheet与内核源码

设备模型之外,对于驱动程序的开发者来说,有三样东西是不可缺少的:第一是协议或标准的spec,也就是规范,比如usb协议规范;第二是硬件的datasheet,即你的驱动要支持的硬件的手册;第三就是内核里类似驱动的源代码,比如你要写触摸屏驱动的话,就可以参考内核里已经有的一些触摸屏驱动。

阅读全文 »

linux设备模型

发表于 2014-04-17 | 分类于 Kernel , 内核修炼之道

参考原文:
《Linux内核修炼之道》精华分享与讨论(11)——设备模型(上)
《Linux内核修炼之道》精华分享与讨论(12)——设备模型(下)

对于驱动开发来说,设备模型的理解是根本,毫不夸张得说,理解了设备模型,再去看那些五花八门的驱动程序,你会发现自己站在了另一个高度,从而有了一种俯视的感觉。
顾名而思义,设备模型是关于设备的模型,对咱们写驱动的和不写驱动的人来说,设备的概念就是总线和与其相连的各种设备。电脑城的IT工作者都会知道设备是通过总线连到计算机上的,而且还需要对应的驱动才能用,可是总线是如何发现设备的,设备又是如何和驱动对应起来的,它们经过怎样的艰辛才找到命里注定的那个他,它们的关系如何,白头偕老型的还是朝三暮四型的,这些问题就不是他们关心的了,而是咱们需要关心的。这些疑问的中心思想中心词汇就是总线、设备和驱动,没错,它们就是咱们这里要聊的Linux设备模型的名角。

阅读全文 »

分析内核源码如何入手(下)

发表于 2014-04-17 | 分类于 Kernel , 内核修炼之道

原文:《Linux内核修炼之道》精华分享与讨论(7)——分析内核源码如何入手?(下)

从初始化函数开始

有了地图Kconfig和Makefile,我们可以在庞大复杂的内核代码中定位以及缩小了目标代码的范围。那么现在,为了研究内核对USB子系统的实现,我们还需要在目标代码中找到一个突破口,这个突破口就是USB子系统的初始化代码。

阅读全文 »

分析内核源码如何入手(上)

发表于 2014-04-17 | 分类于 Kernel , 内核修炼之道

原文:《Linux内核修炼之道》精华分享与讨论(6)——分析内核源码如何入手?(上)

透过现象看本质,兽兽门无非就是一些人体艺术展示。同样往本质里看过去,学习内核,就是学习内核的源代码,任何内核有关的书籍都是基于内核,而又不高于内核的。

既然要学习内核源码,就要经常对内核代码进行分析,而内核代码千千万,还前仆后继的不断往里加,这就让大部分人都有种雾里看花花不见的无助感。不过不要怕,孔老夫子早就留给我们了应对之策:敏于事而慎于言,就有道而正焉,可谓好学也已。这就是说,做事要踏实才是好学生好同志,要遵循严谨的态度,去理解每一段代码的实现,多问多想多记。如果抱着走马观花,得过且过的态度,结果极有可能就是一边看一边丢,没有多大的收获

阅读全文 »

Kernel地图:Kconfig与Makefile

发表于 2014-04-17 | 分类于 Kernel , 内核修炼之道

原文:《Linux内核修炼之道》精华分享与讨论(5)——Kernel地图:Kconfig与Makefile

Kconfig和Makefile就是Linux Kernel迷宫里的地图。地图引导我们去认识一个城市,而Kconfig和Makefile则可以让我们了解一个Kernel目录下面的结构。我们每次浏览kernel寻找属于自己的那一段代码时,都应该首先看看目录下的这两个文件。

阅读全文 »

文件和目录

发表于 2014-04-17 | 分类于 Programming , APUE

参考:APUE读书笔记 之 文件和目录

描述文件系统的特征和文件的性质。

UNIX用户层的文件系统主要包括两部分:

  1. 文件的stat属性。
  2. 由文件的某些属性与进程的属性相结合衍生出的权限控制系统。

本章还初步介绍了UFS(UNIX FIle System)软件层的基本结构。

阅读全文 »

文件 I/O

发表于 2014-04-13 | 分类于 Programming , APUE

原文参考:APUE读书笔记 之 文件I/O
文章中的英文图片都引用自:http://infohost.nmt.edu/~eweiss/222_book/222_book/0201433079/toc.html
中文图片为(CoreyGao)原创,用Xmind所画。

阅读全文 »

linux内核环形队列kfifo

发表于 2014-03-29 | 分类于 Kernel , 内核数据结构

Linux kernel 里面从来就不缺少简洁,优雅和高效的代码,只是我们缺少发现和品味的眼光。在Linux kernel里面,简洁并不表示代码使用神出鬼没的超然技巧,相反,它使用的不过是大家非常熟悉的基础数据结构,但是kernel开发者能从基础的数据结构中,提炼出优美的特性。

kfifo就是这样的一类优美代码,它十分简洁,绝无多余的一行代码,却非常高效。
关于kfifo信息如下:

本文分析的原代码版本:2.6.25
kfifo的定义文件:kernel/kfifo.c
kfifo的头文件:include/linux/kfifo.h

阅读全文 »

linux字符设备模块加载脚本

发表于 2014-03-13 | 分类于 Kernel , 设备驱动

设备号动态分配的字符设备模块加载及设备节点创建脚本:(摘自LDD3)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#!/bin/sh
# $Id: scull_load,v 1.4 2004/11/03 06:19:49 rubini Exp $
module="scull"
device="scull"
mode="664"
# Group: since distributions do it differently, look for wheel or use staff
if grep -q '^staff:' /etc/group; then
group="staff"
else
group="wheel"
fi
# invoke insmod with all arguments we got
# and use a pathname, as insmod doesn't look in . by default
/sbin/insmod ./$module.ko $* || exit 1
# retrieve major number
major=$(awk "\$2==\"$module\" {print \$1}" /proc/devices)
# Remove stale nodes and replace them, then give gid and perms
# Usually the script is shorter, it's scull that has several devices in it.
rm -f /dev/${device}[0-3]
mknod /dev/${device}0 c $major 0
mknod /dev/${device}1 c $major 1
mknod /dev/${device}2 c $major 2
mknod /dev/${device}3 c $major 3
ln -sf ${device}0 /dev/${device}
chgrp $group /dev/${device}[0-3]
chmod $mode /dev/${device}[0-3]
rm -f /dev/${device}pipe[0-3]
mknod /dev/${device}pipe0 c $major 4
mknod /dev/${device}pipe1 c $major 5
mknod /dev/${device}pipe2 c $major 6
mknod /dev/${device}pipe3 c $major 7
ln -sf ${device}pipe0 /dev/${device}pipe
chgrp $group /dev/${device}pipe[0-3]
chmod $mode /dev/${device}pipe[0-3]
rm -f /dev/${device}single
mknod /dev/${device}single c $major 8
chgrp $group /dev/${device}single
chmod $mode /dev/${device}single
rm -f /dev/${device}uid
mknod /dev/${device}uid c $major 9
chgrp $group /dev/${device}uid
chmod $mode /dev/${device}uid
rm -f /dev/${device}wuid
mknod /dev/${device}wuid c $major 10
chgrp $group /dev/${device}wuid
chmod $mode /dev/${device}wuid
rm -f /dev/${device}priv
mknod /dev/${device}priv c $major 11
chgrp $group /dev/${device}priv
chmod $mode /dev/${device}priv

获取动态分配到的主设备号:

1
2
# retrieve major number
major=$(awk "\$2==\"$module\" {print \$1}" /proc/devices)

Linux内核模块编译Makefile模板

发表于 2014-03-13 | 分类于 Kernel , 设备驱动

原文链接:Linux内核模块LKM编译-自制Makefile模板 By Tekkaman Ninja

根据LDD3的内核模块makefile和原理说明,根据自己的需要做了适当的修改使得这个Makefile脚本可以方便被应用于不同的简单模块编译,并可以在模块需要编译进内核的时候直接放入内核源码目录中,脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
MODULE_NAME = hello_linux_simple
MODULE_CONFIG = CONFIG_HELLO_LINUX_SIMPLE
CROSS_CONFIG = y
# Comment/uncomment the following line to disable/enable debugging
DEBUG = y
# If KERNELRELEASE is defined, we've been invoked from the
# kernel build system and can use its language.
ifneq ($(KERNELRELEASE),)
# Add your debugging flag (or not) to CFLAGS
ifeq ($(DEBUG),y)
DEBFLAGS = -O -g -DDEBUG # "-O" is needed to expand inlines
else
DEBFLAGS = -O2
endif
ccflags-y += $(DEBFLAGS)
obj-$($(MODULE_CONFIG)) := $(MODULE_NAME).o
#for Multi-files module
$(MODULE_NAME)-objs := hello_linux_simple_dep.o ex_output.o
# Otherwise we were called directly from the command line;
# invoke the kernel build system.
else
ifeq ($(CROSS_CONFIG), y)
#for Cross-compile
KERNELDIR = (内核源码路径)
ARCH = arm
#FIXME:maybe we need absolute path for different user. eg root
#CROSS_COMPILE = arm-none-linux-gnueabi-
CROSS_COMPILE = (交叉编译工具路径)
INSTALLDIR := (目标模块所安装的根文件系统路径)
else
#for Local compile
KERNELDIR = /lib/modules/$(shell uname -r)/build
ARCH = x86
CROSS_COMPILE =
INSTALLDIR := /
endif
################################
PWD := $(shell pwd)
.PHONY: modules modules_install clean
modules:
$(MAKE) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) $(MODULE_CONFIG)=m -C $(KERNELDIR) M=$(PWD) modules
modules_install: modules
$(MAKE) ARCH=$(ARCH) CROSS_COMPILE=$(CROSS_COMPILE) $(MODULE_CONFIG)=m -C $(KERNELDIR) INSTALL_MOD_PATH=$(INSTALLDIR) M=$(PWD) modules_install
clean:
@rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions *.symvers *.order .*.o.d modules.builtin
endif

阅读全文 »
1…345…7
Jarson Fang

Jarson Fang

学习、工作、生活

69 日志
17 分类
12 标签
GitHub 知乎
Links
  • ABS
  • ProGit
  • DevBean
  • CoolShell
  • Rust-Book
  • Rust-庄晓立
  • Rust-中文社区
  • 蜗窝科技
  • free-electrons
  • Hexo
  • NexT
  • Mastering-Markdown
  • Markdown-Style-Guide
© 2016 — 2017 Jarson Fang
由 Hexo 强力驱动
|
主题 — NexT.Gemini