minux内核介绍

一、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结构提描述一个物理页 脏页 虚拟地

你可能感兴趣的:(minux内核介绍)