现在的位置: 首页 > 综合 > 正文

转:HP大中华区总裁孙振耀撰文谈退休并畅谈人生

2013年08月09日 ⁄ 综合 ⁄ 共 1981字 ⁄ 字号 评论关闭
文章目录

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 //printk()
#include //__init ___exit()
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

怎么样,看到打印出来的消息了吧

 

抱歉!评论已关闭.