精华内容
下载资源
问答
  • 2021-05-10 06:54:19

    前面总结了关于Linux内核结构的学习,接下来我们一起学习Linux内核源代码。

    第一:多版本的内核源代码

    对不同的内核版本,系统调用一般是相同的。新版本也许可以增加一个新的系统调用,但旧的系统调用将依然不变,这对于保持向后兼容是非常必要的—一个新的内核版本不能打破常规的过程。在大多数情况下,设备文件将仍然相同,而另一方面,版本之间的内部接口有所变化。

    Linux内核源代码有一个简单的数字系统,任何偶数内核(如2.0.30)是一个稳定的版本,而奇数内核(如2.1.42)是正在发展中的内核。这本书是基于稳定的2.4.16

    源代码树。发展中的内核总是有最新的特点,支持最新的设备,尽管它们还不稳定,也不是你所想要的,但它们是发展最新而又稳定的内核的基础。

    目前,较新而又稳定的内核版本是2.2.x和2.4.x,因为版本之间稍有差别,因此,如果你想让一个新驱动程序模块既支持2.2.x,也支持2.4.x,就需要根据内核版本对模块进行条件编译。

    对内核源代码的修改是以补丁文件的形式发布的。patch实用程序用来对内核源文件进行一系列的修订,例如,如果你有2.4.9内核源代码,而你想移到2.4.16,你可以获得2.4.16的补丁文件,应用patch来修订2.4.9源文件。例如:

    $ cd /usr/src/linux

    $ patch -p1 < patch-2.4.16

    第二:Linux内核源代码的结构

    Linux内核源代码位于/usr/src/linux目录下,其结构分布如图1.3所示,每一个目录或子目录可以看作一个模块,其目录之间的连线表示“子目录或子模块”的关系。下面是对每一个目录的简单描述。

    include/子目录包含了建立内核代码时所需的大部分包含文件,这个模块利用其它模块重建内核。

    init/ 子目录包含了内核的初始化代码,这是内核开始工作的起点。

    arch/子目录包含了所有硬件结构特定的内核代码,如图1.3,arch/ 子目录下有i386和alpha模块等等。

    drivers/ 目录包含了内核中所有的设备驱动程序,如块设备,scsi 设备驱动程序等等。

    fs/ 目录包含了所有文件系统的代码,如:ext2, vfat模块的代码等等。

    net/ 目录包含了内核的连网代码。

    mm/ 目录包含了所有的内存管理代码。

    ipc/ 目录包含了进程间通信的代码。

    kernel/

    目录包含了主内核代码

    图1.3 显示了八个目录,即 init, kernel, mm, ipc,

    drivers, fs, arch 及 net 的包含文件都在"include/" 目录下。在Linux内核中包含了  drivers, fs, arch及 net 模块,这就使得Linux内核既不是一个层次式结构,也不是一个微内核结构,而是一个“整体式”结构。因为系统调用可以直接调用内核层,因此,该结构使得整个系统具有较高的性能,其缺点是内核修改起来比较困难,除非遵循严格的规则和编码标准。

    在图1.3中所显示的模块结构,代表了一种工作分配单元,利用这种结构,我们期望Linus

    Torvalds能维护和增强内核的核心服务,即,init/, kernel/, mm/及 ipc/,其它的模块drivers, fs, arch及net 也可以作为工作单元,例如,可以分配一组人对块文件系统进行维护和进一步的开发,而另一组人对scsi文件系统进行完善。图1.3类似于Linux的自愿者开发队伍一起工作来增强和扩展整个系统的框架。

    Linux源代码的分布结构

    第三: 从何处开始阅读源代码

    像Linux内核这样庞大而复杂的程序看起来确实让人望而生畏,它象一个很大的球,没有起点和终点。在读源代码的过程中,你会遇到这样的情况,当读到内核的某一部分时又会涉及到其它更多的文件,当返回到原来的地方想继续往下读时,又忘了原来读的内容。在internet上,很多人为此付出了很大的努力,制作出了源代码导航器,这为源代码阅读提供了良好的条件,站点为:,下面给出阅读源代码的一些线索。

    1. 系统的启动和初始化

    在基于Intel的系统上,当 loadlin.exe 或 LILO把内核装入到内存并把控制权传递给内核时,内核开始启动。关于这一部分,看arch/i386/kernel/head.S

    ,head.S进行特定结构的设置,然后跳转到init/main.c的main()例程。

    2. 内存管理

    内存管理的代码主要在/mm,但特定结构的代码在arch/*/mm。缺页中断处理的代码在mm/memory.c

    ,而内存映射和页高速缓存器的代码在mm/filemap.c。缓冲器高速缓存是在mm/buffer.c 中实现,而交换高速缓存是在mm/swap_state.c

    和 mm/swapfile.c中实现。

    3. 内核

    内核中,特定结构的代码在arch/*/kernel,调度程序在kernel/sched.c,fork的代码在kernel/fork.c,task_struct

    数据结构在 include/linux/sched.h中。

    4.

    PCI

    PCI 伪驱动程序在 drivers/pci/pci.c ,其定义在include/linux/pci.h。每一种结构都有一些特定的

    PCI BIOS 代码, Intel的在arch/alpha/kernel/bios32.c。

    5.  进程间通信

    所有System V IPC 对象权限都包含在 ipc_perm 数据结构中,这可以在  include/linux/ipc.h中找到。 System V 消息是在

    ipc/msg.c中实现, 共享内存在 ipc/shm.c中,信号量在

    ipc/sem.c中,管道在 ipc/pipe.c中实现。

    6. 中断处理

    内核的中断处理代码是几乎所有的微处理器所特有的。中断处理代码在  arch/i386/kernel/irq.c中,其定义子在

    include/asm-i386/irq.h中。

    7. 设备驱动程序

    Linux内核源代码的很多行是设备驱动程序。Linux设备驱动程序的所有源代码都保存在/driver,根据类型可进一步划分为:

    /block

    块设备驱动程序如ide(在ide.c)。如果你想看包含文件系统的所有设备是如何被初始化的,你应当看drivers/block/genhd.c中的device_setup(),device_setup()不仅初始化了硬盘,当一个网络安装nfs文件系统时,它也初始化网络。块设备包含了基于IDE和SCSI的设备。

    /char

    这是看字符设备(如tty,串口及鼠标等)驱动程序的地方。

    /cdrom

    Linux的所有CDROM代码都在这儿,如在这儿可以找到Soundblaster

    CDROM的驱动程序。注意ide CD的驱动程序是 ide-cd.c,放在drivers/block,SCSI CD的驱动程序是scsi.c,放在drivers/scsi。

    /pci

    这是PCI伪驱动程序的源代码,在这里可以看到PCI子系统是如何被映射和初始化的。

    /scsi

    在这里可以找到所有的SCSI代码及Linux所支持的scsi设备的所有设备驱动程序。

    /net

    在这里可以找到网络设备驱动程序,如DECChip 21040 PCI 以太网驱动程序在tulip.c中。

    /sound

    这是所有声卡驱动程序的所在地。

    8. 文件系统

    EXT2 文件系统的源代码全部在  fs/ext2/ 目录下,而其数据结构的定义在  include/linux/ext2_fs.h, ext2_fs_i.h 及

    ext2_fs_sb.h中。 虚拟文件系统的数据结构在 include/linux/fs.h中描述,而代码是在fs/*中。 缓冲区高速缓存与更新内核的守护进程的实现是在

    fs/buffer.c中 。

    8. 网络

    网络代码保存在/net中,大部分的include文件在include/net下,BSD套节口代码在net/socket.c中,IP

    第4版本的套节口代码在net/ipv4/af_inet.c。一般的协议支持代码(包括sk_buff 处理例程)在net/core下,TCP/IP联网代码在net/ipv4下,网络设备驱动程序在/drivers/net下。

    9. 模块

    内核模块的代码部分在内核中,部分在模块包中,前者全部在kernel/modules.c中,而数据结构和内核守护进程kerneld的信息分别在include/linux/module.h和include/linux/kerneld.h

    中。如果你想看ELF目标文件的结构,它位于include/linux/elf.h中。

    网,更多精彩阅读:

    更多相关内容
  • Linux内核代码阅读心得体会,可以跟着作者阅读学习linux的思路和linux内核来个亲密接触
  • 使用VSCode进行linux内核代码阅读和开发

    千次阅读 多人点赞 2021-06-14 19:18:40
    使用VSCode进行linux内核代码阅读和开发现状新的方法安装与配置1.安装VSCode2.安装Remote - SSH插件3.添加远程主机4.安装clangd5.在远程服务器安装bear6.配置clangd7.触发clangd工作效果遇到的问题总结参考链接 现状...

    现状

    Linux内核由于其本身代码量庞大,其中又包含各种平台宏定义开关/配置,外加各种结构体指针的注册,这使得阅读内核代码变成一件令人头疼的事。针对这个问题目前常见的解决方案有以下几种:

    1. 使用简单的文本浏览工具 + grep进行代码搜索浏览,这种方法最简单,效率也最低。
    2. 使用source insight进行代码浏览,使用这种方法的人应该很多,但是在浏览内核代码的时候有个缺点就是内核下有多个平台的头文件、源码,如果不做排除的话在代码跳转的时候往往能找到很多个同名函数或变量的定义,还得一个一个去确认,非常麻烦。虽然可以手动排除目录但仍然比较麻烦,之前好像看到网上有大神弄了一个脚本还是插件啥的可以根据内核中编译出的.o自动排除未编译的文件,这种相对方便点,但是头文件可能还是得手动排除。另外最重要的是source insight是收费软件,后面不用我说,相信大家心里有数┐( ̄ヘ ̄)┌。
    3. 使用vim + ctags,这种方法就比较高大上了,比较适合大神使用,咱vim都没玩的很透的人一般用不了。
    4. 使用VSCode加上C++ Intellisense插件或者global插件(见文章末尾参考链接2、3、4),类似source insight,需要手动排除未编译文件减小索引范围,代码定位不准。

    新的方法

    本文要介绍的是使用VSCode + Remote SSH + clangd插件来阅读linux内核代码。其中VSCode作为最强大的代码开发工具之一,主要负责主体框架及界面展示。Remote SSH插件用于访问远程服务器,实现远程代码本地化访问,也具有与远程服务器shell交互的终端功能,可以替代常用的putty、xshell、securecrt之类的工具(虽然功能上略弱)。clangd插件用于代码语义分析、代码补全、跳转等。该方案克服了上面列举的几种方案的几乎各种缺点,能做到代码精准跳转、精准自动补全,其他默认一些如代码着色自动缩进之类的VSCode自带。另外最重要的是这些都是免费的!

    除VSCode IDE以外,该方法的核心是clangd插件,clangd默认通过读取工程编译自动生成的compile_commands.json文件来索引其中包含的源文件和关联的头文件,因此能避免索引非编译的代码造成解析时语义混乱。下面展示一段compile_commands.json文件中的大致内容:

    [
        {
            "arguments": [
                "cc",
                "-c",
                "-Wp,-MD,net/netfilter/.nf_conntrack_proto_udp.o.d",
                "-nostdinc",
                "-isystem",
                "/home/work/my-kernel/prebuilts/gcc-x64/arm-cortexa9-linux-gnueabihf-4.9.3/bin/../lib/gcc/arm-cortexa9-linux-gnueabihf/4.9.3/include",
                "-I./arch/arm/include",
                "-Iarch/arm/include/generated/uapi",
                "-Iarch/arm/include/generated",
                "-Iinclude",
                "-I./arch/arm/include/uapi",
                "-Iarch/arm/include/generated/uapi",
                "-I./include/uapi",
                "-Iinclude/generated/uapi",
                "-include",
                "./include/linux/kconfig.h",
                "-D__KERNEL__",
                "-mlittle-endian",
                "-Wall",
                "-Wundef",
                "-Wstrict-prototypes",
                "-Wno-trigraphs",
                "-fno-strict-aliasing",
                "-fno-common",
                "-Werror-implicit-function-declaration",
                "-Wno-format-security",
                "-std=gnu89",
                "-fno-PIE",
                "-fno-dwarf2-cfi-asm",
                "-fno-ipa-sra",
                "-mabi=aapcs-linux",
                "-mno-thumb-interwork",
                "-mfpu=vfp",
                "-funwind-tables",
                "-marm",
                "-D__LINUX_ARM_ARCH__=7",
                "-march=armv7-a",
                "-msoft-float",
                "-Uarm",
                "-fno-delete-null-pointer-checks",
                "-Wno-maybe-uninitialized",
                "-O2",
                "--param=allow-store-data-races=0",
                "-DCC_HAVE_ASM_GOTO",
                "-Wframe-larger-than=1024",
                "-fstack-protector",
                "-Wno-unused-but-set-variable",
                "-fomit-frame-pointer",
                "-fno-var-tracking-assignments",
                "-Wdeclaration-after-statement",
                "-Wno-pointer-sign",
                "-fno-strict-overflow",
                "-fno-merge-all-constants",
                "-fmerge-constants",
                "-fno-stack-check",
                "-fconserve-stack",
                "-Werror=implicit-int",
                "-Werror=strict-prototypes",
                "-Werror=date-time",
                "-DMODULE",
                "-DKBUILD_STR(s)=#s",
                "-DKBUILD_BASENAME=KBUILD_STR(nf_conntrack_proto_udp)",
                "-DKBUILD_MODNAME=KBUILD_STR(nf_conntrack)",
                "-o",
                "net/netfilter/nf_conntrack_proto_udp.o",
                "net/netfilter/nf_conntrack_proto_udp.c"
            ],
            "directory": "/home/work/my-kernel/linux",
            "file": "net/netfilter/nf_conntrack_proto_udp.c"
        },
        {
            "arguments": [
    			......
    		],
            "directory": "/home/work/my-kernel/linux",
            "file": "......"
    	},
    	......
    ]
    

    该文件就是由每个源文件的编译参数、路径等信息组成的一个json文件,clangd通过这个文件可以准确定位源文件需要引用的头文件从而准确的找到各种宏定义、函数、变量声明的准确值了。

    那么问题来了,编译内核的时候也没有生成compile_commands.json这个文件呀。这个文件在编译cmake工程的时候可以自动生成,但是内核用的是make。这时候就需要另一个工具bear了,他就是专门用来生成这个的。ubuntu下直接sudo apt install bear就好了,如果不能用该命令安装的话也可以去github上搜索bear项目,找到源码自己下载编译安装。生成json文件的命令也很简单,只需要在你平时编译内核的命令前面加上bear就行了,比如:

    bear make ARCH=arm CROSS_COMPILE=arm-linux-gnu- zImage
    

    编译完成后在当前目录就会生成compile_commands.json这个文件。由于bear只是记录每个文件的编译命令,不会对编译速度有多少影响。
    在这里插入图片描述

    安装与配置

    1.安装VSCode

    去微软官网下载安装即可,官网嫌慢去国内软件下载站下载也行,注意不要下载到垃圾软件就行。

    2.安装Remote - SSH插件

    在VSCode Extension组件页搜索Remote - SSH插件安装,完成后建议重启一下VSCode(可能会自动提示需要重启)。

    3.添加远程主机

    由于我们一般嵌入式开发还是离不开windos,开发环境一般是windows主机用于办公+开发,然后要么虚拟机,要么单独的linux编译服务器用于编译linux系统,因此这一步就是用Remote SSH连接远程服务器,实现远程代码本地化访问。按F1键打开命令输入栏,输入Remote-SSH: Connect to Host…(不用全输,下面出现对应项点击就可以了)。在连接窗口输入要连接的远程主机(前面加上“用户名@”,如:test@192.168.50.170),也就是你编译linux内核的主机。连接上后可能会弹窗提示你是否记住该主机,点同意就行,然后输入登录用户的密码,登录成功后VSCode左下角状态栏会显示登录的主机状态,这个时候你就可以通过右下输出窗口旁边的TERMINAL标签页跟远程主机交互了(暂时还不用这个)。
    在这里插入图片描述

    4.安装clangd

    在VSCode Extension组件页搜索clangd,在插件介绍界面点击安装即可。需要注意的是clangd有两个安装选项,一个是安装到本地,也就是windows系统上,也可以选择安装到远程服务器上,比如页面显示可以看到有个"Install in SSH: 192.168.50.170"安装选项,这两个都需要安装。linux远程服务器上的clangd默认是安装到~/.vscode-server/目录下。VSCode在安装linux版本的clangd时是在github上下载安装包然后通过ssh导入到服务器上,正常途径访问不了github的同学这一步可能会超时安装失败,可以通过其他途径到clangd的 github发布页 按平台下载安装包,安装包在linux系统上解压出来,然后手动拷贝到对应系统目录即可。如果没有系统权限,参考vscode默认方式安装到自己的home目录也可以(可能需要自己导出路径到环境变量)。需要注意的是如果VSCode之前安装过C++ Intellisense插件需要禁用或者卸载掉,因为会和clangd插件有冲突。
    在这里插入图片描述

    5.在远程服务器安装bear

    前面已经说过了,很简单,sudo apt install bear即可(可以直接在第3步的terminal下操作)。

    6.配置clangd

    在已安装的Extension组件页选中clangd,点击图标旁边的齿轮打开设置页,User和Remote标签页中的Clangd Arguments都按照下面设置(点击Add Item,一个item输入下面的一行)

    --compile-commands-dir=${workspaceFolder}
    --background-index
    --completion-style=detailed
    --header-insertion=never
    -log=info
    

    设置完后关掉设置页面即可,vs会自动保存。
    在这里插入图片描述

    7.触发clangd工作

    在上面都设置完后,我们回到第3步,由于Remote SSH已经连接到远程服务器,这个时候我们点击主菜单“File” -> "Open Folder"会自动浏览远程服务器上的路径(如果没有连接remote ssh就直接点击Open Folder的话只能浏览本地路径)。浏览到内核源码根目录,也就是compile_commands.json所在的目录打开,这个目录就作为我们的worksapce了。如果执行make的目录不是工程源码的根目录,而是在某个子目录下,就不能以这个目录作为VS的workspace了,不然无法浏览上层目录的代码,这个时候可以在工程源码根目录创建一个软链接指向子目录中的compile_commands.json,然后以源码根目录作为workspace。然后在左边文件列表里双击任何一个.c内核源文件(需要是参与编译的),这个时候你就可以看到最下面状态栏clangd开始执行indexing了,也就是解析workspace下compile_commands.json文件里描述的所有源文件,创建索引数据库(保存在workspace目录下的.cache/clangd目录下),待所有索引文件创建完成再回到代码窗口可以看到#include后面的头文件名下面都有了下划线,这个时候代码里的函数、变量、宏定义和头文件就可以通过Ctrl+鼠标左键点击来跳转查看定义了,指针悬停在这些地方也会显示出预览了。相比source insight创建index,感觉clangd要快不少,而且创建的index数据库也比较小。后续如果文件改动了,clangd在启动的时候会自动重新同步并生成新的index,但是如果新增了文件的话就需要重新执行bear make去生成新的compile_commands.json,这样新的文件才会被索引。
    在这里插入图片描述

    效果

    结构体成员自动补全
    在这里插入图片描述

    指针悬停自动查看函数、变量原型,宏定义值等
    在这里插入图片描述
    精确查找变量、函数被引用的地方。这里查找的是vin_pipe_ops结构体的close函数指针被引用的地方,可以看到查找的结果是非常准确的,没有查找到其他驱动或内核代码的close指针。
    在这里插入图片描述

    遇到的问题

    使用时遇到一个困扰了比较久的问题就是手上有一个平台的内核源码compile_commands.json生成没问题,但是clangd在生成索引的时候速度快的不正常,几千个文件的索引数据几秒钟就生成好了你敢信。生成完后代码跳转查看定义功能完全没有。到workspace下的.cache/clangd下面查看实际就只生成了几十个文件的索引,尝试删掉目录重新启动VSCode重新创建索引库,但效果依旧,不知道啥原因,在clangd官网Troubleshooting上也没找到类似问题,于是搁置了一段时间。后来有了一点时间再次尝试,找到查看clangd日志的方法后发现差不多在每个文件indexing的时候日志都会有下面的报错:
    unknown target ABI ‘armv7-a’
    Couldn’t build compiler instance
    根据这个报错信息在clangd github issue 上找到了解决方案,即在workspace目录下创建一个.clangd文件,里面填入下面文本:

    CompileFlags:
      Add: --target=armv7-a
    

    64位平台如果报错可以尝试用下面的配置

    CompileFlags:
      Add: --target=aarch64-linux-gnu
      Remove: -mabi=lp64
    

    然后删掉旧的index,重新让clangd创建index,这次速度就正常了,完毕后代码跳转功能也正常了。
    如果后续遇到其他问题,比如某些函数定义查找不到,无法跳转或只能跳转到声明的地方,可以在clangd的设置项里加上-log=verbose(见clangd配置章节),然后在VSCode的OUTPUT窗口选择clangd日志输出,这样就可以看到一些报错信息,比如像下面这种情况就会导致查看kernel/power/main.c里的函数定义时无法跳转到对应的C文件。问题解决后可以再将-log参数改为info或error以减少日志输出。
    在这里插入图片描述
    20210729补充:
    一段时间没有连接服务器,后来重新连接发现remote ssh连不上,要么连接的时候报错:

    Error: Running the contributed command: '_workbench.downloadResource' failed
    

    要么反复输入密码但就是登不进去,通过搜索上述报错信息同样是在github的issue里找到了解决方案,原因是vscode remote ssh插件自动更新后需要同步更新服务器端,remote ssh连上服务器后会在服务器端执行wget下载服务器端的一个支持包(或者是更新包?),但由于服务器DNS配置有问题导致域名无法解析,下载失败从而导致remote ssh一直报错,修复域名解析就好了(需要先删除remote ssh在远程服务器上创建的文件锁,否则remote ssh会一直等待)。同样问题也可参考这里。也可以尝试在remote ssh的设置里将local server download改成always,这样remote ssh更新的时候就只会通过主机端更新然后将更新包传到远程服务器安装,这样可以解决远程服务器处于内网无外网访问权限时更新,但是我自己有次更新时发现主机端更新时仍然报错,在github issue上似乎也没找到好的解决方法,于是还是改回auto了:(

    20210826补充:
    之前浏览内核代码的时候发现总有些文件索引时报错无法创建index,或者提示有些编译选项不支持、代码中有些汇编指令无法识别导致报错进而也导致一些文件或文件中部分函数定义无法索引。尝试将compile_commands.json里"cc"全部替换为交叉编译器所在路径比如"/home/xxx/mnt/cv2x_linux_sdk_3.0.5/toolchain/linaro-aarch64-2020.09-gcc10.2-linux5.4/bin/aarch64-linux-gnu-gcc"后(编译是arm64位的平台)这些问题基本都解决掉了。可能之前遇到的unknown target ABI ‘armv7-a’也是因为compile_commands.json里没有给出具体的编译器,clangd默认使用x86的gcc导致报错。至此,该方法应该算完美了:)。

    总结

    通过上面的介绍相信你已经了解到该方法的强大、好用了。当然该方法也不仅限于浏览Linux内核代码,应用程序的代码也是可以的,前提是要能生成compile_commands.json这个文件,否则clangd无法解析。另外上面介绍的都是利用Remote SSH通过远程访问代码实现的,对于windows本地代码工程clangd也可以实现上述功能,具体请自行摸索。如果是小工程,又没有比较方便的方法生成compile_commands.json的话(比如像单片机程序),可以使用本文参考链接4的方法去实现,但记得在插件管理里面disable clangd并使能C/C++和C++ Intellisense。


    参考链接

    1. c++ 项目_使用clangd替代c/c++配置vscode c++项目
    2. vscode在linux下搭建内核驱动开发环境
    3. 使用VSCode阅读linux内核源码
    4. VS code 阅读内核代码
    5. How to setup VS Code for C++ with clangd support?
    6. Developing Mozilla C++ code with clangd and VSCode
    7. Clangd Troubleshooting
    8. Issue: Couldn’t build compiler instance
    展开全文
  • Linux内核代码自动格式化配置文件 Linux内核编码排版风格 Linux内核自动格式化代码clang-format工具配套配 重命名为.clang-format放到VSCODE工作区下面即可
  • 1.1 Linux内核代码下载、编译

    千次阅读 2022-03-25 15:21:59
    因为工作,需要经常写一些linux测试程序和demo,有些时候还要修改下内核配置。公司环境不是很适合,说以突发奇想,在开源的linux源码上来尝试,并将这些demo进行开源,方便自己后面复用。 一、下载Linux源码 ...

    写在前面

    因为工作,需要经常写一些linux测试程序和demo,有些时候还要修改下内核配置。公司环境不是很适合,说以突发奇想,在开源的linux源码上来尝试,并将这些demo进行开源,方便自己后面复用。

    一、下载Linux源码

     官网:The Linux Kernel Archives

    选一个版本的源码下载:https://cdn.kernel.org/pub/linux/kernel/v4.x/linux-4.19.236.tar.xz

    下载完通过“tar -xvf linux-4.19.236.tar.xz”解压即可

    如何不知道当前内核版本,可以vim 源码根目录下的Makefile查看版本信息,如下:

     二、Kernel编译

    2.1 编译前配置内核

    make menuconfig

    注意:该命令基于文本菜单的配置界面

     如果不熟悉保持默认,直接保存退出即可。或者参考其他同学的翻译,虽然版本比较老,但基本满足需要。

    下载链接:linux_kernel_config中文手册(2.6.28)-Linux文档类资源-CSDN下载

     

    2.2 编译内核

    make

    ......

    ......
      OBJCOPY arch/x86/boot/vmlinux.bin
      AS      arch/x86/boot/header.o
      LD      arch/x86/boot/setup.elf
      OBJCOPY arch/x86/boot/setup.bin
      BUILD   arch/x86/boot/bzImage
    Setup is 15740 bytes (padded to 15872 bytes).
    System is 8309 kB
    CRC 4107bcca
    Kernel: arch/x86/boot/bzImage is ready  (#1)
    

    bzImage就是刚才编译产生的压缩的内核镜像,bz表示“big zImage”。

    2.x FAQ

    2.x.1 Unable to find the ncurses package.

    解决方案:apt-get install ncurses-dev

    2.x.2 bison: not found

    解决方案:apt-get install bison

    2.x.3 flex: not found

    解决方案:apt-get install flex

    2.x.4 Cannot generate ORC metadata for CONFIG_UNWINDER_ORC=y

     解决方案:apt-get install libelf-dev libssl-dev

    展开全文
  • Linux 内核代码修改

    2012-09-24 21:13:32
    Linux 内核代码修改,在国外课程第一次修改linux内核
  • Linux内核代码及解析

    2012-06-25 20:00:22
    里面包含着赵炯老师的Linux内核代码完全解析这本书,以及Linux0.11版本的操作系统,希望给大家的学习带来帮助
  • 截止到2020年1月1日09:00:10,Linux内核Git源码树中的代码达到了2780万行。 phoronix网站统计了Linux内核在进入2020年时的一些源码数据并...

        截止到2020年1月1日09:00:10,Linux内核Git源码树中的代码达到了2780万行。

        phoronix网站统计了Linux内核在进入2020年时的一些源码数据并作了总结,从统计数据来看:

    • Linux内核源码行数总量共有27852148行(包括文档、Kconfig文件、树中的用户空间实用程序等)

    • 887925次commit,即提交量

    • 大约21074位不同的作者参与内核的开发

    • 2780万行代码分布在66492个文件中

        据记载,在2005 ~ 2019 年期间,Linux 内核代码提交量第一人,每一年都是 Linus Torvalds

    展开全文
  • linux内核代码深度解析linux内核代码深度解析linux内核代码深度解析linux内核代码深度解析linux内核代码深度解析linux内核代码深度解析linux内核代码深度解析linux内核代码深度解析linux内核代码...
  • 博主之前用soureinsight+samba形式来开发驱动,不过由于soureinsight在samba网络协议下同步代码太慢了,而且soureinsight用的是破解版。  所以,为了提高效率在网络上搜了很多文章,大部分都推荐字符界面操作的编辑...
  • LINUX内核代码在线阅读网址

    千次阅读 2017-06-28 10:44:25
    http://lxr.linux.no/
  • Linux内核代码情景分析(全册高清带书签)完整版珍藏
  • 如何使用git获取linux内核代码仓库

    千次阅读 2018-03-27 09:44:21
    如何使用git获取linux内核代码仓库 目录 用 [TOC]来生成目录: 如何使用git获取linux内核代码仓库 目录 下载指定分支 获取分支log信息 添加其他远程分支 获取远程分支 切换分支 查看远程分支信息 本...
  • 里面包含了Linux操作系统内核分析以及深入分析linux内核代码
  • linux内核代码框架图

    2008-09-23 22:55:39
    国外对linux内核代码框架的经典总结,有助于整体了解linux内核代码
  • Linux内核代码情景分析(上册高清带书签)pdf
  • Linux 内核代码情景分析_全册_带书签 非扫描版 高清 文字版 可选择复制
  • Linux内核源码+查看工具,Linux内核源码+查看工具Linux内核源码+查看工具
  • Linux内核代码情景分析(高清版) 让你对linux内核的细节熟悉,让你更快的对linux内核开发得心应手
  • LINUX内核代码情景分析.pdf 高清下载
  • 非常适合用于查看linux内核代码的...内核代码版本包括从2.0.40-4.4版本的linux内核代码 Identifier Search可以来查询各种关键字,关键字必须是完整,不支持模糊搜索 点击变量名、函数名等可以直接搜索 需要翻墙。。。。
  • Linux内核代码情景分析(完整版-带书签目录超清文字版).pdf 这个是带完整目录书签的文字版本,文本内容可以复制的哦
  • 在使用Linux系统时感到操作卡顿,甚至某些硬件难以工作,新的硬件识别不了等问题时,这些都是内核版本过低导致的,这时候你就需要升级内核版本了。 怎么升级? 1. 查看自己当前linux内核版本号(注意区别于发行...
  • 奔跑吧Linux内核基于Linux4.x内核源代码问题分析,要下的速度了,很快就删了
  • linux内核代码解析笔记
  • linux内核代码注释

    2009-12-14 22:49:37
    linux内核代码做了一个比较详尽的描述
  • linux 内核SD卡驱动源代码
  • 需要多久才能看完linux内核源码?

    千次阅读 2021-12-09 20:52:54
    内核代码大小 Linux内核分为CPU调度、内存管理、网络和存储四大子系统,针对硬件的驱动成百上千。代码的数量更是大的惊人。 看看内核代码量的统计。 从图中可以看出,2020年1月份,内核的代码量大约是2千6百万行。 ...
  • 应该说是把linux内核这部分知识提前了,因为坐公交需要点视频来打发一下时间,感觉linux内核的视频就不错,就顺便把linux内核提前了。这一次也是打算视频和书一起看,然后总结。书的话还是推荐《深入linux内核架构》...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 455,699
精华内容 182,279
关键字:

linux内核代码