kernal linux - CSDN
  • 什么是linux kernel?有什么作用?

    千次阅读 2014-03-15 14:09:15
    说到kernel就得先明白什么是操作系统,什么是kernel?什么是操作系统?他们是什么关系?貌似这个问题很大框,答案挺多,以前总以为自己是明白的,但当面试时被问到还真不知道怎么样才是正确的答案,现在总结一下: ...

            说到kernel就得先明白什么是操作系统,什么是kernel?什么是操作系统?他们是什么关系?貌似这个问题很大框,答案挺多,以前总以为自己是明白的,但当面试时被问到还真不知道怎么样才是正确的答案,现在总结一下:

            操作系统是计算机资源的管理者,主要管理cpu的资源调度、存储器、I/O设备、文件四个部分。

            对于cpu的资源调度,其实就是进程管理,进程有三种基本状态:就绪态、执行态、阻塞态。进程的数据结构PCB是进程的实体,其中包括进程标示符(内外标示符)、进程调度信息(进程状态、优先级等)、处理机状态信息(主要是处理器各种寄存器中的内容----通用寄存器、指令计数器、程序状态字、用户栈指针)、进程控制信息(程序和数据的地址、同步或通信的条件等)操作系统要做的是创建、调度、终止进程,同步进程,避免死锁。

            对于存储器管理,需要管理寄存器、内存、外存、缓存,负责对可执行存储器的分配、回收以及提供在存储层次间数据移动的管理机制,例如主存与磁盘缓存、高速缓存与主存间的数据移动等。这些需要分段、分页、虚拟。写好一个程序,编译器编译、链接器链接、加载器加载到内存,分配的内存地址,加载到什么地方由操作系统说了算。

            对于I/O管理,就是管理外设。CPU与I/O设备之间有个设备控制器,设备控制器功能包括1、接受和识别CPU的指令,例如磁盘控制器能够接受CPU传来的Read、Write、Format等指令(这个东西和pci9054有什么关系?)。2、数据交换,CPU通过数据总线并行的与控制器交换、控制器与设备之间交换。比如你写一个程序要操作外设或读写文件(这里貌似操作外设也是读写文件)只需要调用操作系统的API,将欲传输的数据放到相应的位置,操作系统会将这些内存中的数据传给外设。I/O的控制方式包括程序I/O、中断I/O、DMAI/O等。3、标示和报告设备的状态。4、地址识别,每个设备都有一个地址。5、数据缓冲,控制器中需要有缓冲器。6、差错控制。

           对于文件管理,即文件系统如NTFS、fat32、ext3等。

           以上是对操作系统的粗浅理解,下面是kernel。

           对于linux kernel,先看它的目录结构,这里只挑几个重要的说明。

           arch 包括所有和体系结构相关的核心代码。从里面我们能看到arm、alpha、i386、mips、ia64这些文件夹,每种处理器架构都有不一样的硬件模块,这里就是要针对不同的架构进行不同的初始化。

            init包含内核的初始化代码(不是系统的引导代码),其中有一个main.c文件,用于执行内核所有的初始化工作(包括初始化内存、初始化所有硬件、创建第一个任务task0,设置中断允许标志位),然后移到用户模式调用fork()函数创建新进程,并在控制台运行shell。

            kernel 包含内核管理的核心代码,瞅这名就知道,这货是个重量级目录,所有的处理任务的程序,包括fork、exit、调度程序(sched.c)以及一些系统调用(sys.c)、信号处理(signal.c)、时间函数(time.c),还有中断异常处理、电源管理等等一系列调用关系错综复杂的函数。

            mm 包含所有的内存管理代码。其中包括实现进程的逻辑地址到实际物理地址的映射,实现分页、分段机制,实现内存页面异常中断处理程序等。   

            drivers包含系统中所有的设备驱动程序,比如什么cdrom啊bluetooth啊pci、i2c这些。

            ipc 包含核心进程间的通信代码。

            fs 存放Linux支持的文件系统代码,里面有ext2、ext3、ext4、fat、ntfs等等一堆目录。 

            net 内核的网络部分代码,其每个子目录对应于网络的一个方面,比如ieee80211、ipv4、ipv6这些目录。

            lib 包含核心的库代码,什么strcpy、sprintf、sort这些函数都在里面。

           百度百科的kernel词条Kernel 指大多数操作系统核心部分。它由操作系统中用于管理存储器文件外设系统资源的那些部分组成。操作系统内核通常运行进程,并提

    进程间的通信 

           好了,总结下,操作系统呢,其实就是一个大软件,这个大软件直接运行在裸机上,同时管理软件和硬件,它包括内核,包括其他软件比如用户图形界面、命令行,用户通过操作图形界面,图形界面会调用内核提供的系统调用,这时操作系统由用户态切换到内核态完成相应动作,此过程操作系统应该保证,任何应用程序运行时的错误都不会让系统崩溃。

    展开全文
  • linux kernal

    2014-01-08 18:41:24
    条评论 | 标签: HACKER, KERNELLINUX, 内核 分享到:19 本文由 伯乐在线 - haofly 翻译自 Julia Evans。欢迎加入技术翻译小组。转载请参见文章末尾处的要求。 (之前我在CUSEC网站发表...

    成为Linux内核高手的四个方法

    本文由 伯乐在线 - haofly 翻译自 Julia Evans。欢迎加入技术翻译小组。转载请参见文章末尾处的要求。

    (之前我在CUSEC网站发表了关于内核并不可怕的一篇文章,本文是后续。)

    我曾经问别人如何开始内核编程的学习,他们基本上都说:①如果你不需要了解内核是如何为你工作的,你为何要尝试呢?②你应该订阅Linux内核邮件列表,然后努力去理解。③如果你不去编写针对Linux内核的代码,你就是在浪费时间。

    这些对我一点儿帮助都没有。所以我在这里列举了一些可行的方法,他们是有关操作系统和Linux内核是怎样在你的项目里工作的,而且还很有趣。虽然我知道得并不多,但至少比我做这些之前了解了更多。

    对于下面这几个途径,你只需要了解一些C语言和汇编语言(至少要会复制粘贴)。我会写一些小的C程序,还会用汇编来上课,虽然这些我都忘得差不多了。

    方法一:编写你自己的操作系统

    这看起来是一个相当可怕的方法。但事实上并不是!我是从rustboot这个项目开始的,重要的是它已经可以工作了。然后我会做一些简单的事情,比如让屏幕由红色变为蓝色,打印字符到屏幕,持续获取键盘中断来工作。

    MikeOS是我另一个有趣的开始。请记住,你的操作系统没有必要做得很大很专业——如果你能够让它把屏幕颜色由红色变为紫色或者让它打印一首视,你就算成功了。

    你一定会想使用一个仿真器去运行你的操作系统,比如qemuOSDev wiki同样是一个很有用的网站——上面有很多你会碰到的常见的问题。

    方法二:编写写一些内核模块!

    如果你已经准备运行Linux了,那么再写一些内核模块就会是相当相当容易的,即使他们什么都不会做。

    这里有一个能够打印“Hello, hacker school!”到内核日志的模块源代码。它只有18行代码。基本上你只需要编写一个init进程和一个cleanup函数就可以了。我并不知道__init和_exit这两个宏命令做了些什么,但是我会使用他们!

    编写一个有一定功能的内核模块是比较难的。我做这个的时候,都是先决定要完成的功能(比如打印一个信息给每一个经过内核的数据包),然后回去阅读一些Kernel Newbies上的东西,再大量地使用谷歌来搜索,再复制和粘贴大量的代码来搞明白究竟该怎样去编写它。这里有几个内核模块的例子,我把他们放在了kernel-module-fun项目里。

    方法三:参加一次Linux内核实习!

    Linux内核团队参与了GNOME女性拓展实习项目。它是惊人、奇妙并且令人非常愉快的一个活动。这意味着,如果你是一个女人并且愿意花费三个月时间在内核开发上,你就能参与内核的开发,并且不需要任何的经验,还能得到一些报酬(5000美元)。在Kernel Newbies上有关于它的介绍。

    如果你对此感兴趣,那会是非常值得去申请的——你能够为内核做一个格式化的补丁,这非常有趣。Sarah Sharp是一个Linux内核开发人员,她在协调这个活动而且她本人也是非常热心的。你可以阅读她的这篇博客文章,讲述了在第一轮里137个补丁是怎样被允许加入到内核中去的。这些补丁也将会是你提供的!查看申请说明

    如果你不是一个女生,那么可以选择Google Summer of Code这个相似的活动。(编注:这句话可能会引起女程序员的反感)

    方法四:阅读内核源码

    这听起来像是最糟糕的建议——“想要去了解内核是如何工作的就去看源代码,太蠢了”

    但事实上这个方法是非常有趣。你并不需要了解一切东西。当遇到无法理解的东西时,我就会感到无能为力,但是我告诉人们的时候,每个人都会说:“嗯,这就是传说中的Linux内核,你不能理解很正常!”

    我的朋友Dave最近给了我一个网站LXR,在里面你可以阅读到内核的资源,而且还提供了大量有用的引用链接。比如,如果你想要了解chmod这个命令的系统调用,你可以在the chmod_common definition页面看到有关于它在Linux内核里的定义!

    这里是部分chmod_common的部分代码,其中有一些我写的注释:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    static int chmod_common(struct path *path, umode_t mode)
    {
        struct inode *inode = path->dentry->d_inode;
        struct iattr newattrs;
        int error;
     
        // 不知道这是在干什么
        error = mnt_want_write(path->mnt);
        if (error)
            return error;
     
        // 互斥锁!避免出现冲突现象!=D
        mutex_lock(&inode->i_mutex);
     
        // 我猜这是在检查是否能使用chmod
        error = security_path_chmod(path, mode);
        if (error)
            goto out_unlock;
        // 我猜这是在改变mode的值
        newattrs.ia_mode = (mode & S_IALLUGO) | (inode->i_mode & ~IALLUGO);
        newattrs.ia_valid = ATTR_MODE | ATTR_CTIME;
        error = notify_change(path->dentry, &newattrs);
    out_unlock:
        mutex_unlock(&inode->i_mutex); // 完成时就解除互斥锁
        mnt_drop_write(path->mnt); // ???
        return error;
    }

    我觉得这个过程是很有趣的,而且也帮助了我阐明了内核的意义。我发现我所阅读的代码大多都是生涩难懂的,但是也有一些(比如chmod的代码)是可以理解的。

    总结几个链接:

    “这本书会教你怎样编写你自己的驱动和怎样入侵与内核相关的地方”

    • 如果你在写一个操作系统,OSDev wiki是一个不错的网站
    • Kernel Newbies有一些给内核开发新手的资源,虽然在它的聊天室里我有一些不爽的经历。
    • Sarah Sharp是一个内核开发人员,负责Linux内核的对外服务,是非常好的一个女人。
    展开全文
  • Linux kernal API

    2018-06-22 16:59:46
    Linux kernal doc 3.0.8

    本文基于讲接受如何基于Kernal 制作API 文档, 本文基于linux-3.0.8 制作

    make help

    ...
     Documentation targets:
     Linux kernel internal documentation in different formats:
      htmldocs        - HTML  生产HTML页面
      pdfdocs         - PDF   生成PDF
      psdocs          - Postscript
      xmldocs         - XML DocBook
      mandocs         - man pages
      installmandocs  - install man pages generated by mandocs
      cleandocs       - clean all generated DocBook files  清空
      ... 
    

    make htmldocs

    将在Documentation/DocBook 生产html页面, 我已经制作html文档, 点击链接Linux kernal API doc 3.0.8

    错误*** You need to install xmlto *** 解决

    产生原因, 系统没有安装xmlto 工具, 工具安装方法

    wget https://releases.pagure.org/xmlto/xmlto-0.0.28.tar.bz2
    ./configure
    make
    make instal
    展开全文
  • Linux内核更新是越来越快了,可能由于Linux的普及,大家都开始关注了,各种安全隐患也越来越多。支持Intel、Alpha、PPC、Sparc、IA-64、ARM、MIPS、Amiga、Atari和IBMs/390等,还支持32位大文件系统。而在Intel平台...

    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版本的在不断更新,当设备驱动去兼容不同版本的内核时,需要知道当前使用的内核源码版本,以此来调用对应版本的内核API,这两个宏定义在文件 /usr/include/linux/version.h #define LINUX_VERSION_CODE ...
  • Linux内核的整体架构简介

    万次阅读 多人点赞 2017-10-23 17:46:51
    本文是“Linux内核分析”系列文章的第一篇,会以内核的核心功能为出发点,描述Linux内核的整体架构,以及架构之下主要的软件子系统。之后,会介绍Linux内核源文件的目录结构,并和各个软件子系统对应。 注:本文和...
  • linux kernel 简介

    千次阅读 2017-09-27 23:20:22
    linux kernel construction overview linux kernel 大致分为上图五大部分。 1、进程管理  负责进程的创建和销毁,进程的调度。
  • Android Linux Kernel 移植流程

    千次阅读 2014-03-12 17:30:29
    Android Kernel移植流程 参考文档 Documentation/android.txt 修改kernel config Android Driver Android Binder:基于openBinder框架的驱动,进程间通信底层主要驱动,没有可它,android无法工作...
  • 设置kernel系统参数: vi /etc/sysctl.conf #增加此行,以保证此设置持续有效; #含义是当系统遇到kernel panic时,系统在30秒后reboot; kernel.panic = 30 #修改此参数,,以保证下一次当系统遇到kernel panic后...
  • Introduction to Linux Kernel
  • 基于busybox和linux kernel制作小linux

    千次阅读 2011-05-13 22:45:00
    1. 下载busybox和linux kernel的源码.busybox的源码地址: http://www.busybox.net/linux kernel的源码地址: http://www.kernel.org/pub/linux/kernel/v2.6/我选择的busybox版本是: busybox-1.16.0.tar.bz2linux ...
  • linux内核与linux发行版之间的关系

    千次阅读 多人点赞 2018-03-20 18:53:51
    Linux内核: linux内核是一种开放源码的操作系统,由Linux Torvalds负责维护,提供硬件抽象层、硬盘及文件系统控制及多任务功能的系统核心程序。Linux发行版: linux发行版基于linux内核源码,将Linux系统的内核与...
  • 编译内核的时候make ARCH=arm CROSS_COMPILE=arm-linux- menuconfig 当然
  • linux内核中的linux_banner信息

    千次阅读 2011-08-18 22:21:34
    [ Linux 内核版本:linux-2.6.30 ] Linux内核启动后在start_kernel [ init/main.c ] 首先会调用printk(KERN_NOTICE "%s", linux_banner)来打印linux_banner的信息。 linux_b
  • Linux Kernel 4.0.2

    千次阅读 2015-05-07 18:07:18
    https://www.kernel.org/ ...Linux kernel 的官方 GIT地址是: 稳定的仓库: http://git.kernel.org/cgit/linux/kernel/git/stable/linux-stable.git Linus 大神在维护的主线: https://git.kern
  • jupyter notebook 增加kernel的方法

    万次阅读 2017-12-01 21:54:32
    转自http://blog.csdn.net/wj1066/article/details/72891667有很多朋友会遇到这样一个问题:在anaconda中创建了多个环境,也许python版本是一样的,但是装的包以及版本不一样。启动jupyter notebook后,在new的下拉...
  • 近日, Linux Kernel 5.8 版本正式发布,Linus 表示 Linux Kernel 5.8 是“有史以来最大的发行版之一”。Linux Kernel 5.8 在 ARM64 架构特性方面,有不少的更新,华为92个社区内核工程师贡献了包括:ARM64 SPE perf...
  • 这3部分是怎么相互协作来构成这个系统的呢? 各自有什么用呢? 三者有什么联系?...下面是笔者针对网上bootloader、linuxkernellinux内核)、rootfile(根文件系统),三者关系的一个总结   1.LINUX中b...
  • linux_kernel下载网站

    2019-08-14 14:35:58
    linux_kernel :https://mirrors.edge.kernel.org/pub/linux/kernel/v3.x/ hi3531d使用的kernel版本为v3.18.20
  • 1、漏洞类型Linux Kernel权限提升漏洞Linux kernel拒绝服务漏洞Linux kernel NFSv2和NFSv3服务器安全绕过漏洞Linux Kernel堆缓冲区溢出漏洞2、简介 Linux kernel是美国Linux基金会发布的操作系统Linux所使用的内核。...
1 2 3 4 5 ... 20
收藏数 368,408
精华内容 147,363
热门标签
关键字:

kernal linux