01 像学任何编程语言一样,先从hello world开始

原创 2016年06月01日 14:19:36
从第二章构造和运行模块开始,因为第一章我已经了解。
先贴第一个简单模块:
  1 #include <linux/init.h>
  2 #include <linux/module.h>                               //所有模块必须包含这两个头文件
  3
  4 MODULE_LICENSE("Dual BSD/GPL");                //许可证,另可以添加MODULE_AUTHOR MODULE_DESCRIPTION 等。具体规范化,可参考各发行的驱动源码。
  5
  6 static int hello_init(void)
  7 {
  8         printk(KERN_ALERT "hello world\n");
  9         return 0;
 10 }
 11 static void hello_exit(void)
 12 {
 13         printk(KERN_ALERT "Goodbye, cruel world\n");
 14 }
 15
 16 module_init(hello_init);
 17 module_exit(hello_exit);
重点关注编译和装载 Makefile
  1 obj-m:=hello.o
  2 #KERNELDIR:=/home/hya/linux-3.2/                                                                                              
  3 KERNELDIR:=/lib/modules/$(shell uname -r)/build/
  4
  5 hello:
  6         make -C $(KERNELDIR) M=`pwd`
  7 clean:
  8         rm -rf *.mod.c *.o *.ko modules.order Module.symvers
  9
模块的安装需要基于特定的内核平台,Makefile要找正确的KERNELDIR路径进行编译,KERNELDIR路径下的内核源码必须正确配置和构造了内核树。
首先我通过第二行指定内核路径,并且在该目录下正确 make menuconfig 、make。
在当前Ubuntu平台上无法insmod,报错如下:(注,insmod 必须是超级用户权限) 版本依赖问题
如果要在Makefile中同时编译多个module:
如果你写成 obj-m:=1.o
                  obj-m:=2.o
                  obj-m:=3.o
这样只会编译3.o,而忽略前面的两个;正确的做法应该是:
  1 obj-m:=01_reg_chrdev.o                                                                                                            
  2 obj-m +=02_reg_cdev.o
  3 obj-m +=03_scull_dev.o
(多看、多做、多想)

理解:
1、模块的初始化和关闭:
初始化:我所理解的初始化时相当于应用程序的main函数;
固定格式:
static int __init init_fun(void)
{
    /*初始化代码*/
}
module_init(inti_fun);
__init:对内核来讲,是一种暗示,表明该函数仅在初始化期间使用,在模块被装载之后,模块装载器就会将初始化函数扔掉,将该函数占用的内存释放出来。
关闭:模块rmmod时调用,注销接口,并向系统返回所有资源。
固定格式:
static void __exit cleanup_fun(void)
{
    /* 清除代码*/
}
module_exit(cleanup_fun);
如果一个模块未定义清除函数,则内核不允许卸载该模块。
2、错误处理:
在内核注册设施时,要时间铭记注册可能会失败。模块初始化出现错误后,必须自行注销已注册的设施。如果由于某种原因未能撤销已注册的设备,内核会处于一种不稳定的状态。这就用到了goto语句,驱动似乎很喜欢使用goto,进行回退。以后代码看多了,慢慢就理解了。
3、模块参数:
sudo insmod hello_param.ko howmany=2 whom="Mom"  注意必须添加 “变量=”
源码:
  6 static char *whom = "world";
  7 static int howmany = 1;
  8
  9 module_param(howmany, int, S_IRUGO | S_IWUSR);
 10 module_param(whom, charp, S_IRUGO | S_IWUSR);
。。。
 16         printk(KERN_INFO "hello %d %s\n", howmany, whom);
。。。
暂时了解,相信以后实际使用还需仔细琢磨。
4、本章还简单介绍了一线内容:
核心模块和应用程序的对比,比如printk不支持浮点数等;
用户空间和内核空间的区别;
内核中的并发;当前进程task_struct;
内核符号表:EXPORT_SYMBOL(name);
模块装载竞争;
在用户空间编写驱动程序。
这些内容可能涉及到对于操作系统和Linux内核的理解,渐渐深入吧。

各类编程语言的Hello World写法

(每隔一段时间整理几门语言的HelloWorld写法,更新中......) A开头:         1、Android(版本4.2.2)           Activity:     ...
  • whxaing2011
  • whxaing2011
  • 2014年03月07日 23:01
  • 1999

多种编程语言的“hello world!”写法

by-小世界http://redcisco.blog.163.com资料参考:http://www2.latech.edu/~acm/HelloWorld.htmlC#include main(){p...
  • jgy8421d13
  • jgy8421d13
  • 2015年11月24日 11:12
  • 216

为什么学习众多编程语言的第一个程序都是 hello, world

只要你学习过编程语言,如 java、C、vb等,就会知道学习语言的第一个程序就是输出打印 hello world 。...
  • u010512665
  • u010512665
  • 2016年08月23日 16:15
  • 197

1. spring boot起步之Hello World【从零开始学Spring Boot】

1.1 介绍        自从structs2出现上次的漏洞以后,对spring的关注度开始越来越浓。        以前spring开发需要配置一大堆的xml,后台spring加入了annotai...
  • linxingliang
  • linxingliang
  • 2016年06月03日 23:07
  • 15558

Arduino系列教程-01 Hello World!

本教程来至yingcloud.com网站  hello world作为所有编程语言的起始,占据着无法改变的地位,所以我们的Arduino教程也从hello world开始。“Hello, wor...
  • yingcloud
  • yingcloud
  • 2014年02月07日 09:34
  • 11392

怎样学习一门编程语言

选择一门语言确定你感兴趣的领域你可以开始学习任何编程语言(尽管其中一些被描述地比其他的更加“易学”),你得去问自己自己想用通过学习这门语言完成什么样的工作。这将会帮助你确定你应该追求的编程方式并且提供...
  • NoMasp
  • NoMasp
  • 2015年04月06日 02:12
  • 11724

L1-1 Hello World

L1-1. Hello World 时间限制 400 ms 内存限制 65536 kB 代码长度限制 8000 B ...
  • liangzhaoyang1
  • liangzhaoyang1
  • 2016年04月19日 13:33
  • 629

Prism学习笔记(二)简单的MVVM模式

现在我们进入Prism的一条重要支柱MVVM模式。MVVM模式简单来说就是把页面UI和后台逻辑分开,这样做的好处是能使你的程序更容易测试,维护和改进。下面的图来自于Prism4的教程显示了MVVM模式...
  • xieqinghai
  • xieqinghai
  • 2012年01月19日 14:55
  • 1522

菜鸟学php扩展 之 hello world(一)

前言这是一篇拖了很久就想写的备忘录,编写php扩展一百度都是文章,但是很多文章是很老的了。有的例子都跑不通。有点尴尬。 此文用于记录自己的笔记,当作备忘录。正文1. 下载php安装包下载地址:php...
  • u011957758
  • u011957758
  • 2017年05月16日 01:12
  • 845

将字符串【"Hello world" 】 倒序结果为【"world Hello " 】

将字符串【"Hello world" 】 倒序结果为【"world Hello " 】 具体代码如下: public void exchange(){     Strin...
  • DreamTL
  • DreamTL
  • 2017年01月14日 09:05
  • 904
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:01 像学任何编程语言一样,先从hello world开始
举报原因:
原因补充:

(最多只允许输入30个字)