当前位置: 首页 > news >正文

临沂营销网站建设做任务的网站

临沂营销网站建设,做任务的网站,磁力链最佳的搜索引擎,网站建设邯郸以下内容源于朱有鹏嵌入式课程的学习#xff0c;如有侵权请告知删除。 前言 1、内容总结 C语言阶段的start_kernel函数位于内核源码/init/main.c文件#xff0c;主要完成以下内容#xff1a; #xff08;1#xff09;打印一些输出信息。 #xff08;2#xff09;初始化…以下内容源于朱有鹏嵌入式课程的学习如有侵权请告知删除。 前言 1、内容总结 C语言阶段的start_kernel函数位于内核源码/init/main.c文件主要完成以下内容 1打印一些输出信息。 2初始化内核工作所需的模块比如内存管理、调度系统、异常处理等。 2、学习方法 1学习思路 抓大放小不深究感兴趣可以就某个话题去网上搜索资料学习。重点内容局部深入分析。2具体学习方法 顺着代码执行路径抓全这是我们的学习主线。对照内核启动的打印信息进行分析。本文章根据打印信息来分析源代码3几条学习线路 分析uboot给kernel传参的影响和实现。硬件初始化与驱动加载。内核启动后的结局与归宿。4重点内容 函数setup_arch()完成的两件事情即机器码架构的查找并且执行架构相关的硬件的初始化以及uboot给内核的传参cmdline。内核启动后的稳定状态。3、start_kernel函数代码 asmlinkage void __init start_kernel(void) {char * command_line;extern struct kernel_param __start___param[], __stop___param[];smp_setup_processor_id();/** Need to run as early as possible, to initialize the* lockdep hash:*/lockdep_init();debug_objects_early_init();/** Set up the the initial canary ASAP:*/boot_init_stack_canary();cgroup_init_early();local_irq_disable();early_boot_irqs_off();early_init_irq_lock_class();/** Interrupts are still disabled. Do necessary setups, then* enable them*/lock_kernel();tick_init();boot_cpu_init();page_address_init();printk(KERN_NOTICE %s, linux_banner);setup_arch(command_line);mm_init_owner(init_mm, init_task);setup_command_line(command_line);setup_nr_cpu_ids();setup_per_cpu_areas();smp_prepare_boot_cpu(); /* arch-specific boot-cpu hooks */build_all_zonelists(NULL);page_alloc_init();printk(KERN_NOTICE Kernel command line: %s\n, boot_command_line);parse_early_param();parse_args(Booting kernel, static_command_line, __start___param,__stop___param - __start___param,unknown_bootoption);/** These use large bootmem allocations and must precede* kmem_cache_init()*/pidhash_init();vfs_caches_init_early();sort_main_extable();trap_init();mm_init();/** Set up the scheduler prior starting any interrupts (such as the* timer interrupt). Full topology setup happens at smp_init()* time - but meanwhile we still have a functioning scheduler.*/sched_init();/** Disable preemption - early bootup scheduling is extremely* fragile until we cpu_idle() for the first time.*/preempt_disable();if (!irqs_disabled()) {printk(KERN_WARNING start_kernel(): bug: interrupts were enabled *very* early, fixing it\n);local_irq_disable();}rcu_init();radix_tree_init();/* init some links before init_ISA_irqs() */early_irq_init();init_IRQ();prio_tree_init();init_timers();hrtimers_init();softirq_init();timekeeping_init();time_init();profile_init();if (!irqs_disabled())printk(KERN_CRIT start_kernel(): bug: interrupts were enabled early\n);early_boot_irqs_on();local_irq_enable();/* Interrupts are enabled now so all GFP allocations are safe. */gfp_allowed_mask __GFP_BITS_MASK;kmem_cache_init_late();/** HACK ALERT! This is early. Were enabling the console before* weve done PCI setups etc, and console_init() must be aware of* this. But we do want output early, in case something goes wrong.*/console_init();if (panic_later)panic(panic_later, panic_param);lockdep_info();/** Need to run this when irqs are enabled, because it wants* to self-test [hard/soft]-irqs on/off lock inversion bugs* too:*/locking_selftest();#ifdef CONFIG_BLK_DEV_INITRDif (initrd_start !initrd_below_start_ok page_to_pfn(virt_to_page((void *)initrd_start)) min_low_pfn) {printk(KERN_CRIT initrd overwritten (0x%08lx 0x%08lx) - disabling it.\n,page_to_pfn(virt_to_page((void *)initrd_start)),min_low_pfn);initrd_start 0;} #endifpage_cgroup_init();enable_debug_pagealloc();kmemtrace_init();kmemleak_init();debug_objects_mem_init();idr_init_cache();setup_per_cpu_pageset();numa_policy_init();if (late_time_init)late_time_init();sched_clock_init();calibrate_delay();pidmap_init();anon_vma_init(); #ifdef CONFIG_X86if (efi_enabled)efi_enter_virtual_mode(); #endifthread_info_cache_init();cred_init();fork_init(totalram_pages);proc_caches_init();buffer_init();key_init();security_init();dbg_late_init();vfs_caches_init(totalram_pages);signals_init();/* rootfs populating might need page-writeback */page_writeback_init(); #ifdef CONFIG_PROC_FSproc_root_init(); #endifcgroup_init();cpuset_init();taskstats_init_early();delayacct_init();check_bugs();acpi_early_init(); /* before LAPIC and SMP init */sfi_init_late();ftrace_init();/* Do the rest non-__inited, were now alive */rest_init(); } 一、内核的解压缩与版本信息打印 1、零碎内容 1smp。smp就是对称多处理器即多核心CPU。 2lockdep。锁定依赖是一个内核调试模块与处理内核自旋锁死锁问题有关。 3cgroup。control group内核提供的一种来处理进程组的技术。 2、内核的解压缩 在内核源码/arch/arm/boot/compressed/head.S文件中调用了decompress_kernel()函数来解压内核而decompress_kernel()函数位于/arch/arm/boot/compressed/misc.c文件中其内容如下 3、打印内核版本信息 1printk函数是内核用来向控制台打印信息的函数类似于应用层编程中的printf。 内核不能使用标准库函数因此不能使用printf其实printk就是内核实现的一个printf。2printk函数可以定义消息输出的级别。 因为linux代码量太多里面的printk打印信息太多。如果所有的printk都能打印出来而不加任何限制则最终内核启动后得到海量的输出信息。linux内核给每一个printk添加一个打印级别。级别定义0-7注意编程的时候要用相应的宏定义不要直接用数字分别代表8种输出的重要性级别0表示最重要7表示最不重要。根据自己的消息的重要性去设置打印级别。linux的控制台有一个消息过滤显示机制控制台只会显示级别比控制台定义的级别高的消息。比如控制台的消息显示级别设置为4那么只有printk中消息级别为0-3也可能是0-4的才可以显示看见。3linux_banner的内容解析 在编译后的kernel目录下使用“ grep UTS_RELEASE * -nR ”搜索得知#define UTS_RELEASE 2.6.35.7。同理得知#define LINUX_COMPILE_BY root同理得知#define LINUX_COMPILE_HOST ubuntu同理得知#define LINUX_COMPILER gcc version 4.4.1 (Sourcery G Lite 2009q3-67) 同理得知#define UTS_VERSION #7 PREEMPT Mon Aug 22 16:50:01 CST 2022二、内核对架构信息的处理 1、setup_arch函数简介  1setup_arch函数主要用来确定当前内核对应的硬件平台CPU与机器码。 linux内核会支持一种CPU的运行而CPU开发板就确定了一个硬件平台。机器码是硬件平台的一个固定的编码用来表征这个硬件平台。经过配置的内核可以在此平台上运行。2当前内核支持的机器码以及硬件平台相关的一些定义都在这个函数中处理。 2、setup_arch函数内部的setup_processor函数 1此函数用来查找CPU信息可以结合串口打印的信息来分析。 3、setup_arch函数内部的setup_machine函数 已知setup_arch函数部分内容截图如下 setup_arch函数内部所调用的setup_machine函数内容如下 setup_machine函数内部所调用的lookup_machine_type函数内容如下 1setup_machine函数的参数 由代码可知setup_arch函数传给setup_machine函数的参数是机器码编号即machine_arch_type。machine_arch_type在include/generated/mach-types.h的32039-32050行定义经过分析后确定它的值是2456。2setup_machine函数的作用 通过传入的机器码编号找到对应这个机器码的machine_desc描述符并且返回这个描述符的指针。3真正干活的函数是lookup_machine_type__lookup_machine_type函数 此函数在head-common.S中分析得知真正干活的函数是__lookup_machine_type。4__lookup_machine_type函数的工作原理 1首先内核把各种CPU架构的信息组织成若干machine_desc结构体的实例然后设置段属性.arch.info.init。如下  在/arch/arm/include/mach/arch.h文件中有如下内容  比如在/arch/arm/mach-s5pv210/mach-x210.c文件中有如下内容 比如在/arch/arm/mach-s3c2410/mach-qt2410.c文件中有如下内容 2其次链接的时候这些描述符就会被连接在一起。 kernel编译后生成的链接脚本/arch/arm/kernel/vmlinux.lds.S部分截图如下 3最后__lookup_machine_type函数到描述符所在处依次遍历各个描述符比对看机器码哪个相同。 三、内核对bootargs的处理 ​​​​​​​1、setup_arch函数进行基本的cmdline处理 ​​​​​​  1可以从串口输出看到对应的信息   2cmd_line指uboot给kernel传参时传递的命令行启动参数即uboot的bootargs。 ​​​​​​​ 3变量default_command_line是一个字符数组是全局变量表示默认的命令行参数。 在/arch/arm/kernel/setup.c文件中定义如下 static char default_command_line[COMMAND_LINE_SIZE] __initdata CONFIG_CMDLINE; 而CONFIG_CMDLINE在内核配置后生成的.config文件中定义如下   4内核对cmdline的处理思路 内核中设置了一个默认的cmdline即.config文件中配置的那个uboot也可以通过tag给kernel再传递一个cmdline。如果uboot给内核传cmdline成功则内核会优先使用uboot所传递的如果uboot没有给内核传cmdline或者传参失败则内核会使用默认的cmdline。内核为什么要这样设计因为希望内核是灵活的可以通过传参对内核进行配置。这个处理思路在setup_arch函数中实现。2、setup_command_line函数 处理和命令行参数cmdline有关的任务。略。 3、parse_early_param函数、parse_args函数 1这两个函数用来解析cmdline传参和其他传参。 比如将cmdline解析得到一个字符串数组这个数组中依次存放了一个个设置项目信息。 2注意这两个函数只是进行解析没有去处理。换言之这两个函数只是把长字符串解析成短字符串最多和内核里控制这个相应功能的变量挂钩了但是并没有去执行。真正执行的代码在各自模块初始化的代码部分。 四、start_kernel函数中的xxx_init函数 start_kernel函数中还调用了很多的xxx_init函数都是内核工作需要的模块的初始化函数。 1trap_init设置异常向量表 2mm_init内存管理模块初始化 3sched_init内核调度系统初始化 4early_irq_init、init_IRQ中断初始化 5console_init控制台初始化 以上只列出部分xxx_init函数。这些初始化之后内核就具备了基本的工作条件。如果把内核比喻成一个复杂机器那么start_kernel函数的作用就是把众多零部件组装在一起形成这个机器让它具备工作的基本条件。 五、start_kernel函数中的rest_init函数 1、rest_init函数简介 此函数之前内核的基本组装已经完成剩下的工作放在一个叫rest_init的函数中完成。 rest_init函数内容如下 1rest_init函数调用kernel_thread函数启动了2个内核线程 1kernel_init 2kthreadd 2rest_init函数调用schedule函数开启内核的调度系统从此linux系统开始运转起来。 3rest_init函数最终调用cpu_idle函数结束整个内核的启动cpu_idle函数里面是死循环。而调度系统负责考评系统中所有的进程。只要有哪个需要被运行调度系统就会终止cpu_idle死循环进程空闲进程转而去执行有意义的干活的进程。  2、什么是内核线程 一个运行的程序就是一个进程这个程序和别的程序是分开的这个程序可以被内核单独调用执行或者暂停。应用层运行一个程序就构成一个用户进程/线程内核中运行一个函数函数其实就是一个程序就构成一个内核进程/线程。因此kernel_thead函数运行一个函数就是把这个函数变成一个内核线程可以被内核调度系统去调度即去调度器注册将来调度的时候会进行考虑。3、进程0、进程1、进程2 1截至目前为止一共涉及到3个内核进程/线程。操作系统用数字来表示/记录一个进程/线程此数字就被称为这个进程的进程号。这个号码是从0开始分配的。 进程0也就是那个死循环也叫idle进程空闲进程。进程1也就是kernel_init函数这个进程被称为init进程。进程2也就是kthreadd函数这个进程是linux内核的守护进程。这个进程是用来保证linux内核自己本身能正常工作的。2在linux命令行下使用ps命令可以查看当前linux系统中运行的进程情况。 3在ubuntu下ps -aux可以看到当前系统运行的所有进程可以看出进程号是从1开始的。 为什么不从0开始因为进程0属于内核进程而不是一个用户进程。
http://www.pierceye.com/news/328050/

相关文章:

  • 书画院网站源码网站主题模板下载不了
  • 邢台制作网站网上申报流程
  • 做网站的困难做的网站有营销效果吗
  • 高端集团网站建设公司做网站开发的有外快嘛
  • 网站服务器防火墙设置惠州网络推广公司哪家好
  • 做网站根据内容生成pdfwordpress自媒体二号
  • 临沂网站开发不会写代码怎么做网站
  • 怎么做加密货币网站wordpress 多域名登陆
  • 做网站的过程做网站公司广州
  • 女人动漫做受网站wordpress如何作页面
  • 做网站导航栏素材图建筑设计网站制作
  • 淘宝的网站建设方案国家为何要求所有网站均须备案
  • 企业网站模板下载哪家公司强温州建设公司网站
  • 网站编辑能在家做wordpress 做的商城
  • 空间信息网站开发公司工程项目质量安全管理体系
  • 网站流量被黑包装回收网站建设
  • 网站拒绝被百度收录成品网站1688特色
  • 深圳住房和建设局网站官网打不开WordPress 斗鱼
  • 纯文本网站连接西宁圆井模板我自己做的网站
  • 职业院校专题建设网站wordpress文章版权投诉
  • 网站改版好吗如何解决旅游网站建设问题
  • 爱站网使用的是什么网站模仿网站页面违法吗
  • 做民宿的网站wordpress 短信平台
  • 婚恋网站上认识人 带你做原油交易怎么用手机创造网站
  • 网站建设投标书服务方案范本天津北京网站建设公司
  • 网站建设好评公司微企点建站怎么样
  • 某网站开发项目成本估计推广普通话作文500字
  • 制作网站需要哪些工作网站建设佰金手指科杰十三
  • 外贸哪家做网站wordpress excel搜索
  • 苏州做网站推广的英文搜索网站