精华内容
下载资源
问答
  • Linux 内核启动的时候会解析设备树中各个节点的信息,并且在根文件系统的/proc/device-tree 目录下根据节点名字创建不同文件夹,如图所示:根节点“/”的属性以及子节点上图就是目录/proc/device-tree 目录下的内容...

    Linux 内核启动的时候会解析设备树中各个节点的信息,并且在根文件系统的/proc/device-tree 目录下根据节点名字创建不同文件夹,如图所示:

    9985f5efe4286ff13c34a5bd339b4265.png

    根节点“/”的属性以及子节点

    上图就是目录/proc/device-tree 目录下的内容,/proc/device-tree 目录下是根节点“/”的所有属性和子节点,我们依次来看一下这些属性和子节点。

    1、根节点“/”各个属性

    在图中,根节点属性属性表现为一个个的文件(图中细字体文件),比如图 中的“#address-cells”、“#size-cells”、“compatible”、“model”和“name”这 5 个文件,它们在设备树中就是根节点的5 个属性。既然是文件那么肯定可以查看其内容,输入cat 命令来查看model和 compatible 这两个文件的内容,结果如图所示:

    036385ec12a489036ca4aa34540df928.png

    model 和 compatible 文件内容

    从图中可以看出,文件 model 的内容是“Freescale i.MX6 ULL 14x14 EVK Board”,文件 compatible 的内容为“fsl,imx6ull-14x14-evkfsl,imx6ull”。打开文件 imx6ull-alientek-emmc.dts查看一下,这不正是根节点“/”的 model 和 compatible 属性值吗!

    2、根节点“/”各子节点

    图中各个文件夹(途中粗字体文件夹)就是根节点“/”的各个子节点,比如“aliases”、 “backlight”、“chosen”和“clocks”等等。大家可以查看一下 imx6ull-alientek-emmc.dts 和imx6ull.dtsi 这两个文件,看看根节点的子节点都有哪些,看看是否和图中的一致。/proc/device-tree 目录就是设备树在根文件系统中的体现,同样是按照树形结构组织的,进入/proc/device-tree/soc 目录中就可以看到 soc 节点的所有子节点,如图所示:

    d1029973a516abf1b059e68ca2aef32e.png

    soc 节点的所有属性和子节点

    和根节点“/”一样,图中的所有文件分别为 soc 节点的属性文件和子节点文件夹。大家可以自行查看一下这些属性文件的内容是否和 imx6ull.dtsi 中 soc 节点的属性值相同,也可以进入“busfreq”这样的文件夹里面查看 soc 节点的子节点信息。

    在根节点“/”中有两个特殊的子节点:aliases 和 chosen,我们接下来看一下这两个特殊的子节点。

    3、 aliases 子节点

    打开 imx6ull.dtsi 文件,aliases 节点内容如下所示:

    18 aliases {19 can0 = &flexcan1;20 can1 = &flexcan2;21 ethernet0 = &fec1;22 ethernet1 = &fec2;23 gpio0 = &gpio1;24 gpio1 = &gpio2;......42 spi0 = &ecspi1;43 spi1 = &ecspi2;44 spi2 = &ecspi3;45 spi3 = &ecspi4;46 usbphy0 = &usbphy1;47 usbphy1 = &usbphy2;48 };

    单词 aliases 的意思是“别名”,因此 aliases 节点的主要功能就是定义别名,定义别名的目的就是为了方便访问节点。不过我们一般会在节点命名的时候会加上label,然后通过&label 来访问节点,这样也很方便,而且设备树里面大量的使用&label 的形式来访问节点。

    4、 chosen 子节点

    chosen 并不是一个真实的设备,chosen 节点主要是为了 uboot 向 Linux 内核传递数据,重点是 bootargs 参数。一般.dts 文件中 chosen 节点通常为空或者内容很少,imx6ull-alientek-emmc.dts 中 chosen 节点内容如下所示:

    18 chosen {19 stdout-path = &uart1;20 };

    从示例代码中可以看出,chosen 节点仅仅设置了属性“stdout-path”,表示标准输出使用 uart1。但是当我们进入到/proc/device-tree/chosen 目录里面,会发现多了 bootargs 这个属性,如图所示:

    3d89ff7de1463853bb50f4f1c5fe1056.png

    chosen 节点目录

    输入 cat 命令查看bootargs 这个文件的内容,结果如图所示:

    e02c321023a5c676121e73d3bd4d34b0.png

    bootargs 文件内容

    从图中可以看出,bootargs 这个文件的内容为“console=ttymxc0,115200……”,这个不就是我们在uboot 中设置的 bootargs 环境变量的值吗?现在有两个疑点:

    ①、我们并没有在设备树中设置 chosen 节点的 bootargs 属性,那么图中 bootargs这个属性是怎么产生的?

    ②、为何 bootargs 文件的内容和 uboot 中 bootargs 环境变量的值一样?它们之间有什么关系?

    前面讲解uboot 的时候说过,uboot 在启动Linux 内核的时候会将bootargs 的值传递给Linux内核,bootargs 会作为Linux 内核的命令行参数,Linux 内核启动的时候会打印出命令行参数(也就是 uboot 传递进来的bootargs 的值),如图所示:

    09ad271dd2c161c7cecbfc66a568efa1.png

    命令行参数

    既然 chosen 节点的 bootargs 属性不是我们在设备树里面设置的,那么只有一种可能,那就是 uboot 自己在 chosen 节点里面添加了 bootargs 属性!并且设置 bootargs 属性的值为 bootargs环境变量的值。因为在启动 Linux 内核之前,只有 uboot 知道 bootargs 环境变量的值,并且 uboot也知道.dtb 设备树文件在 DRAM 中的位置,因此 uboot 的“作案”嫌疑最大。在 uboot 源码中全局搜索“ chosen ” 这个字符串, 看看能不能找到一些蛛丝马迹。果然不出所料, 在common/fdt_support.c 文件中发现了“chosen”的身影,fdt_support.c 文件中有个 fdt_chosen 函数,此函数内容如下所示:

    275 int fdt_chosen(void *fdt)276 {277 int nodeoffset;278 int err;279 char *str; /* used to set string properties */ 280281 err = fdt_check_header(fdt);282 if (err < 0) {283 printf("fdt_chosen: %s", fdt_strerror(err));284 return err;285 }286287 /* find or create "/chosen" node. */288 nodeoffset = fdt_find_or_add_subnode(fdt, 0, "chosen");289 if (nodeoffset < 0)290 return nodeoffset; 291292 str = getenv("bootargs");293 if (str) {294 err = fdt_setprop(fdt, nodeoffset, "bootargs", str,295 strlen(str) + 1);296 if (err < 0) {297 printf("WARNING: could not set bootargs %s.",298 fdt_strerror(err));299 return err;300 }301 }302303 return fdt_fixup_stdout(fdt, nodeoffset);304 }

    第 288 行,调用函数 fdt_find_or_add_subnode 从设备树(.dtb)中找到 chosen 节点,如果没有找到的话就会自己创建一个 chosen 节点。

    第 292 行,读取 uboot 中 bootargs 环境变量的内容。

    第 294 行,调用函数 fdt_setprop 向 chosen 节点添加 bootargs 属性,并且 bootargs 属性的值就是环境变量bootargs 的内容。

    证据“石锤”了,就是 uboot 中的 fdt_chosen 函数在设备树的chosen 节点中加入了 bootargs属性,并且还设置了 bootargs 属性值。接下来我们顺着 fdt_chosen 函数一点点的抽丝剥茧,看看都有哪些函数调用了 fdt_chosen,一直找到最终的源头。这里我就不卖关子了,直接告诉大家整个流程是怎么样的,见下图:

    3bc37c3a110215cf85ce761eb258438f.png

    fdt_chosen 函数调用流程

    图中框起来的部分就是函数 do_bootm_linux 函数的执行流程, 也就是说do_bootm_linux 函数会通过一系列复杂的调用,最终通过 fdt_chosen 函数在 chosen 节点中加入了 bootargs 属性。而我们通过 bootz 命令启动 Linux 内核的时候会运行 do_bootm_linux 函数,至此,真相大白,一切事情的源头都源于如下命令:

    bootz 80800000 – 83000000

    当我们输入上述命令并执行以后,do_bootz函数就会执行,然后一切就按照图中所示的流程开始运行。

    展开全文
  • Linux 2.6 相对于 Linux 2.4 有相当大的改进,主要体现在如下几个方面。 1.新的调度器 2.6 版本的 Linux 内核使用了新的进程调度算法,它在高负载的情况下执行得极其出色,并且当有很多处理器时也可以很好地扩展。 ...

    Linux 内核及内核编程(1)

    成于坚持,败于止步

    Linux 2.6 内核的特点

    Linux 2.6 相对于 Linux 2.4 有相当大的改进,主要体现在如下几个方面。

    1.新的调度器

    2.6 版本的 Linux 内核使用了新的进程调度算法,它在高负载的情况下执行得极其出色,并且当有很多处理器时也可以很好地扩展。

    2.内核抢占

    在 2.6 版本的 Linux 内核中,内核任务可以被抢占,从而提高系统的实时性。这样做最主要的优势在于可以极大地增强系统的用户交互性。

    3.改进的线程模型

    2.6 版本的 Linux 内核中线程操作速度得以提高,可以处理任意数目的线程,PID最大可以到 2000000000。

    4.虚拟内存的变化

    从虚拟内存的角度来看,新内核融合了 r-map(反向映射)技术,显著改善虚拟内存在一定程度负载下的性能。

    5.文件系统

    2.6 版本的 Linux 内核增加了对日志文件系统功能的支持,解决了 2.4 版本的 Linux内核在这方面的不足。2.6 版本的 Linux 内核在文件系统上的关键变化还包括对扩展属性及 POSIX 标准访问控制的支持。Ext2/Ext3 作为大多数 Linux 系统缺省安装的文件系统,在 2.6 版本的 Linux 内核中增加了对扩展属性的支持,可以给指定的文件在文件系统中嵌入元数据。

    6.音频

    新的 Linux 音频体系结构 ALSA(Advanced Linux Sound Architecture)取代了缺陷很多的旧的 OSS(Open Sound System)。新的声音体系结构支持 USB 音频和 MIDI 设备,并支持全双工重放等功能。

    7.总线

    SCSI/IDE 子系统经过大幅度的重写,解决和改善了以前的一些问题。比如 2.6 版本的 Linux 内核可以直接通过 IDE 驱动程序来支持 IDE CD/RW 设备,而不必像以前那样使用一个特别的 SCSI 模拟驱动程序。

    8.电源管理

    支持 ACPI(高级电源配置管理界面,Advanced Configuration and Power Interface),用于调整 CPU 在不同的负载下工作于不同的时钟频率以降低功耗。

    9.联网和 IPSec

    2.6 版本的 Linux 内核中加入了对 IPSec 的支持,删除了原来内核内置的 HTTP 服务器 kttpd,加入了对新的 NFSv4(网络文件系统)客户机/服务器的支持,并改进了对 IPv6 的支持。

    10.用户界面层

    2.6 版本的 Linux 内核重写了帧缓冲/控制台层,人机界面层还加入了对大多数接口设备的支持(从触摸屏到盲人用的设备和各种各样的鼠标)。 在设备驱动程序的方面,Linux 2.6 相对于 Linux 2.4 也有较大的改动,这主要表现在内核 API 中增加了不少新功能(例如内存池)、sysfs 文件系统、内核模块从.o 变为.ko、驱动模块编译方式、模块使用计数、模块加载和卸载函数的定义等方面。

    Linux 内核的组成部分

    如图 3.1 所示,Linux 内核主要由进程调度(SCHED)、内存管理(MM)、虚拟文件系统(VFS)、网络接口(NET)和进程间通信(IPC)等 5 个子系统组成。

    1.进程调度

    精度调度控制系统中的多个进程对 CPU 的访问使得多个进程能在 CPU 中微观串行,宏观并行地执行。进程调度处于系统的中心位置,内核中其他的子系统都依赖它,因为每个子系统都需要挂起或恢复进程。 如图 3.2 所示,Linux 的进程在几个状态间进行切换。在设备驱动编程中,当请求的资源不能得到满足时,驱动一般会调度其他进程执行,并使驱动对应的进程进入睡眠状态,直到它请求的资源被释放,才会被唤醒而进入就绪状态。睡眠分为可被打断的睡眠和不可被打断的睡眠,两者的区别在于可被打断的睡眠在收到信号的时候会醒来。

    在设备驱动编程中,当请求的资源不能得到满足时,驱动一般会调度其他进程执行,其对应的进程进入睡眠状态,直到它请求的资源被释放,才会被唤醒而进入就绪状态。 设备驱动中,如果需要几个并发执行的任务,可以启动内核线程,启动内核线程
    的函数为:
    int kernel_thread(int (*fn)(void *), void * arg, unsigned long flags);

    2.内存管理

    内存管理的主要作用是控制多个进程安全地共享主内存区域。当 CPU 提供内存管理单元(MMU)时,Linux 内存管理完成为每个进程进行虚拟内存到物理内存的转换。Linux 2.6 引入了对无 MMU CPU 的支持。

    如图 3.3 所示,一般而言,Linux 的每个进程享有 4GB 的内存空间,0~3GB 属于用户空间,3~4GB 属于内核空间,内核空间对常规内存、I/O 设备内存以及高端内存存在不同的处理方式。

    3.虚拟文件系统

    如图 3.4 所示,Linux 虚拟文件系统(VFS)隐藏各种了硬件的具体细节,为所有的设备提供了统一的接口。而且,它独立于各个具体的文件系统,是对各种文件系统的一个抽象,它使用超级块 super block 存放文件系统相关信息,使用索引节点 inode
    存放文件的物理信息,使用目录项 dentry 存放文件的逻辑信息。

    4.网络接口

    网络接口提供了对各种网络的标准的存取和各种网络硬件的支持。网络接口可分为网络协议和网络驱动程序,网络协议部分负责实现每一种可能的网络传输协议,网络设备驱动程序负责与硬件设备进行通信,每一种可能的硬件设备都有相应的设备驱
    动程序。

    5.进程通信

    Linux 支持进程间的多种通信机制,包含信号量、共享内存、管道等,这些机制可协助多个进程、多资源的互斥访问、进程间的同步和消息传递。 Linux 内核的 5 个组成部分之间的依赖关系如下。

    进程调度与内存管理之间的关系:这两个子系统互相依赖。在多道程序环境下,必须为程序创建进程,而创建进程的第一件事情就是将程序和数据装入内存。

    进程间通信与内存管理的关系:进程间通信子系统要依赖内存管理支持共享内存通信机制,这种机制允许两个进程除了拥有自己的私有空间,还可以存取共同的内存区域。

    虚拟文件系统与网络接口之间的关系:虚拟文件系统利用网络接口支持网络文件系统(NFS),也利用内存管理支持 RAMDISK 设备。

    内存管理与虚拟文件系统之间的关系:内存管理利用虚拟文件系统支持交换,交换进程(swapd)定期由调度程序调度,这也是内存管理依赖于进程调度的惟一原因。当一个进程存取的内存映射被换出时,内存管理向文件系统发出请求,同时,挂起当前正在运行的进程。

    除了这些依赖关系外,内核中的所有子系统还要依赖于一些共同的资源。这些资源包括所有子系统都用到的例程,如分配和释放内存空间的函数、打印警告或错误信息的函数及系统提供的调试例程等。

    就到这里了,O(∩_∩)O~

    我的专栏地址:http://blog.csdn.net/column/details/linux-driver-note.html

    待续。。。。

    作者:Ela–学海无涯
    来源:CSDN
    原文:https://blog.csdn.net/xinyuwuxian/article/details/9273421
    版权声明:本文为博主原创文章,转载请附上博文链接!

    展开全文
  • 3.2 Linux 2.6后的内核特点 Linux 2.6相对于Linux 2.4有相当大的改进,主要体现在如下几个方面。 1.新的调度器 Linux 2.6以后版本的Linux内核使用了新的进程调度算法,它在高负载的情况下有极其出色的性能,并且...

    3.2 Linux 2.6后的内核特点

        Linux 2.6相对于Linux 2.4有相当大的改进,主要体现在如下几个方面。

        1.新的调度器

        Linux 2.6以后版本的Linux内核使用了新的进程调度算法,它在高负载的情况下有极其出色的性能,并且当有很多处理器时也可以很好地扩展。在Linux内核2.6的早期采用了O(1)算法,之后转移到CFS(Completely Fair Scheduler,完全公平调度)算法。在Linux 3.14中,也增加了一个新的调度类:SCHED_DEADLINE,它实现了EDF(Earliest Deadline First,最早截止期限优先)调度算法。

    2.内核抢占

        在Linux 2.6以后版本的Linux内核中,一个内核任务可以被抢占,提高系统的实时性。这样做最主要的优势在于,可以极大地增强系统的用户交互性,用户将会觉得鼠标单击和击键的事件得到了更快速的响应。Linux 2.6以后的内核版本还是存在一些不可抢占的区间,如中断上下文、软中断上下文和自旋锁锁住的区间,如果给Linux内核打上RT-Preempt补丁,则中断和软中断都被线程化了,自旋锁也被互斥体替换,Linux内核变得能支持硬实时。

        Linux 2.6以后的内核仍然存在中断、软中断、自旋锁等原子上下文进程无法抢占执行的情况,这是Linux内核本身只提供软实时能力的原因。

    3.改进的线程模型

        Linux 2.6以后版本中的线程采用NPTL(Native POSIX Thread Library,本地POSIX线程库)模型,操作速度得以极大提高,相比于Linux 2.4内核时代的LinuxThreads模型,它也更加遵循POSIX规范的要求。NPTL没有使用LinuxThreads模型中采用的管理线程,内核本身也增加了FUTEX(Fast Userspace Mutex,快速用户态互斥体),从而减小多线程的通信开销。

    4.虚拟内存的变化

        从虚拟内存的角度来看,新内核融合了r-map(反向映射)技术,显著改善虚拟内存在一定大小负载下的性能。在Linux 2.4中,要回收页时,内核的做法是遍历每个进程的所有PTE(页表项)以判断该PTE是否与该页建立了映射,如果建立了,则取消该映射,最后无PTE与该页相关联后才回收该页。在Linux 2.6后,则建立反向映射,可以通过页结构体快速寻找到页面的映射。

    5.文件系统

        Linux 2.6版内核增加了对日志文件系统功能的支持,解决了Linux 2.4版本在这方面的不足。Linux 2.6版内核在文件系统上的关键变化还包括对扩展属性及POSIX标准访问控制的支持。ext2/ext3/ext4作为大多数Linux系统默认安装的文件系统,在Linux 2.6版内核中增加了对扩展属性的支持,可以给指定的文件在文件系统中嵌入元数据。

        在文件系统方面,当前的研究热点是基于B树的Btrfs,Btrfs称为是下一代Linux文件系统,它在扩展性、数据一致性、多设备管理和针对SSD的优化等方面都优于ext4。

    6.音频

        高级Linux音频体系结构(Advanced Linux Sound Architecture,ALSA)取代了缺陷很多旧的OSS(Open Sound System)。ALSA支持USB音频和MIDI(音乐设备数字接口)设备,并支持全双工重放等功能。

    7.总线、设备和驱动模型

        在Linux 2.6以后的内核中,总线、设备、驱动三者之间因为一定的联系性而实现对设备的控制。总线是三者联系起来的基础,通过一种总线类型,将设备和驱动联系起来。总线类型中的match()函数用来匹配设备和驱动,当匹配操作完成之后就会执行驱动程序中的probe()函数。

    8.电源管理

        支持高级配置和电源接口(Advanced Configuration and Power Interface,ACPI),用于调整CPU在不同的负载下工作于不同的时钟频率以降低功耗。目前,Linux内核的电源管理(PM)相对比较完善了,包括CPUFreq、CPUIdle、CPU热插拔、设备运行时(runtime)PM、Linux系统挂起到内存和挂起到硬盘等全套的支持,在ARM上的支持也较完备。

    9.联网和IPSec

        Linux 2.6内核中加入了对IPSec的支持,删除了原来内核内置的HTTP服务器khttpd,加入了对新的NFSv4(网络文件系统)客户机/服务器的支持,并改进了对IPv6的支持。

    10.用户界面层

        Linux 2.6内核重写了帧缓冲/控制台层,人机界面层还加入了对近乎所有接口设备的支持(从触摸屏到盲人用的设备和各种各样的鼠标)。

        在设备驱动程序方面,Linux 2.6相对于Linux 2.4也有较大的改动,这主要表现在内核API中增加了不少新功能(例如内存池)、sysfs文件系统、内核模块从.o变为.ko、驱动模块编译方式、模块使用计数、模块加载和卸载函数的定义等方面。

    11.Linux 3.0后ARM架构的变更

        Linus Torvalds在2011年3月17日的ARM Linux邮件列表中宣称“this whole ARM thing is a f*cking pain in the ass”,这引发了ARM Linux社区的地震,随后ARM社区进行了一系列重大修正。社区必须改变这种局面,于是PowerPC等其他体系结构下已经使用的FDT(Flattened Device Tree)进入到了ARM社区的视野。
        此外,ARM Linux的代码在时钟、DMA、pinmux、计时器刻度等诸多方面都进行了优化和调整,也删除了arch/arm/mach-xxx/include/mach头文件目录,以至于Linux 3.7以后的内核可以支持多平台,即用同一份内核镜像运行于多家SoC公司的多个芯片,实现“一个Linux可适用于所有的ARM系统”。





    展开全文
  • linux内核编译详解

    万次阅读 多人点赞 2018-04-28 04:36:26
    前言Linux内核是Linux操作系统的核心,也是整个Linux功能体现的核心,就如同发动机在汽车中的重要性。内核主要功能包括进程管理、内存管理、文件管理、设备管理、网络管理等。Linux内核是单内核设计,但却采用了微...

    前言

    Linux内核是Linux操作系统的核心,也是整个Linux功能体现的核心,就如同发动机在汽车中的重要性。内核主要功能包括进程管理、内存管理、文件管理、设备管理、网络管理等。Linux内核是单内核设计,但却采用了微内核的模块化设计,支持内核线程以及动态装载内核模块的能力。

    Linux作为一个自由软件,在广大爱好者的支持下,内核版本不断更新。新的内核修订了旧内核的bug,并增加了许多新的特性。如果用户想要使用这些新特性,或想根据自己的系统定制一个更高效、更稳定的内核,就需要手动编译Linux内核。那么如何编译内核呢?本文将讲解Linux内核编译的详细程。

    内核编译之内核获取

    编译内核的前提是需要有新内核的源码包,获取源码包的渠道有很多,这里就不详细介绍了,建议直接去官方网站(www.kernel.org)下载。我这里准备的是3.10.10版本的源码包,尽量不要直接编译最新版本的内核,可能会造成不兼容等问题。

    wKioL1UaSeix-dlFAAB3S3Uwx1o412.jpg

    内核编译之解压源码包

    编译内核时,一般把源码解压到/usr/src目录下,解压完成后会在该目录下生成一个与源码包版本号一致的目录,为了方便起见,我们可将它做一个链接,链接为linux目录。

    wKioL1UZObaD1N9mAADOlNJL-GI139.jpg

    内核编译之配置内核

    编译内核首先需要安装开发环境(Development Tools和Server Platform Development),配置内核之前可以查看当前系统的设备信息,了解系统详细配置。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    查看CPU信息:
    cat /proc/cpuinfo
    x86info             #此工具需手动安装
    lscpu
    查看PCI:
    lspci               #可用选项-v查看详细信息
    查看USB:
    lsusb               #可用选项-v查看详细信息
    查看块设备:
    lsblk

    配置内核可选用多种方法

    1
    2
    3
    4
    5
    6
    7
    make config           #遍历选择编译内核功能
    make allyesconfig     #启用内核全部功能
    make allnoconfig      #内核功能选项全部为否
    make menuconfig       #开启文本菜单选项,对窗口有限制,尽量调大窗口,否则会出错
                          #使用此命令需安装gcc和ncurses-devel
    make gconfig          #依赖GNome桌面环境及GNome的图形开发环境,gtk2
    make kconfig          #依赖KDE桌面环境及KDE的图形开发环境,qt

    内核功能选项

    1
    2
    3
    [*]                   #编译进内核本体
    [M]                   #编译成内核模块
    [ ]                   #不选择使用

    使用make menuconfig开启菜单选项,手动选择内核功能

    wKiom1UZS_mQcZATAAGp8Z-ylds766.jpg

    wKiom1UaSBbSK5j_AAKk9Mde6bQ979.jpg

    配置完成后,配置信息会存储于名为.config的隐藏文件,如果想方便配置,可复制/boot/config文件覆盖.config文件,直接修改即可。

    wKiom1UZVKuyxUOXAAFOCCVYQ9U514.jpg

    内核编译之编译安装

    编译时如果是远程连接,一旦断开连接,编译就会出问题。所以我们可使用screen命令(需安装),启动多个窗口,即使连接中断,编译也不会终止。

    1
    2
    3
    4
    screen                 #开启窗口
    Ctrl+A+D               #隐藏窗口
    screen -ls             #查看运行的窗口
    screen -r SCREEN_ID    #返回窗口

    开始编译

    wKiom1UZWlnDO1pnAAHn6i3p1lA232.jpg

    安装模块

    wKiom1UZcTaDivctAALuw61O1-4433.jpg

    安装完成后在/lib/modules/目录下会生成一个同内核版本好的目录,目录下便是新内核的模块了

    wKioL1UZdD7RFD6QAABPZqs116Q968.jpg

    安装内核

    wKioL1UZeP7BdH0hAABvYzZfOu0521.jpg

    安装完成后会在/boot目录下生成几个新内核的文件

    wKioL1UZesfwiq9gAAD--Bmu7UA122.jpg

    查看grub.conf配置文件,会发现新内核的信息已经写入了

    wKiom1UZeoCi5rZFAAJM5_x-2kI391.jpg

    以新内核启动

    wKiom1UZe2mwohXHAAE6f6Dd9Hc576.jpg

    查看新内核版本

    wKiom1UZe__CW2gxAAAd_NmD9KU403.jpg

    补充:

    如果前面多次编译过,在编译开始之前可进行清理

    1
    2
    3
     make clean       #清理编译的文件,但保留配置文件
     make mrproper    #移除所有编译生成的文件、配置文件和备份文件
     make distclean   #完全清理

    如果想快速编译,可进行如下操作

    1
    make -j *         #*为cup核心数

    如果想将编译生成的文件保存至别处,可进行如下操作

    1
    2
    3
    mkdir /path/to/somewhere               #创建存放目录
    cd /path/to/somewhere                  #进入目录
    ./configure --ksource=/usr/src/linux   #指定源目录

    如何只编译内核的部分代码

    1
    2
    3
    4
    5
    6
    7
    8
    9
    只编译某子目录中的相关代码:
    cd /usr/src/linux
    make  path/to/dir/
    只编译部分模块:
    make M=path/to/dir
    只编译一个模块:
    make path/to/dir/MOD_NAME.ko
    将编译生成的文件保存至别处:
    make O=/path/to/somewhere

    The end

    好了,内核编译的过程就是这样了,其中麻烦的地方除了需要消耗大量时间,也就是配置内核菜单了(英文伤不起...),想详细了解每个项目的意思请自行查资料。

    以上仅为个人总结,如有错漏,大神勿喷~~~

    关于作者

    目前在一家半导体公司从事GPU编译器研发,未来打算写一些关于计算机基础和计算机热点文章,欢迎大家关注我的公众号(程序芯世界)。 

    展开全文
  • linux内核主要是有C和汇编写成的,C是面向过程的语言,但是linux内核却用C实现了一套面向对象的设计模式,linux内核中处处体现着面向对象的思想 传统的链表实现之前我们前面提到的链表都是在我们原数据结构的基础上...
  • linux内核配置

    千次阅读 2017-06-15 22:53:23
    操作系统的核心功能 1、内存管理 2、进程调度 ...1、Kbuild (kernel build) 即是内核编译,是linux内核编译体现需要的。 2、Makefile 用来管理整个工程,内核的总Makefile 。   目录介绍 1、arch 不同架构CP
  • linux内核网络栈---socket调用内核路径

    千次阅读 2017-09-02 21:36:34
    BSD socket层: 这一部分处理BSD socket相关操作,每个socket在内核中以struct socket结构体现。这一部分的文件   主要有:/net/socket.c /net/protocols.c etc INET socket层:BSD socket是个可以用
  • 内核源码编译

    2017-11-11 08:08:00
    过make bzImage,将修改源码的模块重新编译,然后会重新链接,生成vmlinuz内核ELF文件,这种方式非常节约了编译的时间,不是需要重新将所有的...简单的修改时为了体现如何修改内核,这次修改的内容是do_fork函数,...
  • Linux内核移植步骤

    千次阅读 2017-07-01 17:18:22
    内核的可裁剪行也可以在内核移植中体现出来,对于特定的硬件环境,我们可以只保留和硬件相关的内核代码,从而达到缩小内核代码体积,减少代码所占存储空间。 下面我们一步一步了解linux内核移植方法。 1、修改...
  • Linux内核的编译安装

    2019-10-02 13:27:27
    前言Linux内核是Linux操作2347系统的核心,也是整个Linux功能体现的核心,就如同发动机在汽车中的重要性。内核主要功能包括进程管理、内存管理、文件管理、设备管理、网络管理等。Linux内核是单内核设计,但却采用了...
  • 如何学习内核

    千次阅读 2011-06-24 18:24:00
    一、Linux内核学习经验1. 内核学习的心理误区心理上的问题主要有两个,一个是盲目,就是在...人类进化这么多年,面对复杂的物体和事情还是总会有天生的惧怕感,体现内核学习上面就是:那么庞大复杂的内核代码,让人面
  • linux内核ipv4网络部分分层结构:BSD socket层: 这一部分处理BSDsocket相关操作,每个socket在内核中以struct socket结构体现。这一部分的文件主要有:/net/socket.c/net/protocols.c etcINET socket层:BSDsocket...
  • ubuntu12.04编译内核

    2016-08-22 10:56:33
    为了学习驱动,所有要构造个内核,下面是从网上搜集的比较简单的方法(难的地方主要体现在配置内核选项) 先在终端下sudo su获得root权限 1、apt-cache search linux-source (执行用这条命令系统会提示你...
  • Linux内核是Linux操作系统的核心,也是整个Linux功能体现的核心,就如同发动机在汽车中的重要性。内核主要功能包括进程管理、内存管理、文件管理、设备管理、网络管理等。Linux内核是单内核设计,但却采用了微内核的...
  • linux内核链表分析

    2014-10-17 19:40:47
    linux内核中有很多用的很经典的数据结构,...体现为两点,1是可扩展性,2是封装。可扩展性肯定是必须的,内核一直都是 在发展中的,所以代码都不能写成死代码,要方便修改和追加。将链表常见的 操作都进行封装
  • 内核基本的体系结构

    2018-03-23 14:35:00
    图 2-2 给出了内核的框图,示出了各种模块及他们之间的相互关系,特别的,它示出了内核的两个主要成分:左边的文件子系统和右边的进程控制子系统。...系统调用与库接口体现了图 2-1中描绘的用户程序与内核间的边...
  • 学号:SA18225163 目录 一、内核编译 1.安装必备的软件编译工具 ...2.下载Linux5.0内核代码 ...Linux内核是操作系统的核心,也是整个Linux功能体现的核心,就如同发动机在汽车中的重要性。内核主要功...
  • linux内核网络栈

    2013-07-19 17:46:52
    BSD socket层: 这一部分处理BSD socket相关操作,每个socket在内核中以struct socket结构体现。这一部分的文件 主要有:/net/socket.c /net/protocols.c etc  INET socket层:BSD socket是个可以用于各种网络
  • 走进Linux内核 西安邮;Linux是一匹自由而奔放的黑;Linux之父- Linus ;内核的入口硬件平台;硬件基础X86保护模式;操作系统设计的取舍;Linux内核源代码;...虚拟文件系统抽象的体现;系统调用内核的出口;驱动程
  • 解剖linux内核之工具

    2014-10-21 15:30:42
    Linux开源的一个重要体现就是用户可以根据自己的实际需要配置自己的Linux系统,一般的Linux发行版本为了能够保证在大多数机器上运行,因此会编译进许多对最终用户没有用的代码或模块。作为一名即将进入linux源代码...
  • Gentoo Linux 内核指南

    2010-12-27 03:44:00
    (体现了 gentoo 的高度可定制) 如果你执行过 emerge -s source 命令,你会发现,输出结果里会有很多种不同的内核源码包可供选择。这些源码包都是被定制或优化过的。在这篇文档中,我们会从设计角度出发,介绍每个...
  • Linux 2.6 相对于 Linux 2.4 有相当大的改进,主要体现在如下几个方面。  1.新的调度器  2.6 版本的 Linux 内核使用了新的进程调度算法,它在高负载的情况下执行得极其出色,并且当有很多处理器时也可以很好地...
  • linux内核代码风格

    千次阅读 2014-03-24 09:57:47
    代码风格如同人的品味与修养,一定程度上体现着程序员做事的态度。 常见的代码风格 有Linux内核代码代码风格,也有各大公司自己规定的风格,这里简单描述下内核的代码风格:  1. 缩进和空白 (1)if, while, for 与其...
  • 6、实例体现 注:内核链表:指Linux内核链表,前半段可能过于枯燥,但是相信到用法部分,你会很感兴趣的。 一、链表的简介。 这是一段来自wiki关于链表的描述: 在计算机科学中,链表是数据元素的线性集合,其顺序...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,078
精华内容 431
关键字:

内核体现