ldd3笔记
damo王
这个作者很懒,什么都没留下…
展开
-
ldd3流水笔记
今天终于下定决心买下了预谋已久的《linux设备驱动程序》(第三版)中文版。听说这本书好久,之前也借阅过尽一个月。借阅的时候通常都是很认真的,恨自己没有一本在手边可以常常之,呵呵。现在,买到了,希望不要让这本书再如以前的一般那种“在山那边的才是幸福”。为了监督自己,特在此留下这流水笔记,希望把自己每天看书的点滴记录,哪怕流水帐般。就算给自己点动力吧,以后每天都要在这里写点关于今天的读书心得。若某天原创 2008-12-18 21:31:00 · 748 阅读 · 1 评论 -
开始第5章-并发和竞态
这张会比较困难,因为之前写代码的时候对进程的同步问题就比较生疏,所以这章--努力!好,先写这么一句做为开始。看书去了原创 2008-12-25 23:35:00 · 687 阅读 · 0 评论 -
对于scull设备的理解
昨天完成了第三章,但是脑子里总是感觉对scull还达不到透彻的理解。昨天睡觉前又想了想这个设备,现在试试以下的理解看可不可以。1)scull是一个设备;2)这个设备通过一个结构体scull_dev描述。3)scull_dev有7个成员,其中 struct qset *data,指向一个用来存储数据的链表,我们把这个链表的每一个节点称为一个量子集,那么data就是这个由n个量子集构成的链表的头原创 2008-12-26 08:51:00 · 858 阅读 · 0 评论 -
遇到了一个坎
自从看完第三章,调试通过scull之后,意气风发的进军第四和第五章。书现在是翻完了,课时总感觉不踏实。看书的时候总是习惯性的不停看看读了多少页了,看看侧面多少页被摸黑了。太在意进度,没有笑话透彻。 也看了很多别人的博客,似乎都在学到第三章的时候就卡住了。于是我也去找了understanding the linux kernel看,也搜了一些linux内核的东西,但是总怕越走越远,与以前学习一原创 2008-12-27 22:12:00 · 1027 阅读 · 1 评论 -
#、##和attribute
#和##是预处理运算符,需要和#define一起使用。# 表示把后面的对象转换为字符串。##表示把前后两个对象链接为一个。attribute可以为函数、变量和类型增加修饰的属性,具体可查看gcc参考大全。晚了,先回忆这么多。原创 2012-09-27 00:08:16 · 436 阅读 · 0 评论 -
Kconfig学习记录
linux内核中每个目录下都有Kconfig和Makefile。通过他们将内核代码组织起来。Kconfig中主要可分为三部分内容: 一、 菜单项 ##在menuconfig中就会看到一个菜单选项,选择之后可看到内部菜单项 menu "菜单名" 菜单内容 endmenu 二、引用项 ##类似于include原创 2012-09-20 00:26:27 · 549 阅读 · 0 评论 -
关于list_head
list_head这东西,看名字就是个联表头,可确确实实是链表节点。struct list_head{ struct list_head *next,*prev;};里面就俩成员,一个指向前面,一个指向后面。使用得时候,将此节点包在其他结构体内,就可通过list_head链表将包含它的节点串起来。linux内核提供container_of(pointer, typ原创 2012-09-20 23:48:01 · 508 阅读 · 0 评论 -
一个简单程序演示container_of的原理
container_of是内核中常用到的一个宏,它的功能是从结构体内成员的地址得到结构体本身的地址。下面用一个应用程序演示这个功能如何实现的。#include struct temp{ int a; char b; double c;};struct temp t[3]={ {1,'a',1.1原创 2012-09-22 23:25:27 · 542 阅读 · 0 评论 -
静态编译和动态编译
静态编译:gcc -c *.c ar -rcs lib*.a *.o用法1: cp lib*.a /usr/lib/ gcc test.c -l* 用法2: gcc test.c lib*.a的完整路径动态编译:gcc -fpic -c *.c //-fpic表示编译为位置无关代码,加载时不需要重定位。动态库都需要-原创 2012-09-24 23:13:26 · 470 阅读 · 0 评论 -
调试技术-1
中午看完了第三章,并且调试了scull。感觉还可以。 但是开始第四章之后,头又大了。自己还是喜欢纯代码的东西。但是调试这里必须过,这是我给自己定的目标,“每天前进一点点,哪怕只有两页,也要一步步的把这本书啃完。”所以,今天的调试必须要写些东西。第一、首先应该打开内核中的调试支持。看书上所讲应该是在编译内核,“make menuconfig”命令出现的裁减内核界面进行这些操作。可是我打开我的2原创 2008-12-25 21:19:00 · 878 阅读 · 0 评论 -
对于scull_read的理解
//ldd3第70页看到的scull_read描述如下:ssize_t scull_read(struct file *filp,char __user *buf,size_t count,loff_t *f_pos){ struct scull_cdev *dev=filp->private_data; struct scull_qset *dptr;//第一个链表项 int原创 2008-12-25 11:58:00 · 1648 阅读 · 0 评论 -
核心模块和应用程序的对比
应用程序是从头到尾执行单个任务;模块却只是预先调用初始化函数注册自己,然后等待以后被调用,最后使用exit函数卸载自己,从而退出内核。模块仅仅被链接到内核,所以它能调用的函数仅仅是由内核到处的那些函数。printk就是一个内核中功能相当于printf的函数,但是printk缺乏对浮点数的支持。//用户空间和内核空间unix系统设计时利用硬件特性使用了两个级别:内核态和用户态。对于具有多个级别的处理原创 2008-12-21 21:58:00 · 496 阅读 · 0 评论 -
ldd3流水笔记-2008.12.19 第一章 设备驱动程序简介
模块化:使得驱动程序独立于内核其它部分建立,可在内核运行时根据需要动态“插入”和“卸载”驱动模块。这个特点使得驱动的编写非常的简单。机制和策略: 机制是解决需要实现什么功能的问题;策略是如何使用这些功能的问题。 尽量不要让驱动程序带有策略,可增加驱动程序的灵活性和增加系统的安全。从另一个角度看:驱动程序是应用程序和实际设备之间的一个软件层。所以我们可以在编写驱动程序的时候编写者拥有如原创 2008-12-19 23:54:00 · 548 阅读 · 0 评论 -
我的helloworld模块
//我的hello.c,makefile请从我的资源中下载/*第一个驱动程序hello world*/#include #include MODULE_LICENSE("Dual BSD/GPL");//告诉内核,该模块才用了自由许可证,否则转载时会遭到内核抱怨static int hello_init(void)//装载时运行{ printk(KERN_ALERT "hello world原创 2008-12-20 22:50:00 · 480 阅读 · 0 评论 -
编译模块--Makefile
1.最基本的一个Makefile文件:# hello.o为你需要编译的源代码,若有多个源代码应使用方法二的方式obj-m:=hello.o#方法二obj-m:=module.omodule-objs:=file1.o file2.o将上面的内容保存为Makefile,在命令行输入“make -C /lib/modules/$(shell uname -r)/build M=`PWD` module原创 2008-12-23 10:44:00 · 8097 阅读 · 1 评论 -
模块参数
/*带模块参数的驱动模块 使用(insmod hello.ko howmany=n whom="str" )执行的话,可将n和"str"传给模块*/#include #include static char *whom="world";static int howmany=1;module_param(howmany,int,S_IRUGO);module_param(whom,charp,S_原创 2008-12-23 15:52:00 · 931 阅读 · 0 评论 -
三个重要的数据结构
struct file_operations //保存字符设备驱动程序的方法,我的理解是使用该结构可以让字符设备认识谁在为自己服务。就像假如每个字符设备都会有很多助手,有负责穿衣,有负责吃饭等等,那么这个结构的作用就是具体化谁负责穿衣,谁负责吃饭。struct file //表示一个打开的文件。struct inode //表示一个磁盘上的文件。struct cdev //描述原创 2008-12-24 14:46:00 · 925 阅读 · 0 评论 -
对第二章的读后感
设备要注册到内核,必须要有一个设备号,就如同人要被这个社会认可和接受,就必须要有一个身份ID一样。而设备是什么呢?字符设备在内核中是以cdev结构体的形式存在的,我们要做字符设备的驱动,可以申请一个cdev的结构体来描述这个字符设备。这个字符设备需要有相关的操作方法,所以我们实现了很多方法,通过一个file_operations结构把这些方法和驱动模块关联在一起,然后在通过cdev_init将cd原创 2008-12-24 15:42:00 · 1215 阅读 · 0 评论 -
open和release
//如下是一段增加了open和release的scull代码,还不完整,只是编译通过,暂时保存到这里,一会儿再修改。#include #include #include #include #include #include #include //命令行参数static char *whom="world";static int howmany=1;module_param(howmany,int,原创 2008-12-25 09:21:00 · 1193 阅读 · 1 评论 -
vim应用的一些记录
配置命令列表1.安装exuberant-ctags sudo apt-get install exuberant-ctags2.从www.vim.org下载taglist.zip,解压到~/.vim目录下,打开~/.vom/doc/taglist.txt执行“:helptags .”命令。3.执行完上面两步操作,用vim打开文件,就可以使用:Tlist打开函数列表。打原创 2012-09-19 23:13:06 · 739 阅读 · 0 评论