分类: LINUX
2008-08-28 17:08:55
更多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 staticint init_module (){ printk("Hello,World!\n"); return0;/*如果初始工作失败,就返回非0*/ } staticvoid cleanup_module (){ printk("Bye!\n"); } ------------------------------------ 2."asdf.c" ------------------------------------