kernel_kernel32 - CSDN
精华内容
参与话题
  • 机器学习里的 kernel 是指什么? 先给个定义:核函数K(kernel function)就是指K(x, y) = <f(x), f(y)>,其中x和y是n维的输入值,f(·) 是从n维到m维的映射(通常而言,m>>n)。&...

    机器学习里的 kernel 是指什么?

    先给个定义:核函数K(kernel function)就是指K(x, y) = <f(x), f(y)>,其中x和y是n维的输入值,f(·) 是从n维到m维的映射(通常而言,m>>n)。<x, y>是x和y的内积(inner product),严格来说应该叫欧式空间的标准内积,也就是很多人常说的点积(dot product)。

    光看这一段还是不明白kernel是什么,用来干什么的…对吧?不要急。一个好的知识分享者是不会把一篇空洞的定义扔下就不管的,TA会告诉你这个概念的intuition,然后给你举个小小的栗子,最后告诉你几个应用场景。Andrew Ng的Machine Learning为什么会成为一门现象级的MOOC?原因之一就是因为他除了是个学术上的大神,也同样是个极有质素的知识分享者。所以我要学习他。

    好了,intuitively(这也模仿得太生硬了吧…),要计算<f(x), f(y)>,我们要先分别计算f(x)和f(y),然后再求它们的内积。上面的定义里也说了,经过映射后的x和y,维数大大增加,计算内积的成本可能会非常之大,而且在高位空间费力牛劲儿地计算内积,内积又是一个scalar,相当于说又把我们的计算从高维空间拉回到一维空间!所以我们特别想要一个“简便运算法”,帮助我们不需要奔向高维空间就能在家门口计算得到想要的内积。这时候该轮到我们的猪脚——kernel登场了,它能帮我们做到这一点。

    举个小小栗子。
    令 x = (x1, x2, x3, x4); y = (y1, y2, y3, y4);
    令 f(x) = (x1x1, x1x2, x1x3, x1x4, x2x1, x2x2, x2x3, x2x4, x3x1, x3x2, x3x3, x3x4, x4x1, x4x2, x4x3, x4x4); f(y)亦然;
    令核函数 K(x, y) = (<x, y>)^2.
    接下来,让我们带几个简单的数字进去看看是个什么效果:x = (1, 2, 3, 4); y = (5, 6, 7, 8). 那么:
    f(x) = ( 1, 2, 3, 4, 2, 4, 6, 8, 3, 6, 9, 12, 4, 8, 12, 16) ;
    f(y) = (25, 30, 35, 40, 30, 36, 42, 48, 35, 42, 49, 56, 40, 48, 56, 64) ;
    <f(x), f(y)> = 25+60+105+160+60+144+252+384+105+252+441+672+160+384+672+1024
    = 4900.
    好累,对不对?可谁让f(·)把四维空间的数据映射到十六维空间里呢?
    如果我们用核函数呢?
    K(x, y) = (5+12+21+32)^2 = 70^2 = 4900.
    就是这样!

    所以现在你看出来了吧,kernel其实就是帮我们省去在高维空间里进行繁琐计算的“简便运算法”。甚至,它能解决无限维空间无法计算的问题!因为有时f(·)会把n维空间映射到无限维空间去,对此我们常常束手无策,除非是用kernel,尤其是RBF kernel(K(x,y) = exp(-||x-y||^2) )。

    在有kernel之前,做machine learning的典型的流程应该是:data --> features --> learning algorithm,但kernel给我们提供了一个alternative,那就是,我们不必定义从data到feature的映射函数,而是可以直接kernel(data) --> learning algorithm,也可以是data --> features --> kernel(features) --> learning algorithm。
    所以虽然我们看到kernel常被应用在SVM(SVM中的kernel应该是后一种用法,后文再说),但其实要用到内积的learning algorithm都可以使用kernel。“用到内积的learning algorithm”其实并不少见,不信你可以想一想最普通不过的linear classifier/regressor有没有一个步骤是计算特征向量(feature vectors)。



    那么kernel在SVM究竟扮演着什么角色?
    初学SVM时常常可能对kernel有一个误读,那就是误以为是kernel使得低维空间的点投射到高位空间后实现了线性可分。其实不然。这是把kernel和feature space transformation混为了一谈。(这个错误其实很蠢,只要你把SVM从头到尾认真推导一遍就不会犯我这个错。)
    还是简单回顾一下吧。SVM就是 y = w’·φ(x) + b,其中φ(x)是特征向量(feature vectors),并且是φ(x)使得数据从低维投射到高位空间后实现了线性可分。而kernel是在解对偶问题的最优化问题时,能够使φ(x)更方便地计算出来,特别是φ(x)维数很高的时候。




    ------------------------------正文完,附上几个链接--------------------------------
    kernel的种类繁多,如果想详细了解,可以看看这个帖子 Kernel Functions for Machine Learning Applications
    Caltech的机器学习: Learning From Data
    台湾大学林轩田《机器学习基石》:Coursera - Free Online Courses From Top Universities

    PS:本来草稿里存的话是想告诉题主,这样的问题好好去翻教材,或者看Caltech的Abu-Mostafa教授的公开课Learning from Data,或者看台湾大学林轩田的《机器学习基石》,(前者是后者的导师,而且师徒俩讲课都很萌),弄懂kernel这个概念是不成问题的。
    但当时没有就这样草率地发出来。原因倒不是怕被扣友善度,而是接连地追问了我自己到底弄明白kernel了没有。所以谢谢题主问这个问题,你又驱使我把这个概念完整地思考一遍,并记录下来。
    展开全文
  • Linux内核之Kernel目录

    2019-06-20 10:38:22
    通过本课程的学习,可以达到以下目的: 1、通过asm.s及trap.c的学习可以详细了解带错误码和不带错误码的硬件中断处理流程,以及这个过程中内核堆栈的变化过程; 2、通过system_call.s及sys.c的学习,了解系统...
  • 关于Kernel的一点解释

    千次阅读 2018-04-09 15:30:31
    通过这张图我们一目了然,内核(kernel)实则就是一个小的矩阵,通过扫描图片来进行重新计算,计算方法为矩阵相乘后并将各个元素相加,得到新的像素值。 由图可理解,内核的大小必须为奇数。 通过动图来更好的理解...

    kernel

    通过这张图我们一目了然,内核(kernel)实则就是一个小的矩阵,通过扫描图片来进行重新计算,计算方法为矩阵相乘后并将各个元素相加,得到新的像素值。
    由图可理解,内核的大小必须为奇数。

    这里写图片描述

    通过动图来更好的理解上面这段话。

    展开全文
  • Linux内核更新是越来越快了,可能由于Linux的普及,大家都开始关注了,各种安全隐患也越来越多。支持Intel、Alpha、PPC、Sparc、IA-64、ARM、MIPS、Amiga、Atari和IBMs/390等,还支持32位大文件系统。...

    Linux内核更新是越来越快了,可能由于Linux的普及,大家都开始关注了,各种安全隐患也越来越多。支持Intel、Alpha、PPC、Sparc、IA-64、ARM、MIPS、Amiga、Atari和IBMs/390等,还支持32位大文件系统。而在Intel平台上,物理内存最大支持可以达到64GB。加强对IDE和SCSI硬件系统的支持,并增强了对USB设备和3D加速卡的支持。下面向大家详细介绍LinuxKernel。

        牛津字典中对"kernel"一词的定义是:"较软的、通常是一个坚果可食用的部分。"当然还有第二种定义:"某个东西核心或者最重要的部分。"对Linux来说,它的Kernel无疑属于第二种解释。让我们来看看这个重要的东西是如何工作的,先从一点理论说起。

        广义地来说kernel就是一个软件,它在硬件和运行在计算机上的应用程序之间提供了一个层。严格点从计算机科学的角度来说,Linux中的Kernel指的是Linus Torvalds在90年代初期写的那点代码。

        所有的你在Linux各版本中看到的其他东西--Bash shell、KDE窗口管理器、web浏览器、X服务器、Tux Racer以及所有的其他,都不过是运行在Linux上的应用而已,而不是操作系统自身的一部分。为了给大家一个更加直观的感觉,我来举个例子,比如RHEL5的安装大概要占据2.5GB的硬盘空间(具体多大当然视你的选择安装来定),在这其中,kernel以及它的各个模块组件,只有47MB,所占比例约为2%。
     

    在kernel内部

        那么kernel到底是如何工作的呢?如下面的图表。Kernel通过许多的进入端口也就是我们从技术角度所说的系统调用,来使得运行在它上面的应用程序可用。Kernel使用的系统调用比如"读"和"写"来提供你硬件的抽象(abstraction)。

        从程序员的视角来看,这些看起来只是普通的功能调用,然而实际上系统调用在处理器的操作模式上,从用户空间到Kernel空间有一个明显的切换。同时,系统调用提供了一个"Linux虚拟机",可以被认为是对硬件的抽象。

        Kernel提供的更明显的抽象之一是文件系统。举例来说,这里有一段短的程序是用C写的,它打开了一个文件并将内容拷贝到标准的输出:

        #include <fcntl.h>
        int main()
        {
            int fd, count; char buf[1000];
            fd=open("mydata", O_RDONLY);
            count = read(fd, buf, 1000);
            write(1, buf, count);
            close(fd);
        }

    台前幕后    在这里,你可以看到四个系统调用的例子:打开、读、写和关闭。不谈这段程序语法的细节,重点是:通过这些系统调用Linux Kernel提供了一个文件的"错觉",而实际上它不过是一堆数据有了个名字,这样一来你就不必去与硬件底层的堆栈、分区、头和指针、分区等交涉了,而是直接以例子中的方式与硬件"交流",这也就是我们所说的抽象(abstraction),将底层的东西以更易懂的方式表达出来。
        系统文件是Kernel提供的较为明显的一种抽象。还有一些特性不是这么的明显,比如进程调度。任何一个时间,都可能有好几个进程或者程序等待着运行。Kernel的时间调度给每个进程分配CPU时间,所以就一段时间内来说,我们会有种错觉:电脑同一时间运行好几个程序。这是另外一个C程序:

        #include <stdlib.h>
        main()
        {
          if (fork()) {
            write(1, "Parent\n", 7);
            wait(0);
            exit(0);
          }
          else {
            write(1, "Child\n", 6);
            exit(0);
          }
        }

     

        在这个程序中创建了一个新进程,而原来的进程(父进程)和新进程(子进程)都编写了标准输出然后结束。注意系统调用fork(), exit() 以及 wait()执行程序的创建、结束和各自同步。这是进程管理和调度中最典型的简单调用。

        Kernel还有一个更加不易见到的功能,连程序员都不易察觉,那就是存储管理。每个程序运行得都好像它有个自己的地址空间来调用一样,实际上它跟其他进程一样共享计算机的物理存储,如果系统运行的存储过低,它的地址空间甚至会被磁盘的交互区暂时寄用。存储管理的另外一个方面是防止一个进程访问其他进程的地址空间--对于多进程操作系统来说这是很必要的一个防范措施。

        Kernel同样还配置网络链接协议比如IP、TCP和UDP等,它们在网络上提供机器对机器(machine-to-machine)和进程对进程(process-to-process)的通信。这里又会造成一种假象,即TCP在两个进程之间提供了一个固定连接--就好像连接两个电话的铜线一样,实际中却并没有固定的连接,特殊的引用协议比如FTP、DNS和HTTP是通过用户级程序来实施的,而并非Kernel的一部分。

        Linux(像之前的Unix)在安全方面口碑很好,这是因为Kernel跟踪记录了每个运行进程的user ID和group ID,每次当一个应用企图访问资源(比如打开一个文件来写入)的时候,Kernel就会核对文件上的访问许可然后做出允许/禁止的命令。这种访问控制模式最终对整个Linux系统的安全作用很大。

        Kernel还提供了一大套模块的集合,其功能包括如何处理与硬件设备交流的诸多细节、如何从磁盘读取一个分区、如果从网络接口卡获取数据包等。有时我们称这些为设备驱动。
     

    模块化的Kernel

        现在我们队Kernel是做什么的已经有了一些了解,让我们再来简单看下它的物理组成。早期版本的Linux Kernel是整体式的,也就是说所有的部件都静态地连接成一个(很大的)执行文件。

        相比较而言,现在的Linux Kernel是模块化的:许多功能包含在模块内,然后动态地载入kernel中。这使得kernel的内核很小,而且在运行kernel时可以不必reboot就能载入和替代模块。

        Kernel的内核在boot time时从位于/boot 目录的一个文件加载进存储中,通常这个/boot 目录会被叫做KERNELVERSION,KERNELVERSION与kernel版本有关。(如果你想知道你的kernel版本是什么,运行命令行显示系统信息-r。)kernel的模块位于目录/lib/modules/KERNELVERSION之下,所有的组件都会在kernel安装时被拷贝。
     

    管理模块

        大部分情况下,Linux管理它的模块不需要你的帮忙,但是如果必要的时候有命令行可以来手动检查和管理模块。比如,为了查清楚当前到底哪个模块在载入kernel。这里有一个lsmod输出的例子:

        # lsmod

        pCSPkr                  4224   0

        hci_usb                  18204  2

        psmouse                38920  0

        bluetooth                55908  7  rfcomm,l2cap,hci_usb

        yenta_socket          27532  5

        rSRC_nonstatIC     14080  1  yenta_socket

        iSOFs                     36284  0

        输出的内容包括:模块的名字、大小、使用次数和依赖于它的模块列表。使用次数对防止卸载当前活跃的模块非常总要。Linux只允许使用次数为零的模块被移除。

        你可以使用modprobe来手动加载和卸载模块,(还有两个命令行叫做insmodrmmod,但modprobe更易于使用因为它自动移除了模块依赖)。比如lsmod的输出在我们的电脑上显示了一个名叫isofs的卸载模块,它的使用次数是零而且没有依赖模块,(isofs是一个模块,它支持CD上使用的ISO系统文件格式)这种情况下,kernel会允许我们卸载模块:

        # modprobe -r isofs 

        现在,isofs不再显示在Ismod的输出中,kernel由此节省了36,284字节的存储。如果你放入CD并且让它自动安装,kernel将自动重新载入isofs模块,而且isofs的使用次数增加到1次。如果这时候你还试图移除模块,就不会成功了因为它正在被使用:

        # modprobe -r isofs   

        FATAL: Module isofs is in use.

        Lsmod只是列出了当前被载入的模块,modprobe则将列出所有可用的模块,它实际上输出了/lib/modules/KERNELVERSION目录下所有的模块,名单会很长!

        实际上,使用modprobe来手动加载一个模块并不常见,但确实可以通过modprobe命令行来对模块设置参数,例如:

        # modprobe usbcore blinkenlights=1 

        我们并不是在创建blinkenlights,而是usbcore模块的实参数。

        那么如何知道一个模块会接受什么参数呢?一个比较好的方法是使用modinfo命令,它列出了关于模块的种种信息。这里有一个关于模块snd-hda-intel的例子

        # modinfo snd-hda-intel

        filename:      /lib/modules/2.6.20-16-generic/kernel/sound/PCI/hda/snd-hda-intel.ko

        description:   Intel HDA driver

        license:       GPL

        srcversion:    A3552B2DF3A932D88FFC00C

        alias:         pci:v000010DEd0000055Dsv*sd*bc*sc*i*

        alias:         pci:v000010DEd0000055Csv*sd*bc*sc*i*

        depends:       snd-PCM,snd-page-alLOC,snd-hda-codec,snd

        vermagic:      2.6.20-16-generic SMP mod_unload 586

        parm:          index:Index value for Intel HD audio interface. (int)

        parm:          id:ID string for Intel HD audio interface. (charp)

        parm:          model:Use the given board model. (charp)

        parm:          position_fix:Fix DMA pointer (0 = auto, 1 = none, 2 = POSBUF, 3 = FIFO size). (int)

        parm:          probe_mask:Bitmask to probe codecs (default = -1). (int)

        parm:          single_cmd:Use single command to communicate with codecs (for debugging only). (bool)

        parm:          enable_msi:Enable Message SignaLED Interrupt (MSI) (int)

        parm:          enable:bool

        对我们来说比较有兴趣的以"parm"开头的那些部分:显示了模块所接受的参数。这些描述都比较简明,如果想要更多的信息,那就安装kernel的源代码,在类似于/usr/src/KERNELVERSION/Documentation的目录下你会找到。

        里面会有一些有趣的东西,比如文件/usr/src/KERNELVERSION/Documentation/sound/alsa/ALSA-Configuration.txt描述的是被许多ALSA声音模块承认的参数;/usr/src/KERNELVERSION/Documentation/kernel-parameters.txt这个文件也很有用。

        前几天在Ubuntu论坛有一个例子,说的是如何将参数传递到一个模块(详见https://help.ubuntu.com/community/HdaIntelSoundHowto)。实际上问题的关键是snd-hda-intel参数在正确驱动声音硬件时需要一点操作,而且在boot time加载时会中止。解决方法的一部分是将probe_mask=1选项赋给模块,如果你是手动加载模块,你需要输入:

        # modprobe snd-hda-intel probe_mask=1 

        更有可能,你在文件/etc/modprobe.conf中放置这样类似的一行:options snd-hda-intel probe_mask=1

        这"告诉"modprobe每次在加载snd-hda-intel模块时包含probe_mask=1选项。现在的有些Linux版本将这一信息分离进/etc/modprobe.d下的不同文件中了,而不是放入modprobe.conf中。
     

    /proc系统文件

        Linux kernel同样通过/proc系统文件来展示了许多细节。为了说明/proc,我们首先需要扩展我们对于文件的理解。除了认为文件就是存储在硬盘或者CD或者存储空间上的持久信息之外,我们还应当把它理解为任何可以通过传统系统调用如:打开、读、写、关闭等访问的信息,当然它也可以被常见的程序访问。

        /proc之下的"文件"完全是kernel虚拟的一个部分,给我们一个视角可以看到kernel内部的数据结构。实际上,许多Linux的报告工具均能够很好地呈现在/proc下的文件中寻到的格式化版本的信息。比如,一行/proc/modules将展示一行当前加载的模块。

        同样的,/proc/meminfo提供了关于虚拟存储系统当前状态的更多细节信息,而类如vmstat的工具则是以一种更加可理解的方式提供了相同的一些信息;/proc/net/arp显示了系统ARP cache的当前内容,从命令行来说,arp -a显示的也是相同的信息。

        尤其有意思的是/proc/sys下的"文件"。/proc/sys/net/ipv4/ip_forward下的设置告诉我们kernel是否将转发IP数据包,也就是说是否扮演网关的作用。现在,kernel告诉我们这是关闭的:

        # cat /proc/sys/net/ipv4/ip_forward   

        0

        当你发现你可以对这些文件写入的时候,你会觉得更加有意思。继续举例来说:

        # echo 1 > /proc/sys/net/ipv4/ip_forward

    将在运行的kernel中打开IP 转发(IP forwarding)

    除了使用cat和echo来检查和更正/proc/sys下的设置以外,你也可以使用sysctl命令:

        # sysctl net.ipv4.ip_forward     

        net.ipv4.ip_forward = 0 

    这等同于:

        # cat /proc/sys/net/ipv4/ip_forward   

        0 

    也等同于:

        # sysctl -w net.ipv4.ip_forward=1  

        net.ipv4.ip_forward = 1 

    还等同于:

        # echo 1 > /proc/sys/net/ipv4/ip_forward 

        需要注意的是,以这种方式你所做的设置改变只能影响当前运行的kernel的,当reboot的时候就不再有效。如果想让设置永久有效,将它们放置在/etc/sysctl.conf文件中。在boot time时,sysctl将自动重新确定它在此文件下找到的任何设置。

    /etc/sysctl.conf下的代码行大概是这样的:net.ipv4.ip_forward=1
     

    性能调优(performance tuning)

        有这样一个说法:/proc/sys下可写入的参数孕育了整个Linux性能调优的亚文化。我个人觉得这种说法有点过夸,但这里会有几个你确实很想一试的例子:Oracle 10g的安装说明(www.oracle.com/technology/obe/obe10gdb/install/linuxpreinst/linuxpreinst.htm)要求你设置一组参数,包括:kernel.shmmax=2147483648 这将公用存储器的大小设置为2GB。(公用存储器是处理期内的通信机制,允许存储单元在多个进程的地址空间内同时可用)

        IBM 'Redpaper'在Linux性能和调优方面的说明(www.redbooks.ibm.com/abstracts/redp4285.html)在调教/proc/sys下的参数方面给出了不少建议,包括:vm.swappiness=100 这个参数控制着存储页如何被交换到磁盘。

        一些参数可以被设置从而提高安全性,如net.ipv4.icmp_echo_ignore_broadcasts=1 它"告诉"kernel不必响应ICMP请求,从而使得你的网络免受类如Smurf攻击之类的拒绝服务器(denial-of-service)型攻击。

        net.ipv4.conf.all.rp_filter=1 则是"告诉"kernel加强入站过滤(ingress filtering)和出站过滤(egress filtering)

        那么有没有一个说明能涵盖这所有的参数?好吧,这有一行命令:# sysctl -a 它将展示所有的参数名字和当前值。列表很长,但是你无法知道这些参数是做什么的。另外比较有用的参考是Red Hat Enterprise Linux Reference Guide,对此有整章节的描述,你可以从www.redhat.com/docs/manuals/enterprise上下载。

    展开全文
  • Linux Kernel系列一:开篇和Kernel启动概要

    万次阅读 多人点赞 2011-08-17 09:31:18
    最近几个月将Linux Kernel的大概研究了一下,下面需要进行深入详细的分析。主要将以S3C2440的一块开发板为硬件实体。大概包括如下内容: 1 bootloader分析,以uboot为主,结合具体开发板的情况。我的目标是解释清楚...

    前言

    最近几个月将Linux Kernel的大概研究了一下,下面需要进行深入详细的分析。主要将以S3C2440的一块开发板为硬件实体。大概包括如下内容:

    1 bootloader分析,以uboot为主,结合具体开发板的情况。我的目标是解释清楚uboot的工作原理(说实话,分析过程中不太想被硬件绑架,但是需要以一个实际的例子

    来做分析)

    2 kernel部分,这就很多内容了。打算从kernel启动的流程开始分析。

    3 除kernel本身外,还有很多的知识,例如ld的输入script分析等,这里会一起介绍。


    kernel启动流程概要

    一:内核Image的组成
    1 ES(Embed System)启动的时候,CPU加电,执行的第一条语句是Bootloader,这个非常类似PC机上的BIOS。BL将内核加载后,控制器移交给LK
    2 LK执行的第一条语句是什么?vmlinux是单体的内核表示。根据前面说的内核编译连接知识,第一条语句是head.S中(历史原因,MD,有很多文件都叫head.S)
     我们需要重新分析一下内核(这里就是zImage了)的组成,(方法很简单,研究make的执行过程,通过make V=1 zImage可以得到几乎全部信息)
    • vmlinux,这个是未压缩、未strip的内核模块,ELF结构
    • Image:二进制、未压缩、但是strip后的内核
    • head.o:ARM相关的,由BL将控制权转交给它。即前面提到的head.S生成
    • pigg.gz:Image文件的gzip压缩
    • piggy.o:由piggy.S生成,这个S文件通过include Bin方式将Image包含进来。piggy的意思就是背负、肩扛。很形象不是?
    • misc.o:从上面看,涉及到一些解压方面的内容,而misc提供一些辅助函数
    • vmlinux:悲催.....这个文件是head+pigg+misc构成的vmlinux。名字一样不是?真的很混淆!
    • zImage:再由上面这个vmlinux压缩而来
    图1很好得展示了这个过程。

    图1 内核的构成
    3 piggy的故事
    piggy.S很有意思,建立了一个section,并且有一个标志来指示piggy.gz的边界。
    piggy对应的是一个叫bootstrap的image,注意,Bootstrap和Bootloader不一样,它是在BL之后的一段代码,用来
    解压kernel,设置内存等作用。也可以叫second stage boot。
     
    4 Bootloadre和BootstrapLoader
    BL和BSL的区别是什么?
    • BL只是初始化硬件,不依赖linux,不处理linux
    • BSL在BL后执行,依赖linux,因为要解压linux。另外一个重要点就是BSL需要为LINUX的运行建立环境
    BSL的工作包括:
    • head.O:初始化CPU等工作
    • misc.O:解压,重定位(例如将kernel移动到另外一个位置上) decompress_kernel
    • 其他工作
    init/main.c:start_kernel
    启动调用图见图2.

    图2 启动调用流程图
    下面来分析这个启动流程
    1 kernel中的head.o分析:尽量保持CPU系列的通用,例如arm的CPU等初始化都在做。但是具体板子(例如CPU+其他硬件)怎么初始化?这就是由mach目录中的初始化函数做到的。所以,kernel初始化分为:generic CPU初始化+具体板子的初始化。head.o初始化后,跳转到main.o的start_kernel,继续后面的流程
    2 start_kernel:(init/main.c):start_kernel的转移由head.O做的,不过代码一般包含在更通用的head_common.S中
       以后想做kernel的分析,就从main开始吧. start_kernel做了什么事情呢?
    • 刚才只是初始化了cpu相关的,而具体和板子相关的由start_arch执行
    3 kernel 参数分析:kernel command line。注意,这个参数是由BL传递给kernel的,不过这个参数又是谁设置的呢?又存在什么地方呢?这个line放在一个global的地方,
      另外,kernel如何处理这些参数呢?有一个比较好的办法,__set_up宏,将一些参数和对应的函数指针存在一个特殊的section中,然后循环调用这个section中的函数。(和驱动module中的很像)。定义在init.h中。关于一些特殊参数的取值,在arch/arm/kernel/vmlinux.lds.S中定义。(以后得去看看ld的manual了)__set_up这个宏还有一个flags比如early,表示处理阶段是否在early-stage做。标志有__init的section最终占用的内存会被抛弃..
    4 子系统初始化:包括中断、等。?section嵌套section?
    5 kernel_init进程:start_kernel最后会fork一个kernel_init进程,而原执行进程变成idle进程了..
    6 用户空间的init进程:由kernel_init进程最终通过execve init完成
    7 参考文献。ELP这本书给的参考文献都巨强..

     

    展开全文
  • Kernel Method的理解

    千次阅读 2018-08-14 10:18:09
    kernel method是针对低维线性不可分而提出的一种解决方法,在PRML中有一章节的介绍,对其理解,也是迭代更进的过程。 简单来说,kernel method是一种低维和高维特征空间映射的方法,利用低维内积的函数来表征高维内...
  • Kernel定义

    千次阅读 2016-09-20 22:17:52
    以下内容来自wiki ...Kernel (image processing) http://en.wikipedia.org/wiki/Kernel_(image_processing) In image processing, a kernel, convolution matrix, or mask is a small matrix useful f
  • 核函数-Kernel Function汇总

    千次阅读 2018-08-07 12:48:43
      Kernel Functions Below is a list of some kernel functions available from the existing literature. As was the case with previous articles, ...
  • 对核函数(kernel)最通俗易懂的理解

    万次阅读 多人点赞 2019-12-27 16:42:27
    我的机器学习教程「美团」算法工程师带你入门机器学习 已经开始更新了,欢迎大家订阅~ 任何关于算法、编程、AI行业知识或博客内容的问题,可以随时扫码关注公众号「图灵的猫」,加入”学习小组“,沙雕博主在线答疑...
  • 核函数K(kernel function)

    千次阅读 2016-11-11 10:47:40
    1 核函数K(kernel function)定义核函数K(kernel function)就是指K(x, y) = (x), f(y)>,其中x和y是n维的输入值,f(·) 是从n维到m维的映射(通常,m>>n)。, y>是x和y的内积(inner product)(也称点积(dot ...
  • 卷积:kernel size/padding/stride

    千次阅读 2019-08-30 16:24:15
    卷积的原理 ...输入图片大小为200×200,依次经过一层卷积(kernel size 5×5,padding 1,stride 2),pooling(kernel size 3×3,padding 0,stride 1),又一层卷积(kernel size 3×3,padding 1...
  • [kernel 启动流程] (第一章)概述

    千次阅读 2016-10-20 14:38:04
    建议先参考《[kernel 启动流程] 前篇——vmlinux.lds分析》等文章。一、kernel启动之前的准备动作在kernel启动之前的准备都是由bootloader来完成。所以不管是什么bootloader,例如uboot、LK、superboot等等,都需要...
  • 当运行程序或者游戏时,系统弹出错误提示“找不到或者没有找到kernel32.dll”时,说明您系统中缺失这个dll文件或者该dll文件没有被...kernel32.dll如何完成安装? 1、如果在运行某软件或编译程序时提示缺少、找不到dll
  • jupyter notebook kernel error 或者 kernel starting please wait 处理方法解决方案1、检测内核路径2、检查kernel内核文件正确路径(Anaconda下的python)错误路径(非Anaconda下的python)3、修正路径总结 作者手贱把...
  • 最近在服程序时遇到个问题,电脑是win764位,编译完的exe测试,偶尔总报错,报错是偶尔的,有时候报错很频繁,但是有一次测试,测试了半天都...在网上查找好多资料也,其实这并不是KERNELBASE.dll的问题,也并不需要...
  • 拿到他的Macbook后,果然卡的不行,打字都是一顿一顿的,简直比我的黑苹果还卡,我打开任务管理器查看了一下,发现一个kernel_task的进程cpu占用率竟然高达600%,很明显了,卡的原因就是这个了,我本以为找到原因,...
  • linux kernel的cmdline参数解析原理分析

    万次阅读 2016-04-08 12:49:28
    第一种是kernel通用参数,如console=ttyS0,115200 root=/rdinit/init等。这里以console为例。 第二种是kernel下各个driver中需要的参数,在写driver中,如果需要一些启动时可变参数。 可以在driver最后加入module_...
  • 机器学习中的核方法(Kernel Method)

    万次阅读 多人点赞 2020-03-23 06:04:05
    说到机器学习中的核方法(Kernel Method),大部分人应该是在学习SVM的时候认识到它或者听说它。它的基本思想是说,普通的SVM分类超平面只能应对线性可分的情况,而对于线性不可分的情况我们则需要引入一个Kernel,...
  • linux kernel下输入输出console如何实现

    万次阅读 2016-06-02 10:47:58
    kernel和user空间下都有一个console,关系到kernel下printk的方向和user下printf的方向,实现差别还是很大的。 kernel下的console是输入输出设备driver中实现的简单的输出console,只实现write函数,并且是直接输出...
  • 在前一篇文章提到,从源代码树下载下来的最新Android源代码,是不包括内核代码的,也就是Android源代码工程默认不包含Linux Kernel代码,而是使用预先编译好的内核,也就是prebuilt/android-arm/kernel/kernel-qemu...
1 2 3 4 5 ... 20
收藏数 586,602
精华内容 234,640
关键字:

kernel