内核驱动学习(二)
来源:互联网 发布:淘宝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、进程上下文切换
- 内核驱动学习(二)
- Linux内核学习-字符设备驱动学习(二)
- Linux内核学习-字符设备驱动学习(二)
- Linux驱动学习笔记(二)--kset内核对象集合
- linux内核与驱动学习笔记(二)----对驱动简单的认识
- 内核驱动学习(一)
- 内核驱动学习(三)
- Linux内核驱动学习(二)----根文件系统的构成 (root filesystem)
- Linux内核驱动学习(二)----根文件系统的构成 (root filesystem)
- Linux内核与驱动开发学习总结:主设备号和次设备号(二)
- 内核驱动笔记(二)——beep驱动
- linux驱动学习(二)——内核模块
- 设备驱动学习之字符设备驱动内核代码分析(二)——字符设备结构体cdev
- 学习linux内核(二)
- 驱动学习总结(二)
- 驱动学习笔记(二)
- 安装内核源代码(驱动学习)
- Linux内核驱动模块(转载学习)
- 水 凯撒密码 南邮NOJ2062
- 《数据库原理与应用》复习总结-转
- 编程中最没用的东西是源代码,最有用的东西是算法和数据结构。
- 数数 南邮NOJ2060
- 使用cocos2d-js制作游戏新的引导 (四)-应用篇
- 内核驱动学习(二)
- swift与结构体
- S4全球总决赛(1) 南邮NOJ
- 被javascript的异步特性玩残了
- S4全球总决赛(2)南邮NOJ2059
- 飞凌FL-2440开发板上实现模拟U盘
- TCP/IP详解笔记(7)
- 进阶_ExpandListView新建_150330
- Swift 全功能的绘图板开发