快盘下载:好资源、好软件、快快下载吧!

快盘排行|快盘最新

当前位置:首页软件教程电脑软件教程 → linux内核-图文分析

linux内核-图文分析

时间:2022-09-25 06:20:06人气:作者:快盘下载我要评论

1 linux内核内存空间

Linux 内存管理 对于物理内存大于1g 一般设置固定映射区为800M左右 多的物理内存通过高端映射区使用 这样就可以使用1G虚拟内存空间 访问所有物理内存了。

linux内核-图文分析

 注2 动态映射区的内存使用vmalloc函数进行分配;该函数只能分配高端虚拟内存;但是虚拟内存对应的物理内存可以是低端物理内存也可以是高端物理内存。
注3 TASK_SIZE=0xbfe00000 PAGE_OFFSET=0x30000000

2 启动流程

3 静态映射:内核提供了在系统启动时通过map_desc结构体静态创建I/O资源到内核地址空间的线性映射表(即page table)的方式;这种映射表是一种一一映射的关系。程序员可以自己定义该I/O内存资源映射后的虚拟地址。创建好了静态映射表;在内核或驱动中访问该I/O资源时则无需再进行ioreamp 动态映射;可以直接通过映射后的I/O虚拟地址去访问它。在paging_init () --> devicemaps_init () --> mdesc->map_io() 调用map_io函数生成静态映射

4 MACHINE_START相关分析

MACHINE_START(MINI2440, ;Mini2440 board;)
.phys_io = S3C2410_PA_UART,
.io_pg_offst = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,
.boot_params = S3C2410_SDRAM_PA ; 0x100,
.init_irq = s3c24xx_init_irq,
.map_io = mini2440_map_io,
.init_machine = mini2440_machine_init,
.timer = &s3c24xx_timer,
MACHINE_END
//在include/asm-arm/mach/arch.h中;有定义
#define MACHINE_START(_type,_name)    static const struct machine_desc __mach_desc_##_type __used  __attribute__((__section__(;.arch.info.init;))) = { .nr = MACH_TYPE_##_type, .name = _name,
#define MACHINE_END  };
//按定义展开后;;下面的是一个静态变量;编译后放置在.arch.info.init段;
static const struct  machine_desc __mach_desc_MINI2440  __used   __attribute__((__section__(;.arch.info.init;))) =
 {
    .nr = MACH_TYPE_MINI2440,
    .name = ;Mini2440 board;,
    .phys_io = S3C2410_PA_UART,
    .io_pg_offst = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,
    .boot_params = S3C2410_SDRAM_PA ; 0x100,
    .init_irq = s3c24xx_init_irq,
    .map_io = mini2440_map_io,
    .init_machine = mini2440_machine_init,
    .timer = &s3c24xx_timer,
};
(1) MACH_TYPE_MINI2440 是mini2440开发板在linux中的机器号。
(2) ;Mini2440 board;是开发板信息;在终端输入cat /proc/cpuinfo可以查看。
(3) boot_params是bootloader向内核传递的参数位置;这要和bootloader中参数的定义要一致。
(4) init_irq在start_kernel()-->init_IRQ()-->init_arch_irq()中被调用
(5) map_io在setup_arch()-->paging_init()-->devicemaps_init()中被调用 在此函数中映射io空间
(6) init_machine被customize_machine()调用;customize_machine()放在arch_initcall() 段里面;会自动被调用。
(7) timer(系统时钟)在start_kernel()--> time_init()中被调用。
注1;在mini2440_machine_init会将开发板所有的设备添加到总线上。
注2;包含此结构的文件一般位于arch/arm/里面的mach-XXX文件夹下
注3;MACHINE_START定义的变量放在 section(;.arch.info.init;)段

5

相关文章

  • Linux内核调试技术——kprobe使用与实现

    Linux内核调试技术——kprobe使用与实现,Linux kprobes调试技术是内核开发者们专门为了便于跟踪内核函数执行状态所设计的一种轻量级内核调试技术。利用kprobes技术,内核开发人员可以在内核的......
  • Linux内核UDP收包为什么效率低?性能怎么优化(超详细讲解)

    Linux内核UDP收包为什么效率低?性能怎么优化(超详细讲解),现在很多人都在诟病Linux内核协议栈收包效率低,不管他们是真的懂还是一点都不懂只是听别人说的,反正就是在一味地怼Linux内核协议栈,他们的武器貌似只有DPD......

网友评论

快盘下载暂未开通留言功能。

关于我们| 广告联络| 联系我们| 网站帮助| 免责声明| 软件发布

Copyright 2019-2029 【快快下载吧】 版权所有 快快下载吧 | 豫ICP备10006759号公安备案:41010502004165

声明: 快快下载吧上的所有软件和资料来源于互联网,仅供学习和研究使用,请测试后自行销毁,如有侵犯你版权的,请来信指出,本站将立即改正。