Leo 的 Linux 2.6 内核精简笔记
这个笔记相对于市面上的的块头图书来说.是个非常精简的版本.我尽可能的做到简明,实用.希望能给开发者者一些快速的入门参考 如果你发现有任何问题或者错误.请让我知道.发到hide1713 AT gmail DOT com
数据结构
链表
链表是最基本,最多的数据结构。linux的链表是双向链表。也就是有两个指针分别指向前一个和后一个数据。这样的数据结构非常灵活。稍微改动一下就能实现队列,栈的功能。把头尾相连就是环形缓冲。下面几点是值得知道的.
- 宏LIST_HEAD(aa)声明一个叫aa的链表,INIT_LIST_HEAD(&aa)初始化这个链表.值得注意的是 list_head结构不光表示head的意思.也表示元素.所以当你看到某个list_head结构时候.说明当前结构可能是在链表中的一个元素.
- 函数list_add(&数据,&链表)和list_add_tail(&数据,&链表)可以实现简单的栈或者队列操作.
- list_del(&链表元素)可以删除链表中的元素.由于是双向链表.我们不需要链表的头.就可找到前后元素进行删除操作
- 宏list_for_each_entry(数据结构,链表头,在数据结构中链表结构的名字)可以遍历链表.实现的方法很神奇.有兴趣可以自己看一下.整个宏展开是一个for语句.可以用下面的方法使用
list_for_each_entry(dd,&aa,cc)
{可以使用dd里面的数据了}
树
链表在查找时速度会挺慢.尤其是没有排序的时候.所以我们需要树.树有一个根结点.节点之间的关系有父母,孩子,兄弟.树的高度是根到最远的叶子的边数.
- 二叉树 左孩子值小于双亲,右孩子的值大于双亲.给定一个节点.左子树的所有值都小.右子树都大.
内联汇编
内联汇编在内核里很常见.linux里面使用at&t汇编.和inter汇编有一些不同.主要功能就是把一些汇编代码放到c程序里面.以达到提高性能.或者实现平台有关操作的目的
int foo(void)
{
int ee = 0x4000, ce=0x8000,reg;
__asm__ __volatile__("movl %1,%%eax";//__asm__说明是内联汇编__volatile__叫编译器不要优化,%1是第一个参数,也就是ce
"movl %2, %%ebx";//%2是ee,使用寄存器的时候要用两个%,像这样%%ebx
"call setbits";
"movl %%eax, %0"//由于at&t汇编的操作数方向是和intel汇编反的.所以表示move eax to 0号变量
: "=r"(reg)//输出 =号表示只写 reg是0号变量
: "r" (ce),"r" (ee)// 输入 ce,ee 是1,2号变量 "r"前缀表示把()里的变量放入任意寄存器
: "%eax","%ebx")//改动过的寄存器.要告诉编译器那些改过了
printf("reg=%x",reg);
}
关于at&t汇编最好的书是Professional Assembly Language这本书.在我的csdn资源里面可以下到.
其他
- asmlinkage
- 程序使用局部堆栈传参数
- UL
- 常数使用unsigned long 常见于体系无关代码
- inline
- 一般情况下使函数像宏一样嵌入到代码中.节省调用开销.但会让程序变大
likely():: 优化cpu预测.比如 if(likely(aa>bb)){代码} 提示有可能aa>bb,下面代码有可能执行.
- unlikely()
- 和likely 相反
第一个可以运行的hellomod
这个例子可以在2.6.23.11下面正确编译, - hellomod.c:
//hello world from leo
#include
#include
#include
MODULE_LICENSE("GPL");
static int __init my_init(void)
{
printk("hello from kernel/n");
return 0;
}
static void __exit my_exit(void)
{
printk("bye kernel/n");
}
module_init(my_init);
module_exit(my_exit);
- Makefile: obj-m = hellomod.o
- 编译命令 make -C /usr/src/linux SUBDIRS=$PWD modules 这里的/usr/src/linux是我放内核源代码的目录.
- 运行 >sudo insmod hellomod.ko >dmesg|tail hello from kernel >sudo rmmod hellomod >dmesg|tail
怎么样,看到打印出来的消息了吧