一、linux内核
Linux是一种开源电脑操作系统。它是一个用C语言写成,符合POSIX标准的类Unix操系统。
Linux最早是由芬兰黑客 Linus Torvalds为尝试在英特尔x86架构上提供自由免费的类Unix操作系统而开发的。该计划开始于1991年,在计划的早期有一些Minix 黑客提供了协助,而今天全球无数程序员正在为该计划无偿提供帮助。
时钟-->(调度器)
v
[task_struct]<---->[task_struct]
二、内存管理:
1.地址空间管理 v = malloc(50)
2.虚拟地址物理地址的映射
三、网络
1.socket
2.tcp/ip
四、文件系统
1.抽象统一的文件操作接口
2.支持不同的文件系统(fat ext4 ......)
五、设备驱动
-->字符设备 LCD/TS/SOUND/ADC.... <---字符驱动
-->块设备 硬件 u盘 sd卡 <---块驱动
--->网络设备 网卡 <----网卡驱动
六、linux 源码介绍
1、linux内核源码查看:
安装ctags sudo apt-get install ctags
使用ctags vim -t memcpy
在文件中使用ctags :cstag memcpy
追踪源码:ctrl+]
返回:ctrl+o
==============================================
2、在内核中添加自己的文件
mkdir drivers/kernel/
touch drivers/kernel/test.c
#include
#include
#include
//内核启动的时候调用test_init
static __init int test_init(void)
{
int i;
for (i = 0; i < 20; i++)
printk("test_init\n");
//执行成功的话返回0,否则返回相应的错
return 0;
}
module_init(test_init);
MODULE_LICENSE("GPL");
touch drivers/kernel/Makefile
obj-y += test.o
vim drivers/Makefile
obj-y += kernel/
make
3、在内核中添加自己的选项
make menuconfig
--------->Kconfig
kernel/Kconfig drivers/Kconfig
Kconfig
------->.config
make
------->include/generated/autoconf.h--->test.c
------->include/config/auto.conf------->Makefil
六、内核模块
注意:1.编译模块使用的内核和板子中运行的内核必
2.内核的配置要统一
多个文件编译成一个模块
模块之间的依赖关系
符号导出(EXPORT_SYMBOL)
七、内存管理
MMU+Page_table---->
虚拟地址--->映射
Linux启动后 虚拟地址
早期:32 x86
物理内存分为3个驱动
DMA(16M) NOMAL(896M-16M) HIGH
dma寻址 24位
虚拟地址范围 0-4G
0-3G应用程序使用
3G-4G内核使用
DMA+NOMAL--->[3G--3G+896M] 直接映射区 线性
HIGH-------->动态映射到3G+896M
虚拟地址范围
[3G-4G]
0xfff00000----->0xffff0000 临时映射区 高
0xf0000000----->0xff000000
只能保证虚拟是连续,物理上不一定连续
能够把不连续的物理内存映射到连续的虚拟
vmalloc
vzalloc
适合分配比较大的内存
0xc0000000----->0xef800000 直接映射区 52
保证物理空间和虚拟空间都是连续的
alloc_pages 2^n page
alloc_page 2^0 page
__get_free_pages 2^n page
__get_free_page 2^0 page
kmalloc
kzalloc
0xbfe00000----->0xc0000000 永久映射区 高
0xbf000000----->0xbfe00000 模块
0x00000000----->0xbf000000 usr
使用内存
1.映射 [0xc0000100-0xc0000200]
2.权限 申请内存
page struct page -----> 1024M / 4K = 256K
每一个page结构提描述一个物理页 脏页 虚拟地