linux内核网络通信最小单位,ARM-第七次

1240

### 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文件,复制上一段程序,然后组修改

b47a8ea64a23

Paste_Image.png

4.修改Makefile文件,复制mini2440_hello_module那一行之后,进行修改

b47a8ea64a23

Paste_Image.png

5.然后保存退出

6.编译:make zImage

7.进入config界面:make menuconfig

选择Device Drivers --->

b47a8ea64a23

Paste_Image.png

选择Character devices

b47a8ea64a23

Paste_Image.png

选择My module sample,按空格键将M改为*号

b47a8ea64a23

Paste_Image.png

内核设备的编写

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

运行结果

b47a8ea64a23

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

运行结果

b47a8ea64a23

Paste_Image.png

b47a8ea64a23

Paste_Image.png

再升级版,两个模块的,在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

b47a8ea64a23

Paste_Image.png

2.再运行模块2

b47a8ea64a23

Paste_Image.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值