Chinaunix首页 | 论坛 | 博客
  • 博客访问: 762031
  • 博文数量: 790
  • 博客积分: 40560
  • 博客等级: 大将
  • 技术积分: 5065
  • 用 户 组: 普通用户
  • 注册时间: 2008-08-28 16:29
文章分类

全部博文(790)

文章存档

2011年(1)

2008年(789)

我的朋友

分类: LINUX

2008-08-28 17:08:55

 

  更多Linux操作系统文章请看:Linux操作系统应用专区

  内核版本:2.4.22

  阅读此文的目的:学会编写Linux设备驱动。

  阅读此文的方法:阅读以下2个文件:hello.c,asdf.c。

  此文假设读者:

  已经能用C语言编写Linux应用程序,

  理解"字符设备文件,块设备文件,主设备号,次设备号",

  会写简单的Shell脚本和Makefile。

  1."hello.c"

  --------------------------------

  /*

  *这是我们的第一个源文件,

  *它是一个可以加载的内核模块,

  *加载时显示"Hello,World!",

  *卸载时显示"Bye!"。

  *需要说明一点,写内核或内核模块不能用写应用程序时的系统调用或函数库,

  *因为我们写的就是为应用程序提供系统调用的代码。

  *内核有专用的函数库,如,,等,

  *现在还没必要了解得很详细,

  *这里用到的printk的功能类似于printf。

  *"/usr/src/linux"是你实际的内核源码目录的一个符号链接,

  *如果没有现在就创建一个,因为下面和以后都会用到。

  *编译它用"gcc-c-I/usr/src/linux/includehello.c",

  *如果正常会生成文件hello.o,

  *加载它用"insmodhello.o",

  *只有在文本终端下才能看到输出。

  *卸载它用"rmmodhello"

  */

  /*

  *小技巧:在用户目录的.bashrc里加上一行:

  *aliasmkmod=''gcc-c-I/usr/src/linux/include''

  *然后重新登陆Shell,

  *以后就可以用"mkmodhello.c"的方式来编译内核模块了。

  */

  /*开始例行公事*/

  #ifndef__KERNEL__

  #define__KERNEL__

  #endif

  #ifndefMODULE

  #defineMODULE

  #endif

  #include

  #include

  MODULE_LICENSE("GPL");

  #ifdefCONFIG_SMP

  #define__SMP__

  #endif

  /*结束例行公事*/

  #include/*printk()在这个文件里*/

  staticint

  init_module

  (){

  printk("Hello,World!\n");

  return0;/*如果初始工作失败,就返回非0*/

  }

  staticvoid

  cleanup_module

  (){

  printk("Bye!\n");

  }

  ------------------------------------

  2."asdf.c"

  ------------------------------------


阅读(146) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~