### ARM驱动
程序的分种
1.直接运行在硬件上:裸机程序
2.只能运行在对应的操作系统上:应用程序
操作系统
操作系统的定义
- 给应用程序提供运行环境的裸机程序
- 操作系统最底下是linux ,android是中间件,最上层是应用
操作系统的分类
1.任务管理(多任务支持)(最核心的模块)
2.内存管理(mm)
3.网络管理(net)
4.文件管理(fs)
5.设备驱动管理(drivers)
6.块设备(block)
7.对CPU体系的支持(arch)
8.启动管理(init)
操作系统的分时
1.分时:
2.实时:响应速度
- 单内核:linux(某个代码出现问题,则操作系统程序就没法操作)
- 微内核:windows(某个代码出现问题,并不会影响操作系统)
UNIX
UNIX家族OS的共同特点
1.很简洁,仅几百个系统调用
2.所有东西都被当做文件对待
3.C语言编写内核好喝系统软件工具,强大的移植力
4.高效地创建进程,独特的fork()
5.提供一套非常简单又很稳定的进程间通信元语
6.以文本形式存储配置数据
内核编程特点
1.无lib,无任何第三方库,不能包含任何第三方头文件
2.GNU C而非ANSI C
3.没有内存保护机制
4.不要轻易在内核中使福浮点数
5.容积小而固定的栈
6.同步和并发
7.可移植性的重要性
- 注意点:异常服务程序不属于任何一个任务,不是任务所以没有任何一个状态.
算法的特征
1.可行性
2.有穷性
设备操作过程
1.设备管理(代码)
2.任务管理
3.文件管理
4.内存管理
进程与线程
睡眠(任务进行睡眠是为了等待资源的就绪)
- 深度睡眠:只有任务就位才能唤醒
- 浅度睡眠:当信号到来就能唤醒
僵尸进程
- 一个进程fork了一个子进程,父进程结束了,就剩下了子进程,这样的子进程就是僵尸进程
- 解决僵尸进程:一个进程fork一个子进程,子进程再fork一个孙子进程,将子进程结束,则孙子进程脱离父进程,成独立的进程.最后,孙子进程也称为孤儿进程,会被祖宗进程清理掉
内核线程
- pid=0的进程相当于内核,pid=1的进程为祖宗进程
内核空间
1.内核独立于普通应用程序,它处于系统态
2.拥有受保护的内存空间和访问硬件设备的所有权限
3.这种处于系统态被保护起来的内存空间,统称为内核空间
4.如果想要使用,则必须要用接口将内存空间映射到用户空间下,才能使用,不能直接运用
处理器在任何指定时间点上的活动概况为如下:
1.运用于用户空间,执行用户进程(可睡眠)
2.运行于内核空间,处于用户进程上下文,代表每个特定的进程执行(可睡眠)
3.运行于内核空间,
Linux内核编码风格
1.接近K&RC风格(K和R这两个人创建了C语言)
2.缩进
3.switch与case同列
4.空格
(1)空格放在关键字周围
(2)函数名和圆括号之间无空格
(3)函数参数前后无空格
(4)char p,p1;//表示p与p1是char类型的
(5)char* p,p1;//表示p与p1都是char*类型的
5.花括号
(1)函数体采用同列
(2)右花括号可以不单独占一行,与后续关键字同行
6.命名规范
(1)不允许驼峰命名法
7.函数
(1)函数代码长度不应该超过两屏
(2)局部变量不应该超过10个
(3)允许使用inline
8.注释
(1)应该描述代码要做什么和为什么要做
(2)注释不应该包含谁写了哪个函数,
9.Typedef(给已有的数据类型起别名)
(1)内核开发者们强烈反对使用typedef
10.尽量多使用现成的东西,例如:链表
11.在源码中减少代码量
12.结构体初始化
(1)C99风格初始化
(2)
struct foo my_foo={ .a = INITIAL_A, .b =INITIAL_B
块设备
1.块设备:读数据是按照一块一块的读,一块是520k
字符设备的编写
1.进入linux-2.6.32.2/drivers/char
2.mini2440_hello_module.c复制成myhello.c
3.修改Kconfig文件,复制上一段程序,然后组修改
4.修改Makefile文件,复制mini2440_hello_module那一行之后,进行修改
5.然后保存退出
6.编译:make zImage
7.进入config界面:make menuconfig
- 选择Device Drivers --->
- 选择Character devices
- 选择My module sample,按空格键将M改为*号
内核设备的编写
1.在用户自己创建的目录下:创建一个hello.c与Makefile的文件
2.在hello.c中
#include
#include
static int __init mini2440_hello_module_init(void)
{
printk("Hello,Min2440 module is installed !\n");
return 0;
}
static void __exit mini2440_hello_module_cleanup(void)
{
printk("Good_bye,mini2440 module was removed!\n");
}
module_init(mini2440_hello_module_init);
module_exit(mini2440_hello_module_cleanup);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Jiang xiu bi");
MODULE_DESCRIPTION("This is example module!!");
MODULE_VERSION("V1.0.0");
- 在Makefile中
ifeq ($(KERNELRELEASE),)
KERNELDIR ?= /home/jxb/1612/1/sq1612/linux-2.6.32.2
PWD :=$(shell pwd)
modules:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
modules_install:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
clean:
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions *.symvers *.order
.PHONLY:modules modules_install clean
else
obj-m :=hello.o
#obj-m :=hello2.o
endif
- 运行结果
3.代码升级,在hello.c中
#include
#include
//#define __init
//#define __exit
static int howmany=1;
static char * name="Jiang xiu bi";
static int __init mini2440_hello_module_init(void)
{
printk("Hello,Min2440 module is installed !\n");
printk("I am %s!\n",name);
printk("I have %d mini2440 board!\n",howmany);
return 0;
}
static void __exit mini2440_hello_module_cleanup(void)
{
printk("Good_bye,mini2440 module was removed!\n");
}
module_init(mini2440_hello_module_init);
module_exit(mini2440_hello_module_cleanup);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Jiang xiu bi");
MODULE_DESCRIPTION("This is example module!!");
MODULE_VERSION("V1.0.0");
module_param(howmany,int,S_IRUGO);
module_param(name,charp,S_IRUGO);
EXPORT_SYMBOL(howmany);
EXPORT_SYMBOL(name);
- 在Makefile中
ifeq ($(KERNELRELEASE),)
KERNELDIR ?= /home/jxb/1612/1/sq1612/linux-2.6.32.2
PWD :=$(shell pwd)
modules:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
modules_install:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
clean:
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions *.symvers *.order
.PHONLY:modules modules_install clean
else
obj-m :=hello.o
#obj-m :=hello2.o
endif
- 运行结果
- 再升级版,两个模块的,在hello.c中
#include
#include
//#define __init
//#define __exit
static int howmany=1;
static char * name="Jiang xiu bi";
static int __init mini2440_hello_module_init(void)
{
printk("Hello,Min2440 module is installed !\n");
printk("I am %s!\n",name);
printk("I have %d mini2440 board!\n",howmany);
return 0;
}
static void __exit mini2440_hello_module_cleanup(void)
{
printk("Good_bye,mini2440 module was removed!\n");
}
module_init(mini2440_hello_module_init);
module_exit(mini2440_hello_module_cleanup);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Jiang xiu bi");
MODULE_DESCRIPTION("This is example module!!");
MODULE_VERSION("V1.0.0");
module_param(howmany,int,S_IRUGO);
module_param(name,charp,S_IRUGO);
EXPORT_SYMBOL(howmany);
EXPORT_SYMBOL(name);
- 在hello2.c中
#include
#include
//#define __init
//#define __
extern int howmany;
extern char * name;
static int __init mini2440_hello_module_init(void)
{
printk("Hello,Min2440 module is installed !\n");
printk("I am %s!\n",name);
printk("I have %d mini2440 board!\n",howmany);
return 0;
}
static void __exit mini2440_hello_module_cleanup(void)
{
printk("Good_bye,mini2440 module was removed!\n");
}
module_init(mini2440_hello_module_init);
module_exit(mini2440_hello_module_cleanup);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Jiang xiu bi");
MODULE_DESCRIPTION("This is example module!!");
MODULE_VERSION("V1.0.0");
- 在Makefile中
ifeq ($(KERNELRELEASE),)
KERNELDIR ?= /home/jxb/1612/1/sq1612/linux-2.6.32.2
PWD :=$(shell pwd)
modules:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules
modules_install:
$(MAKE) -C $(KERNELDIR) M=$(PWD) modules_install
clean:
rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions *.symvers *.order
.PHONLY:modules modules_install clean
else
obj-m :=hello.o
obj-m :=hello2.o
endif
- 运行结果
1.先运行模块1
2.再运行模块2