LDD3读书笔记(第二章)

LDD3读书笔记(第二章)

从第二章开始要涉及到编程的内容,本章主要以模块编程和内核编程,我们将构造一个简单的模块。

第二章:构造和运行模块

  1. 设置测试系统:由于ldd3上面的驱动程序可以在几乎2.6.x内核上运行,所以我们需要搭建一个内核树。链接给大家不行的话百度上也还有很多:https://blog.csdn.net/yuzhihui_no1/article/details/40185363。 百度网盘:链接:https://pan.baidu.com/s/12OTAZ5JHTGy_PMLJH_ttTw
    提取码:vm32 上面那个链接是一位前辈教你如何构造内核,下面那个链接是Linux2.6.x的一个源码大家可以自行下载。
  2. hello world:hello world 是我们接触编程最为简单的程序,我们讲述的是内核模块编程而不是应用程序编程,下面给大家看一个完整的模块代码。
    #include<linux/init.h>
    #include<linux/moduled.h>
    MODULE_LICENSE(“Dual BSD/GPL”);
    static int hello_init(void)
    {
    printk(KERN_ALERT “hello world\n”);
    return 0;
    }

static void hello_exit(void)
{
printk(KERN_ALERT “goodbye\n”);
}

module_init(hello_init);
module_exit(hello_exit);
上面就是一个完整的helloworld模块,其中一个模块(hello_init)被装载内核是调用,而另一个(hello_exit)则在模块被移除是调用。第三行特殊宏用来告诉内核,该模块采用自由许可证,如果没有这个声明,内核在装载该模块的时候可能会产生警告,函数printk是在内核中定义的,功能和printf类似,因为内核需要单独的函数打印。KERN_ALERT定义了这句话的优先级。(如果是在虚拟机中运行的话,当你使用insmod装载的话可能会看不到输出的helloworld,但是lsmod的时候会看到已经装载的hello模块,rmmod卸载),一个驱动函数一定要经过,装载卸载。我们编译helloworld的时候要使用makefile,makefile文件如下:
obj-m := hello.o
KERNELDR := /usr/src/linux-2.6.26
PWD := $(shell pwd)
modules:
$(MAKE) -C ( K E R N E L D R ) M = (KERNELDR) M= (KERNELDR)M=(PWD) modules
moduels_install:
$(MAKE) -C ( K E R N E L D R ) M = (KERNELDR) M= (KERNELDR)M=(PWD) modules_install
然后通过在你编译的文件夹中make一下如果没错的话,会生成一个.ko的文件,我们使用insmod ./hello.ko 就可以装载hello模块,使用rmmod卸载。
3. 内核模块与应用程序的对比:模块初始化,模块卸载。当你使用时候加载初始化,使用完毕进行卸载,而应用程序不需要管资源的释放或者其他清除工作,而模块的退出函数必须自己撤销初始化函数所做的一切。
4. 用户空间和内核空间:模块是运行在内核空间内,而应用程序运行在所谓的用户空间内。os需要对内核空间进行保护,以防止应用程序可以操作内核从而发生错误,就像Linux中的root用户和普通用户的区别。
5. 内核中的并发处理:内核编程区别于常见应用程序编程的地方在于对并发的处理。先解释一下什么是并发:在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。应用程序一般都按顺序有序的进行执行,而我们在内核代码中必须考虑到并发。在同一时刻,可能有很多设备在运行着我们的驱动。所以Linux内核代码包括驱动程序代码,必须是可重入的,就是必须能够同时运行在多个上下文中。所以我们在编程的时候一定要注意并发的问题。
6. 细节问题:应用程序在虚拟内存中布局,并且具有一块很大的栈空间,栈是用来保存函数调用历史以及活动函数中的自动变量的。内核中并没有很大的栈空间留给我们使用,所以在我们编程的时候需要谨慎。
7. 编译,装载和卸载模块:上面说过我们使用驱动程序的时候必须先编译,然后装载,卸载。下面我会给大家详细介绍模块在内核中是如何编译的,如何装载与卸载的。首先我们要考虑到针对不同的内核版本,我们可能在编程时候略有不同。在构造内核模块之前,有一些必要的条件,我们应该有正确的编译器、模块工具和一些必要的工具。采用makefile对我们编写的文件进行编译,编译成功后会生成.ko的内核模块文件,该文件的意义就是把内核的一些功能移动到内核外边, 需要的时候插入内核,不需要时卸载。在编译完成后,下一步就是将模块装载到内核中,我们使用insmod命令将所编译好的模块加载到内核中,采用rmmod卸载模块。

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值