Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1069119
  • 博文数量: 277
  • 博客积分: 8313
  • 博客等级: 中将
  • 技术积分: 2976
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-22 11:25
文章分类

全部博文(277)

文章存档

2013年(17)

2012年(66)

2011年(104)

2010年(90)

我的朋友

分类: LINUX

2011-06-22 10:18:39

1、linux 内核主要由进程调度(SCHED),内存管理 (MM),虚拟文件 系统 (VFS),网络 接 口(NET)和进程间通信(IPC)构成。进程调度控制系统中多个进程对CPU的访问,使得多个进程在CPU中微观串行,宏观并行。内存管理主要控制多个 进程安全地共享主内存区域,当CPU提供MMU单元的时候,linux内存管理为每个进程提供虚拟内存到物理内存的转换。虚拟文件系统屏蔽底层各种硬件的 具体细节,为所有设备提供统一的接口。
2、linux内核的编译简单地说就是make menuconfig ,make zImage ,make bzImage,内核编译的详细过程以及kMakefile,Makefile的编写以后在专门讨论。
3、linux内核的引导过程也是一个复杂的过程,以后用专门的时间来研究
4、linux程序的命名方式与一般程序的命名习惯不同,习惯使用下划线,比如minValue一般被写作min_value,getValue()一般被写作get_value() ;
5、GNU C允许使用零长度数组,比如:
       struct    var_data{
             int len ;
             char data[0] ;
       } ;
       sizeof(var_data)的实际值为sizeof(int),我们可以使用for循环来遍历紧跟着var_data的内存区域的数据 ,比如:
       struct  var_data s ;
       s.len = 5 ;
       for(int i = 0; i< s.len ; i++)
       {
             printf("%02x", s.data[i]) ;
       }
       这个程序遍历的实际上是内存区域里面紧临着s存储的5个8位的数据。
6、GNU C中case的范围可以是范围的,比如说:
       case 1...10 :
         prinft("hello word1") ;
         break ;
       case ‘a’...‘f’ :
          printf("hello world2")
          break ;
        ……
        这里的1...10实际上就是1到10的范围,而a...f实际上就是a、b、c、d、e、f这个范围。
7、GNU C把包括在括号中的复合语句看成表达式,可以出现在任何表达式可以出现的地方,比如说:
       #defing   max(type, a,  b)  ({type __x = a; type __y = b; return __x < __y ? __y : __x ; })
      而且我们可以使用typeof来重新定义上面的宏:
      #define  max(a, b) ({typeof(a) __x = a ; typeof(b) __y = b ; return __x < __y ? __y:__x})
8、标准c只支持可变参数的函数,但是GNU C支持可变参数的宏,比如:
       #define  pr_debug(fmt,arg...)  printk(fmt, ##arg)
       这里的arg表示其余的参数可以是零个或者多个,这些参数和参数之间的逗号就构成了arg的值。这个##是解决arg不代表任何参数的情况,如果arg不代表任何参数,则arg前面的逗号就会自动去掉。
9、标准C要求数组或者结构体的初始化值必须以固定的顺序出现,GNU C允许通过索引和成员变量名来以任意顺序进行初始化。指定数组索引的方法是在初始化值前添加“[INDEX]=”,当然也可以用"[FIRST...LAST]="的方式,比如:
  unsigned int a [10] = {[0...9]=0} ;
   用成员变量名来初始化,比如:
   struct file_operations  ext3_file_operations = {
        llseek : generic_file_llseek ,
        read : generic_file_read ,
        write : generic_file_write ,
        mmap : generic_file_mmap ,
   }
    但是linux kernel2.6以后推荐尽量使用标准C的方式:
     struct file_operations ext3_file_operation = {
         .llseek =  generic_file_llseek ,
         .read = generic_file_read ,
         .write = generic_file_write ,
          .mmap = generic_file_mmap ,
      }
10、GNU C于定义了两个标志保存当前函数的名字,__FUNCTION__保存函数在源码中的名字,__PRETTY_FUNCTION__保存带语言特色的名字,在C语言中这两个名字是相同的。
11、GNU C允许声明函数、变量和类型的特殊属性,以便进行手工的代码优化和定制代码检查的方法。声明的方法很简单,只需要在声明的后面加上__attribute__(()),比如指定对齐方式:
        struct   example{
              int a ;
              char b ;
      } __attribute__((align(4))) ;
      GNU C提供了很多特殊的属性,具体可以去GNU查找
12、GNU C提供了许多内建函数,其中大部分是标准c库函数的GNU C编译器内建版本,比如memcpy(),他们与标准库函数功能相同,不属于库函数的其他内建函数大部分以__buitin开始,比如:
       __builtin_return_address(LEVEL)返回当前函数或其调用者的返回地址。
13、在linux内核中经常看到do{}while(0)这样的语句,主要用在宏定义中,防止宏定义出现歧义或者错误。而且在linux 内核中广泛使用到的goto语句主要用在错误处理上。
阅读(1168) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~