内核驱动学习(二)

来源:互联网 发布:淘宝dsr在线计算 编辑:程序博客网 时间:2024/05/22 03:08

一、内核模块设计

1、必须包含的头文件<linux/init.h>   <linux/module.h>

2、函数入口module_init()  //函数出口 module_exit()

3、编译内核模块的Makefile

obj-m = hello.o

/多个点c文件/hello-objs := hello.o simple.o

(KDIR) := "/lib/modules/2.6.18-53.e15/build"

all:

make -C $(KDIR) M=$(PWD) modules


4、安装insmod   卸载rmsmod   查看 lsmod

5、模块声明:规范、可读性

MODULE_LICENSE("遵守协议")

MODULE_AUTHOR(“作者”)

MODULE_DESCRIPTION(“功能描述”)

MODULE_VERSION(“版本”)

6、模块参数

module_param(name,type,perm);perm为访问权限:S_IRUGO    S_IWUSR

7、模块中定义的函数或变量要被其他模块使用,则必须使用符号导出声明  EXPORT_SYMBOL()  EXPORT_SYMBOL_GPL()


二、U-BOOT操作

1、u-boot的编译

make 。。config;配置文件

make ARCH=arm CROSS_COMPILE=arm-linux-   ;编译的到u-boot.bin

2、U-BOOT的命令

printenv;setenv;saveenv;配置tftp;bootm;rm(查看内存);mm(修改内存);nand erase;nand write;nand read

3、设置自启动

#setenv bootcmd nand read c0008000 400000 500000 \; bootm c0008000

#setenv bootcmd tftp c0008000 uImage.bin \; bootm c0008000


三、arm内核制作

1、make distclean

2、make menuconfig ARCH=arm

3、编译内核make uImage ARCH=arm CROSS_COMPILE=arm-linux-  

(主要头文件mkimage)


四、根文件系统制作

1、创建根文件系统目录与文件

创建目录;创建设备文件;加入配置文件;添加内核模块;编译busybox

2、挂载根文件系统到内核

开发阶段采用NFS

产品采用基于内存和基于NANDFLASH的文件系统混用

3、使用Initramfs

ln -s ./bin/busybox init

配置linux内核,支持initramfs

编译内核

setenv bootargs noinitrd console=ttySAC0,115200


五、linux内存管理

1、内存管理模型:地址映射;物理内存分配

2、地址映射管理:虚拟地址空间分配,虚拟地址到物理地址的映射

3、物理内存分配:分配了虚拟地址并没有对应到物理内存,只有访问虚拟地址时,才分配了物理内存;另外Kmalloc预分配可以分配到物理内存


六、linux内核链表

1、linux的内核链表都采用双向循环链表

2、链表函数: INIT_LIST_HEAD

list_add

list_add_tail

list_del

list_entry

list_for_each

七、linux进程管理

1、进程4要素: 1、有一段程序供其执行。

2、有进程专用的内核空间堆栈

3、内核中有一个task_struct数据结构,即进程控制块

4、有独立的用户空间;(没有独立的用户空间,有共享用户空间则是用户线程;都没有则是内核线程)

2、linux进程状态

TASK_RUNNING   正被执行或就绪

TASK_INTERRUPTIBLE   等待条件为真时,被唤醒。也可被信号或中断唤醒

TASK_UNINTERRUPTIBLE  资源有效时唤醒,但不可以由信号或中断唤醒

TASK_KILLABLE   同UNINTERRUPTIBLE,但可被致命信号(SIGKILL)唤醒

TASK_TRACED    正处于被调试状态的进程

TASK_DEAD   进程退出时,所处的状态

3、进程的调度策略

普通的分时进程;先入先出的实时进程;时间片轮转的实时进程;批处理进程;只在系统空闲时才能够调度执行的进程

4、进程的调度时机;即schedule()函数被调用

主动式;当进程暂时停止运行时,会把自己的状态置于挂起,并主动调度,让出cpu

抢占式:用户抢占;当内核即将返回用户空间的时候,如果need_resched标志被设置,会导致schedule()被调用

内核抢占:能满足实时性的需求

不允许内核抢占的特例:正在运行中断处理;处于中断上下文;持有自旋锁,读写锁;正在调度scheduler

5、调度步骤: 1、清理当前运行中的进程;

2、选择下一个要运行的进程

3、设置新进程的运行环境

4、进程上下文切换

0 0
原创粉丝点击