精华内容
下载资源
问答
  • 内核开发

    千次阅读 2013-05-01 00:28:43
    一,linux内核介绍: linux内核体系结构总体分为两部分:用户空间、内核空间。然而各自两部分也可以细分。 用户空间 user app:用户应用应用程序,一般都运行在用户态 glibc:库函数 内核空间 sci:系统调用...
    一,linux内核介绍:
    linux内核体系结构总体分为两部分:用户空间、内核空间。然而各自两部分也可以细分。
    内核开发-第一天 - ds_liang - Ds_liang
    用户空间
    user app:用户应用应用程序,一般都运行在用户态
    glibc:库函数
    内核空间
    sci:系统调用,应用程序一般通过系统调用进入内核态
    kernl:linux内核,里面还可以细分为很多部分
    adkc:arch,就是架构。这部分就是内核与体系结构相关的代码
    然而更进一步细分如下图,
    内核开发-第一天 - ds_liang - Ds_liang
    一共七个部分
    sci:系统调用,应用程序进入内核态的一个入口
    pm:进程管理
    vfs:虚拟文件系统,linux对各种文件系统进行封装对最总成为一个统一的借口
    mm:内存管理系统,主要是内存的管理
    ns:网络栈
    arch:与体系结构相关代码
    dd:驱动程序

    为什么分为用户态、内核态?
    arm系统处理器可以处于其中不同的模式,然而一般应用程序都运行在用户模式或者系统模式。另外五种模式拥有 处理器的全部硬件资源。假如程序运行在最高权力之下出来问题还有谁能管?出于对内核的保护,必须让程序运行在一 种权限受限的模式之下,前面所述的两种模式正合。分这两种状态最最要是对内核的保护。

    二,linxu内核源代码
    linux内核源代码结构基本就是像树一样,从根部向各方向伸展。并且按照一定的规律组织起来。
    要注意的主要有两点:
    mm是linux通用的内存管理代码,而与体系相关的内存管理代码在arch/xxx/mm目录下
    include/linux中的也是linux通用的头文件,与体系相关的头文件在arch/xxx/include目录下
    感觉这部分没什么好讲的。

    三,linux内核配置与编译
    编译linux内核之前就必须对其进行配置,这也是必须的吧。因为你编译都要有相对编译的依据吧,至少那个要编 译那个无须编译都都要描述的一清二楚的吧。其中根目录下.config文件里面的东东就是觉得如何那个应该编译那个不应 该编译那个编译那个又要编译成模块。
    有一个指令不得不讲, cp /boot/config-2.6.35-22-generic ./.config复制当前系统的配置到根目录下,这样我们就可
    以获取到当前系统的配置。而且编译一个新的属于自己的内核也不是梦了,当然在这前提在在根据自己的需要配置内核 是一个多么爽的事情呢!特别以前看ldd3一开是就要编译内核,啊!哥哥不会啊,这么多配置怎么搞啊?有了这东东老 实说根本不用烦!
    假如没修改Makefile默认就是编译x86架构的内核,x86要求内存小于512kb要我自己配置我真的无法达到这高度。 而且x86使用的是bzImage格式镜像,我们的arm用uboot引导的话使用的几时uImage格式。
    make clean:删除编译生成的中间文件(*.o)
    make mrproper:删除编译生成的中间文件(*.o)并且删除配置所产生的配置文件(.config)
    make distclean:删除编译生成的中间文件(*.o)、删除配置所产生的配置文件(.config)并且path、bakup等文 件
    make menuconfig:基于文本模式进行配置
    推荐这模式,在这模式之下可以选择为y、n、m
    y:编译进内核
    n:不编译进内核
    m:编译成模块,当需要使用的时候动态加载到内核
    (y ) a.c ---> a.o 结合其他a.o文件链接成为Image(内核)文件
    (m) b.c ---> b.o 编译模块
    (   ) c.c       不编译

    基于已有.config进行配置
    通过 cp /boot/config-2.6.35-22-generic ./.config获得当前系统配置文件这是一种方法。
    在arch/xxx/config目录下有很多改架构的配置文件,可以选着一个作为蓝本进行配
    (S3C2440:cp arch/arm/configs/s3c2410_defconfig ./config,make s3c2410_defconfig效果一样)
    现在直接make可以进行内核编译了。
    接着make bzImage编译出bzImage镜像,make modules_install安装模块。默认在装在/lib/module/xxx目录下

                    制作init ramdisk
                    mkinitrd initrd-xxx xxx
                    后面的xxx代表/lib/module目下那个由我们刚刚编译出来的文件夹一定要匹配,在该目录下会生成initrd-xxx文件
    (ubuntu方法不一样sudo mkinitramfs -o /boot/initrd.img-3.0.4,直接在/boot下生成initrd.ing-3.0.4)

    添加启动引导
    复制bzImage到/boot并重命名(vmlinuz-3.0.4)
    复制initrd-3.0.4到/boot并重命名(initrd.img-3.0.4)
    因为我是用ubuntu跟redhat有点不一样,修改vi /boot/grub/grub.cfg内核开发-第一天 - ds_liang - Ds_liang
      每一个menuentry代笔一个启动项,我们依瓢画葫就ok了。

    因为写的比较乱,下面总结一下:
    1, cp /boot/config-2.6.35-22-generic ./.config复制当前系统配置,其后配置可以在这基础上安装自己需要修改配 置
    2,make menuconfig 配置内核
    3,make 编译
    4,make bzImage 编译bzImage格式内核
    5,make modules && make modules_install 安装模块
    6,mkinitrd initrd-xxx xxx 生成init ramdisk(sudo mkinitramfs -o /boot/initrd.img-3.0.4)
    7,复制bzImage,initrd-xxx到/boot
    8,修改grub.cfg
    到此就已经编译出一个属于自己的linux内核!

    四,内核模块开发

    linux可以将功能编译成模块,在需要使用的时候加到内核。从而实现动态,这不单单决绝了内核文件过大的问题,而且但组件发送变化只需要重新编译模块就可以了。加载过程不需要重启电脑这也是模块最大的好处,十分方便调试!功能模块一般要么编译进内核要么编译成模块。如果编译进内核会造出内核文件变大而且修改不变,发现变化时都必须重新编译内核,但是优点是一直都存在内核中。我觉得也不算是优点吧。编译成模块则在使用时加载就可以实现其功能,并不一直存在内核中。就是使用时加载。特点不编译进内核,在运行时期动态安装、卸载。

             模块框架:

     

             //特定头文件

             #include <linux/init.h>

             #include <linux/moudule.h>

            

             //许可证

             MODULE_LICENSE(“GPL”);

            

             //初始化函数

             static int __init hello_init(void)

             {

            

                       return 0;

             }

     

             //退出函数

             static void __exit hello_exit(void)

             {

     

                       return ;

             }

     

             //两个指定初始化函数、退出函数的宏

             module_init(hello_init);

             module_exit(hello_exit);

            

             makefile框架:

             #第一次在当前目录没定义,在linux代码运行此时有定义并且导出obj-m

             ifneq ($(KERNELRELEASE),)

     

             #obj-m代表模块

             obj-m := hello.o

     

             else

            

             #指定linux代码目录

             KDIR := /lib/module/xxx/build

            

             all:

                       make –C $(KDIR) M=$(PWD) modules

     

             clean:

                       rm -f *.ko *.o *.mod.o *.mod.c *.symvers

             endif

     

             insmod:加载模块

             rmmod:卸载模块

             lmmod:列出所加载的函数

     

             c语言函数与模块区别

             1,c语言指定main函数执行并且执行完后就消失了。但是模块一旦加载就一直存在,           知道将其卸载。通过两个宏指定进出入口。

             2,c语言可以直接编译,但是模块就必须结合linux代码、makef来进行编译

     

             hello例子(module_param)

             #include <linux/init.h>

             #include <linux/module.h>

     

             //使用参数,必须点定义参数module_param再声明参数

             //module_param(, , )第二个参数为类型可以为int,bool,charp.第三个参数为全限

             //假如不传递参数默认为1

             int count  = 1;

             module_param(count, int, S_IRUGO);

     

             MODULE_LICENSE(“GPL”);

     

            static int __init hello_init(void)

             {

                       for(;count > 0;count--)

                       printk(KERN_ERR “hello,Dsliang!\n”);

     

                       reutn 0;

             }                          

     

             static void __exit hello_exit(void)

             {

                       printk(KERN_ERR “GoodBye!\n”);

     

                       return ;

             }

     

             //指定hello_init函数,当调用ismod加载此模块时自动调用hello_init函数

             module_init(hello_init);

             //指定hello_exit函数,当调用rmmod加载此模块时自动调用hello_exit函数

             module_exit(hello_exit);

     

             symbol例子(EXPORT_SYMBOL)

             //symbol.c

             #include <linux/init.h>

             #include <linux/module.h>

     

             MODULE_LICENSE(“GPL”);

     

             extern void myprint(char *ptr);

            

             static int __init symbol_init(void)

             {

                       myprint(“hello!Dsliang”);

     

                       return 0;

             }

     

             static void __exit symbol_exit(void)

             {

                       myprint(“GoodBye!”);    

     

                       return ;

             }

     

             module_init(symbol_init);

             module_exit(symbol_exit);

     

     

             //symbol_export.c

             #include <linux/init.h>

             #include <inux/module.h>

     

             MODULE_LICENSE(“GPL”);

     

             void myprint(char *p)

             {

                       printk(KERN_ERR “%s”, p);

     

                       return ;

             }

     

             static int __init symbol_export_init(void)

             {

     

                       return 0; 

             }

             static void __exit symbol_export_exit(void)

             {

     

                       return ;

             }

            

             module_init(symbol_export_init);

             module_exit(symbol_export_exit);

             EXPORT_SYMBOL(myprint);

     

     

             !!!主要一定要再同一个目录下编译才能

             //obj-m = symbol.o symbol_export.o

     

             通过查看/proc/kallsyms可以看到对于的符号有没在系统

             EXPORT_SYMBOL(xxx)à添加xxx函数关联到/proc/kallsyms文件中

             假如没有这符号,加载模块会出现”unknow symbol in module”并且无法加载

     

             假如有不匹配问题(当前运行内核没其代码):

    1,  可以使用modprobe –force-modversion 强制加载(不建议)

    2,  使用同一版本内核代码进行编译

     

    printk与printf

             printk是内核函数,printf是c库封装了printk函数。在内核只能使用printk。

             printk函数有优先级”<0>” “<1>” ”<2>” “<3>” ”<4>” “<5>” ”<6>” ”<7>”优先级越高值越低

             不加默认为KERN_WARNING,假如优先级低于(Console_loglevel)则不输出终端。但是无论如何在 /var/log/message都会记录所有输出

             通过查看/proc/sys/kernel/printk(可以对其修改,但是重启复位)可以看到对应的值

             4                          4                          1                          7               

             控制台              默认值             

    展开全文
  • 译者序:这是一篇很重要的文档,它介绍了内核开发的方方面面。这篇文档已被加入到内核源码树的Documentation文档里(名字为HOWTO),你可以在最新的内核树里找到它。尽管已经有网友翻译过这篇文档,但是我还是决定...

    译者序:这是一篇很重要的文档,它介绍了内核开发的方方面面。这篇文档已被加入到内核源码树的Documentation文档里(名字为HOWTO),你可以在最新的内核树里找到它。尽管已经有网友翻译过这篇文档,但是我还是决定自己再翻译一遍。翻译完之后,我的感触是如果依靠翻译来进行学习,速度太慢了。以后的技术文档直接看英文,适当的做做笔记即可。

     

    山涛

     

    -----------------------------------------------------

    How to do Linux Kernel development

    -----------------------------------------------------

    关于如何进行Linux Kernel development,这篇文档是最值得你阅读的一篇。它指导你如何成为一名Linux内核开发者以及如何和Linux内核开发社区一同工作。尽管它不包含内核编程的技能方面的知识,但是本篇能够给你正确的指导去做内核开发。

     

    如果这篇文档讲述的任何东西已经过时了的话,请给这篇文档的维护者发送你的更新。

     

    Greg Kroah-Hartman greg@kroah.com

     

    Introduction

    -----------------

    你想成为一名Linux内核开发者吗?或者你的老板曾经告诉你:去给某个设备写个Linux驱动程序。这篇文档的目标是,通过描述你进行开发时需要经历的一些流程规则去指导你如何与社区一起工作,教会你所需要的一切从而让你实现你的目标(成为一名合格的内核开发者,或者写出合格的令老板满意的驱动程序);这篇文档也会说明内核社区工作的风格和原因。

     

    内核绝大部分代码是基于C语言编程,与体系结构有关的一小部分由汇编完成。很好的理解和掌握C语言,是内核开发的必备要求。汇编语言(不同的体系结构有不同的汇编语言)不是必需的,除非你计划做体系结构相关的底层开发。如果你想加强C语言的掌握,很好的参考资料如下:

    - "The C Programming Language" by Kernighan and Ritchie [Prentice Hall]
    - "Practical C Programming" by Steve Oualline [O'Reilly]

     

    Linux内核是使用GNU CGNU工具链完成的。尽管它遵循ISO C89标准,但是内核的编写也使用了许多的GNU C的扩展特性,这些特性不属于标准的一部分。内核的C编程环境自成体系,不依赖于C标准库,所以C标准的一部分特性没有被支持:例如Arbitrary long long divisions和浮点指针不被支持。有时你会很难理解内核基于GNU工具链的一些假定以及内核使用的一些GNU C扩展,不幸的是对于这类问题没有确定性的参考资料。如果你遇到这类问题,建议你查阅GCCinfo pages来获取相关的信息(在Linux PC上,通过命令 info gcc可以获得信息)。

     

    请记住你正在学习如何与已经存在的内核开发社区一起工作。内核开发社区由全球不同地方的开发人员组成,它以代码、风格、开发流程的高质量标准著称。这些高质量的标准使内核开发社区(这个组织非常大,地理位置非常分散)能够非常有效的进行。应当提早努力学习这些高质量标准(编程风格、代码要求以及开发流程),它们有很好的文档;不要期望内核开发社区别的开发人员会适应你自己的或者你公司的开发风格。

     

    Legal Issues

    ------------------

    Linux 内核代码基于GPL许可协议发布。请阅读内核源码树的主目录里的COPYING文件,它提供了GPL许可的详细描述。如果你有关于GPL许可的进一步问题,请联系一名律师,不要在Linux kernel mailing list里询问。Linux kernel mailing list里的开发人员不是律师,所以你不应当听取他们的任何关于法律事务的建议。

    对于一些通常的关于GPL许可的问题和解答,请参考:

    http://www.gnu.org/licenses/gpl-faq.html

     

    Documentation

    ---------------------

    Linux内核源码树里有大量的非常有用的文档用于学习,使你与内核社区相互促进和共同发展。当一个新的特性要加入到内核里,建议相关的文档也要加入到内核里,用于描述如何使用这个新特性;当一个内核的修改导致了内核提供给用户的接口发生了变化,建议你发送信息或者一个补丁给mtk-manpages@gmx.net,告诉manual pages的维护者用户接口的变化。

     

    这里罗列了一些内核源码树里的需要阅读的文档:

     

    README

    这篇文档简要的介绍了Linux内核的背景,描述了配置和build内核需要什么。一个刚刚接触内核的新手应当从这里开始。(注:build kernel,就是编译内核源代码,生成可供系统使用的内核二进制文件(vmlinux/zImage)的过程。

     

    Documentation/Changes

    这篇文档给出了一个用于成功编译和运行内核的各种软件包的列表的最小集合。

     

    Documentation/CodingStyle

    这篇文档描述了Linux内核编码风格,和一些隐藏在背后的基本原理。所有的想加入内核的新代码应当遵循这篇文档的指导。绝大数的内核代码维护者只愿意接受那些符合这篇文档描述的风格的补丁,许多内核开发者也只愿意审查那些符合Linux内核编码风格的代码。

     

    Documentation/SubmittingPatches

    Documentation/SubmittingDrivers

    这些文档清楚而又详细地告诉你如何成功的创建和向社区递交一个补丁,包括:

    ----邮件内容

    ----邮件格式

    ----发送者和接收者

    遵循文档里提倡的规则并不一定保证你提交补丁成功(因为所有的补丁遭受详细而严格的内容和风格的审查),但是不遵循它们,提交补丁肯定不成功。

    其他的一些非常优秀的描述如何正确的创建补丁的文档如下:

    "The Perfect Patch"
    http://www.zip.com.au/~akpm/linux/patches/stuff/tpp.txt
    "Linux kernel patch submission format"
    http://linux.yyz.us/patch-format.html
     

    Documentation/stable_api_nonsense.txt

    这篇文档描述了有意决定在内核里没有固定内核API的基本原因,包含下面的讨论主题:

    ---子系统的shim-layers(为了兼容性?)

    ---操作系统之间的驱动移植性

    ---减缓内核源码树的快速变化(或者说,防止快速变化)

    这篇文档对于理解Linux的开发哲学非常关键,也对于从其他操作系统转移到Linux上的开发人员非常重要。

     

    Documentation/SecurityBugs

    如果你确知你在Linux Kernel里发现了security problem,请遵循这篇文档描述的步骤,帮助通知内核的开发者们并解决这类问题。

     

    Documentation/ManagementStyle

    这篇文档描述了Linux内核开发者们如何进行管理运作,以及运作方法背后的分享精神(shared ethos)。这篇文档对于那些内核开发新手们(或者那些好奇者)值得一读,因为它解决或解释了很多对于内核维护者独特行为的误解。

     

    Documentation/stable_kernel_rules.txt

    这篇文档描述了一个稳定的内核版本如何发布的规则,以及需要做些什么如果你想把一个修改加入到其中的一个版本。

     

    Documentation/kernel-docs.txt

    关于内核开发的外部文档列表。如果你在内核开发的内部文档中找不到你想要的资料,请参考这篇文档提供的资料链接。

     

    Documentation/applying-patches.txt

    这篇文档很好地描述了什么是补丁(patch),以及如何将它应用到内核的不同开发分支(branch)上。

     

    内核里也有大量的由内核源码自动生成的文档。其中包括了内核内部API的全面描述,和如何处理好锁的规则。这些文档在Documentation/DocBook/下创建,格式可以是PDFPostscritptHTMLman pages,在内核源码主目录下通过运行下面命令自动生成:

    make pdfdocs

    make psdocs

    make htmldocs

    make mandocs

     

    Becoming A kernel Developer

    ------------------------------------------

    如果你对Linux内核开发一点也不了解,你应当看看Linux KernelNewbies的项目:

    http://kernelnewbies.org

    它包含了很有用的邮件列表,通过这些列表你可以提问任何关于内核开发的基本(基础)问题(在提问之前,最好搜索一下邮件列表的归档,也许你的问题在过去已经被提问和解答了)。它还有一个IRC频道,你可以通过这个频道进行实时的提问。它还包含了大量的有用的文档,帮助你学习Linux内核开发。

     

    这个网站包含了关于代码组织、内核子系统、当前的一些内核项目的基本信息。它也描述了一些基本的内核开发流程的信息,比如怎样编译内核和提交补丁。

     

    如果你还不清楚你想从哪里开始,但你想加入内核开发社区并且找一些任务来做,那么你去看看Linux Kernel Janitor 项目:

    http://janitor.kernelnewbies.org/

    这是一个非常不错的供你起步的地方。它描述了一些在Linux内核源码树里需要整理和修正并且相对简单的问题的列表。和开发者一起工作,并负责这个项目,你将学习到基础的东西:把你的补丁加入到Linux内核源码树,而且开发者会指导你下一步的工作是什么(如果你还没有自己的计划)。

     

    如果你已经有了一堆代码,想把代码加入到内核树里,但是你想获得一些帮助,使这些代码以适当的形式被内核开发者获取,kernel-mentors项目帮助你解决这个问题。它是一个邮件列表,你可以从下面的网址得到它:

    http://selenic.com/mailman/listinfo/kernel-mentors

     

    在对Linux内核代码做出任何实际的修改之前,你必须理解你所修改的这部分内核代码是如何工作的。为此,没有比你通读这些代码更好的办法了,也许可以用一些特殊工具帮助你阅读。其中一个值得推荐的工具是Linux Cross-Reference项目,它能够以网页索引的格式显示源码(每个函数或者变量都有web pag格式的索引链接,如果你想查找代码中的某个使用的函数的定义,直接双击它的链接,你就可以获得)。一个非常不错的Linux Cross-Feference项目网站如下:

    http://users.sosdg.org/~qiyong/lxr/

     

    The development process

    -------------------------------------

    当前,Linux内核开发的过程中包含了几个不同的主内核“分支”,以及许多不同的特定子系统(subsystem-specific)的内核分支。这些不同的分支如下:

    ---main 2.6.x kernel tree

    --- 2.6.x.y  -- stable kernel tree

    --- 2.6.x   -- git kernel patches

    --- 2.6.x   -- mm kernel patches

    --- subsystem specific kernel trees and patches

     

    2.6.x kernel tree

    -------------------

    2.6.x kernels主要由Linus Torvalds维护,你可以在www.kernel.org上的pub/linux/kernel/v2.6/目录下获取。它的开发过程如下:

    --- 当一个新内核发布后,一个为期两周的“窗口”打开,在这段时间里,内核维护者向Linus提交修改比较大的补丁,通常这些补丁已经被包含在-mm kernel树里一段时间了(大约几周)。首选的提交较大的补丁的方法是利用git工具(内核代码管理工具,更多的信息请参考http://git.or.cz/),但是普通的补丁提交方式也是可以的。

    --- 两周之后,一个-rcl 内核发布了。现在可以向内核里加入那些不会影响kernel稳定性以及不包含新功能的较小的补丁了。注意一个新的驱动(或者是文件系统)补丁在rcl kenel发布后有可能被接受,只要补丁的代码是self-contained的,不影响内核其他代码的正常运行,这样就不会引起内核回归(内核回归测试,指的是测试新版本的内核加入的补丁是否对内核的其他模块有副作用,导致内核不稳定)。git工具用于在-rcl kernel发布后向Linus发送补丁,但这些补丁也同时需要发送到公开的邮件列表中让内核开发者来审查。

    --- Linus确信当前的git树已经通过足够健全的、合理的测试,一个新的-rc版本就发布了。社区的目标是每周发布一个新的 -rc内核版本。

    --- 这个过程不断的继续,直到整个kernel被认为“ready”了,这个过程大概持续大约六周。

    --- -rc kernel发布版本,有一个著名的跟踪内核回归测试的列表:

    http://kernelnewbies.org/known_regressions

     

    值得一提的是,Andrew Mortonlinux-kernel邮件列表里关于内核发布的阐述:

    “没有人知道新的内核版本什么时候发布,因为内核发布依赖于我们所认识的内核现有的BUG的状态,而不是我们所制定的时间规划表(timeline)

     

    2.6.x.y – stable kernel tree

    -------------------------------

    含有四个数字的内核版本是 -stable kernel分支。-stable kernel分支包含了相对较小的、关键的用于解决安全隐患的修改补丁,或者是针对一个给定的2.6.x kernel所发现的重要的回归修订。

     

    对于那些需要最新的稳定内核的用户,以及对内核测试/开发/实验版本不感兴趣的人,推荐使用这个分支上的内核发布版本(即-stable kernel release)。

     

    如果不存在合适的2.6.x.y内核版本,则数字最高的2.6.x(这里这x数值最高)版本就是当前的稳定内核版本。

     

    2.6.x.y由“stable”团队维护<stable@kernel.org>,通常每隔一周发布一次。

     

    内核树中的文档Documentation/stale_kernel_rules.txt说明了哪些修改补丁能够被-stable kernel tree接受,以及-stable kernel发布过程是如何进行的。

     

    2.6.x -git patches

    --------------------

    这些补丁是Linus kernel tree的每日快照,由git仓库来管理。这些补丁通常每日发布,并且显示Linus tree中的当前状态。与-rc kernels相比它们更具有实验性,因为它们是自动产生的,几乎没人来浏览一下它们,检查它们是否是健全的。

     

    2.6.x -mm kernel patches

    -------------------------------

    这些是具有实验性质的内核补丁,由Andrew Morton发布。Andrew负责收集所有的不同的子系统内核树和补丁,还有来自linux-kernel邮件列表中的已经被采纳的补丁,把它们集成在一块。这个内核树分支(--mm kernel tree)给内核的new feature和补丁提供试验场。一旦一个补丁在-mm内核树得到验证和采纳,Andrew或者子系统维护者会将这个补丁发送给Linus,最后集成到主内核中(mainline)

     

    我们鼓励并推荐新补丁在发送给Linus之前,应担在-mm内核树分支上进行测试和验证。

     

    -mm内核树分支不适于用于正常的用户系统上,因与稳定内核版本相比,它具有更多风险性。

    如果你愿意帮助内核开发过程做些事情,请测试和使用这些内核发布版本,如果你遇到任何问题,或者内核工作良好,请通过linux-kernel邮件列表提供你的反馈。

     

    除了包含所有试验性的补丁之外,这个内核分支也通常包含了适用于内核发布的-git内核分支的修改补丁。

     

    -mm内核分支没有固定的发布计划表,但通常情况下在每个–rc内核分支发布周期中会有几个-mm内核分支发布(通常是13个)。

     

    Subsystem Specific kernel trees and patches

    -----------------------------------------------------

    许多的不同内核子系统的开发者们开放了了他们的开发树,这样让其他的内核开发者能够明白内核不同的区域对功能特性。这些开发树将被加入到-mm内核分支进行测试和验证。

     

    下面是一些子系统内涵开发树的列表:

    git trees:

        - Kbuild development tree, Sam Ravnborg <sam@ravnborg.org>

           kernel.org:/pub/scm/linux/kernel/git/sam/kbuild.git

     

        - ACPI development tree, Len Brown <len.brown@intel.com>

           kernel.org:/pub/scm/linux/kernel/git/lenb/linux-acpi-2.6.git

     

        - Block development tree, Jens Axboe <axboe@suse.de>

           kernel.org:/pub/scm/linux/kernel/git/axboe/linux-2.6-block.git

     

        - DRM development tree, Dave Airlie <airlied@linux.ie>

           kernel.org:/pub/scm/linux/kernel/git/airlied/drm-2.6.git

     

        - ia64 development tree, Tony Luck <tony.luck@intel.com>

           kernel.org:/pub/scm/linux/kernel/git/aegl/linux-2.6.git

     

        - ieee1394 development tree, Jody McIntyre <scjody@modernduck.com>

           kernel.org:/pub/scm/linux/kernel/git/scjody/ieee1394.git

     

        - infiniband, Roland Dreier <rolandd@cisco.com>

           kernel.org:/pub/scm/linux/kernel/git/roland/infiniband.git

     

        - libata, Jeff Garzik <jgarzik@pobox.com>

           kernel.org:/pub/scm/linux/kernel/git/jgarzik/libata-dev.git

     

        - network drivers, Jeff Garzik <jgarzik@pobox.com>

           kernel.org:/pub/scm/linux/kernel/git/jgarzik/netdev-2.6.git

     

        - pcmcia, Dominik Brodowski <linux@dominikbrodowski.net>

           kernel.org:/pub/scm/linux/kernel/git/brodo/pcmcia-2.6.git

     

        - SCSI, James Bottomley <James.Bottomley@SteelEye.com>

           kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6.git

    其他的git内核开发树可以在http://kernel.org/git下找到。

    quilt trees:

        - USB, PCI, Driver Core, and I2C, Greg Kroah-Hartman <gregkh@suse.de>

           kernel.org/pub/linux/kernel/people/gregkh/gregkh-2.6/

     

    Bug Reporting

    -------------------

    Bugzilla.kernel.org是linux内核开发者用于追踪内核bug的网址。用户们被鼓励利用这个工具报告他们所发现的bug。关于kernel bugzilla对详细描述,请参考:

    http://test.kernel.org/bugzilla/faq.html

    在内核源码树主目录下的文档REPORTING-BUGS是个很好的报告内核bug的模板,它也详细地描述了内核开发者需要什么样的信息用来解决bug。

     

    Mailing lists

    ---------------

    正如上述文档所描述的,主要的核心内核开发者们加入Linux Kernel邮件列表。如何订阅和取消订阅这个邮件列表的描述请参考:

    http://vger.kernel.org/vger-lists.html#linux-kernel

    在web的许多不同的地方保存了这个邮件列表的归档。使用一个搜索引擎来找到这些归档。例如:

    http://dir.gmane.org/gmane.linux.kernel

    强烈建议在你想提问之前,搜索一下归档里的内容是否含有你所要的答案。许多问题已经被详细地讨论过了,它们存放在归档中。

     

    许多内核子系统的开发组有他们自己独立的邮件列表,来讨论他们针对自己子系统的开发问题。查看MAINTAINERS文件,获得不同开发组对应的各自的邮件列表。

     

    许多邮件列表被记录在www.kernel.org网站上,他们的信息也可以从下面网站获得:

    http://vger.kernel.org/vger-lists.html

     

    在使用这些邮件列表时,请记住遵循一个良好的行为习惯。下面的URL提供了一个简单的guideline告诉你如何和开发组的邮件列表进行有效交互:

    http://www.albion.com/netiquette/

     

    如果很多人回复你的mail,邮件的CC(接收者list)会变得很大。不要删除CC上的任何人,或者不要只回复发送者。习惯接收一封邮件两次,一次来自于发送者,一次来自于邮件群列表;不要搞个标新立异的邮件标题,开发者们不喜欢这样做。

     

    记住保证邮件内容和你的回复的完整性。在你的回复内容的上面保留“John Kernelhacker wrote …: “行,在你引用邮件内容的后面添加你的个人评论(或陈述)。

    如果你要在你的邮件里增加你的补丁,确保它们是清晰可读的text文本(参考Documentation/SubmittingPatches文档)。内核开发者不愿意处理邮件附件或者是压缩过的补丁;他们会在你的邮件里查看你的补丁时注上他们的评论。确保你使用的邮件程序不会导致邮件的内容空间混乱或者tab符的滥用。一个好的测试办法是首先你给自己发送邮件,然后试图使用邮件里的补丁是否可用。如果补丁不工作,你得修改你的邮件直到能够工作。

     

    综上所述,当你发邮件到时候,请记住要对其他的订阅者(包括内核开发者)表达你的尊重。

     

    Working with the community

    -------------------------------------

    内核社区的目标是最大可能的提供一个最好的内核。当你提交一个补丁让社区接受时,它将被从技术的优劣角度进行审查。所以,你期望的应当是什么?

    ----批评

    ----评论

    ----修改的请求

    ----辩护的请求

    ----沉默

     

    记住,这是让你的补丁进入内核过程中的一部分。你必须能够接受关于你的补丁的任何批评和评论,从技术的角度考虑这些批评和评论,重新修改补丁,或者提出清晰而简明的理由说明为什么补丁不能这样修改。如果你的邮件没有得到回复,请耐心等几天,然后重新尝试一次,有时由于巨大的邮件量会把你的邮件给淹没。

     

    你不应当做什么?

    ----期望你的补丁在没有任何异议下被接受

    ----防御别人的评论

    ----忽略别人的评论

    ----没有听取任何建议,重新提交你的原来的补丁。

     

    在社区里,追求的是使用最好的技术解决方案,通常有不同的建议关于让一个补丁工作得更好。你必须有合作精神,能够调整你的思路来适应更好的内核补丁方案修改,或者至少能够证明你的方案思路是有意义的。记住,一个事实证明错误的方案是可以原谅的,只要你愿意接受对的方案思路。

     

    你的第一个补丁提交后,你会得到记录你需要做某些更正修改的列表。这并不意味着你的补丁不能被接受,也不意味着社区反对你个人。你仅仅需要做的是,修改完这些问题,然后重新提交你的补丁。

     

    Differences between the kernel community and corporate structures

    ------------------------------------------------------------------------------------------

    内核社区的工作模式不同于那些传统公司的开发环境。下面是一些注意事项,你应当努力去学习这些事项,以避免额外的一些问题。

    关于你的被提议的修改,好的说法:

    --- “这个补丁能够解决很多问题”

    --- “这个补丁能够帮助删除2000行代码”

    --- “这个补丁正是我想要描述的修改”

    --- “这里有一些列小的补定。。。”

    --- “这个补丁会提高性能。。。”

     

    一些你需要避免的不好的说法:

    ---“我们在AIX/ptx/Solaris上对它进行测试过,所以它肯定好…”

    ---“我干这个已经20多年了,所以…”

    ---“这个补丁应用在我们企业的产品线上…”

    ---“这里有我的1000多页的设计文档,关于描述我的想法”

    ---“我做这个补丁已经有6个月的时间了…”

    ---“这里有一个5000行当补丁…”

    ---“我重写了当前的所有的混乱的代码,它是…”

    ---“我有一个最终期限,这个补丁需要现在能被接受”

     

    内核社区区别于传统软件工作环境的另外一个不同之处在于内核开发者不用面对面的交互。使用邮件和在线聊天工具作为开发者沟通的主要形式,好处是不会存在性别歧视。Linux内核工作环境接受女人和少数民族进行开发,因为标记你的仅仅是一个邮件地址。国际化的视角让大家处于同一个公平的运动场内(没有任何歧视行为),因为你通过一个开发者的网民无法猜测到他的性别。一个man也许会取名Andrea,而一个woman也可以取名Pat。绝大部分为Linux内核工作的妇女,已经表达了她们的良好的经历。

     

    对于一些不熟悉English的人来说,语言的障碍会带来一些问题。掌握好English是必须的,这样你才可以在邮件里把你的思路描述得清楚。建议你在发送邮件之前,确认你的邮件用英文描述得很清楚。

     

    Break up your changes

    ------------------------------

    Linux内核社区不乐意一次接受一大块代码,内容较大的修改需要进行适当的介绍,讨论,然后划分为细小的比较独立的若干部分。这种做法与传统公司截然相反。你的提议应当在开发过程的早期介绍给大家,这样你可以得到内核社区的及时反馈,也使得社区知道你一直在为这个提议工作,而不是认为你只是简单得为你自己完成的补丁做推销(倾销)。然而,不要一次在邮件列表里发送50封邮件,你的补丁系列邮件应当总是小于这个数目。

     

    这种“分拆大补丁”的方法有如下几个理由:

     

    1)  

    小补丁更容易被内核社区接受,因为他们不需要花费太多的时间或精力去验证或修正。一个5行当补丁也许被内核维护者在几秒内的浏览后就接受。然而,一个500行当补丁也许要花好几个小时进行审查和修订(审查时间随着代码量的增长是指数级的增长)。

    小补丁也非常容易调试,当你发现哪出错了。与大块头补丁比起来,你很容易通过摘掉一个个小补丁来定位出错的位置。

     

    2)

    不仅发送小补丁很重要,而且在提交它们之前简化它们也很重要。

    这里是内核开发者Al Viro的观点:

    “想象一个数学老师评判一个学生的作业的情况。老师并不想看到学生在提出一个解答方案之前的草稿(上面有各种尝试和错误)。老师想看到是一个干净的非常优雅的解答方案。一个优秀的学生知道这一点,所以他不会把草稿(不是最终方案)交给老师。

     

    对于内核开发道理同样。内核维护者和审查者并不想看你解决问题过程中的思路活动,而是想看你提供的最终的简洁而又优雅的解决方案。”

     

    要在你给出一个优雅的解答方案和与社区一起工作来讨论你的未完成工作之间做出一个平衡,也许很有挑战性。好的做法是,在开发过程的早期尽可能地得到反馈,来改进你的工作,同时保持你的补丁比较小,即使你的整个完成任务还没有准备就绪。

     

    当然你也得认识到发送的补丁里不可能包含这样的信息:“当前还没有完成,以后再做。”

     

    Justify your change

    -------------------------

    当你拆分了你的大补丁后,你必须让内核社区明白为什么要加入你的修改。New features必须被证明是需要的和有用的。

     

    Document your change

    -------------------------------

    当发送你的补丁的时候,你需要在你的邮件里写一些关于补丁的必要信息。这些信息会成为补丁的ChangeLog,并且永久保存下来提供给给个需要的人。这些信息应当包括:

    ---为什么修改是必需的

    ---简要的补丁设计思路

    ---实现细节

    ---测试结果

     

    关于这些信息的详细描述,请参考文档:”The Perfect Patch”

    http://www.zip.com.au/~akpm/linux/patches/stuff/tpp.txt

     

    上述的所有关于内核开发的行为,有时候很困难做到。这将需要数年使这些实践行为完美。大量不断的的实践和决定也在不断地改进内核开发行为。但是不要放弃,一切皆有可能。很多人(内核开发者)已经付诸了大量的实践,而你们(新手)也在此开始踏上内核开发之旅。


    http://www.cppblog.com/flyonok/archive/2011/04/15/144316.html

    其它参考资料:

    http://tonybai.com/2012/03/27/how-to-participate-linux-community-section-1/

    http://www.linuxfoundation.org/content/how-participate-linux-community-0

    展开全文
  • 翻译这篇文章的时候,我也想过可能会有高手说,内核开发用vi就足够了,还用什么eclipse,当然对于内核中函数特别了解的人确实如此,但是对于新 手,每使用一个函数,就要去查找一下函数的定义,实在是非常浪费时间的...
      翻译这篇文章的时候,我也想过可能会有高手说,内核开发用vi就足够了,还用什么eclipse,当然对于内核中函数特别了解的人确实如此,但是对于新 手,每使用一个函数,就要去查找一下函数的定义,实在是非常浪费时间的工作,本文将介绍如何利用Eclipse这个强大的IDE开发环境进行Linux内 核开发。

          首先你应该有一个简单的内核模块工程,至少包含一个Makefile和一个c源文件。
    1. 启动Eclipse,选择File->C Project创建一个C工程


    2. 创建一个空的Makefile工程。选择 Makefile Project->Empty Project,并且选择Linux GCC,为工程娶个名字。


    3. 点击Next,然后点击Advance Settings,进入到工程属性设置界面。


    4. 选择C/C++ build节点并且打开Behaviour面板,勾选上Build on Resource Save,这样可以在每次保存的时候都自动编译整个工程。


    5. 选择字节点 Enviromment,添加一个新的环境变量,取名为TERM,值设置为xterm(注意大小写)。并且勾选上"add to all configurations"。


    6. 然后选择 C/C++ Ceneral下面的Path and Symbols节点,选择GNU-C添加一个新的include path指向内核头文件目录,也必须保证勾选上'add to all configurations'.


    7. 重复步骤6,把板子(boards mach)的头文件目录添加进来.


    8. 选择Symbols面板,添加Symbols for GNU-C,名字必须是__KERNEL__值不用填。这是为了保证printk和其他模块等相关的东西不生成警告信息。


    9. 执行完前面8个步骤,点击OK回到上一个对话框窗口,然后点击Finish按钮。


    10. 选择我们已经创建好的工程,然后右键Import导入以前写的Helloworld模块。


    11. 在弹出的窗口中选择General->File System,然后点击下一步。


    12. 选择原来hello world和Makefile的位置。然后只选择Makefile和源代码文件,获者其他你必须的文件,然后点击Finish按钮。


    13. 现在已经准备好了,唯一要做的就是创建和编译makefile里面的目标,一般需要clean和all这两个目标。右键选择Target Make,创建clean和all这两个目标,这两个实际上是定义在makefile中的,你可以添加更多你定义在makefile中的目标。双击某个目标的图标就可以编译这一个目标。


    两个目标的创建


    14. 现在你已经完成了配置,正如你看到的一样,你现在已经能够查找到一个结构体的所有成员了,当然还有更多。


    15. 配置Eclipse只是显示你指定的头文件目录,右键工程属性,然后选择discovery mode节点 like in the screenshot below.设置discovery为 'GCC per file scanner'。

    有趣吧,你现在已经可以用非常强大的Eclipse开发Linux内核了。
    展开全文
  • archlinux内核开发

    千次阅读 2016-10-15 18:16:48
    archlinux内核开发前文介绍了如何安装archlinux,这里主要对archlinux内核修改/定制进行介绍。(因为自己写模块问题,模块编译入内核,但一直没执行,以为内核没更新到,由于国内运行archlinux的机器少,对内核开发...

    archlinux内核开发

    前文介绍了如何安装archlinux,这里主要对archlinux内核修改/定制进行介绍。(因为自己写模块问题,模块编译入内核,但一直没执行,以为内核没更新到,由于国内运行archlinux的机器少,对内核开发的更少,没地方交流,中间卡了2天时间,希望对修改内核的开发者有帮助,少走弯路。)

    ABS安装官方内核

    ABS介绍见官方WIKI,我们将用它来制作内核安装包。
    - 安装ABS工具

    pacman -S abs
    • 获取ABS目录树
    abs
    • 创建archlinux工作目录,并将ABS同步下来的包放到该目录下
    mkdir ~/archlinux
    cp /var/abs/core/linux ~/archlinux/
    ///archlinux/linux文件内容如下
    //补丁文件:change-default-console-loglevel.patch
    //kernel的配置文件:config  config.4.8  config.x86_64  config.x86_64.4.8  
    //安装脚本:linux.install
    //mkinitcpio配置文件,mkinitcpio是制作initrd的工具:linux.preset  
    //制作包的主脚本:PKGBUILD
    • 制作ABS安装包
    makepkg -s
    //这一步会根据PKGBUILD脚本中的"source"字段的地址去下载linux源码,时间非常长。如果手上有LINUX源代码可以修改PKGBUILD脚本来用本地代码进行制包,后续的错误也可以通过手动修改PKGBUILD来避开。

    错误1:缺少依赖

    ==> Making package: linux 4.7.6-1 (Sat Oct 15 17:42:03 CST 2016)
    ==> Checking runtime dependencies...
    ==> Checking buildtime dependencies...
    warning: no 'XferCommand' configured
    ==> Missing dependencies:
      -> xmlto
      -> docbook-xsl
      -> kmod
      -> inetutils
      -> bc
      -> libelf
    ==> ERROR: Could not resolve all dependencies.

    解决办法

    //打开PKGBUILD脚本文件,把依赖注释掉,去掉此部分不会影响生成,只是文档相关的。
    #makedepends=('xmlto' 'docbook-xsl' 'kmod' 'inetutils' 'bc' 'libelf')

    错误2:makepkg错误

    oeh@EMVR-R1:~/archlinux/linux$ makepkg -s
    ==> Making package: linux 4.7.6-1 (Sat Oct 15 17:02:07 CST 2016)
    ==> Checking runtime dependencies...
    ==> Checking buildtime dependencies...
    ==> Retrieving sources...
      -> Found linux-4.7.tar.xz
      -> Found linux-4.7.tar.sign
      -> Found patch-4.7.6.xz
      -> Found patch-4.7.6.sign
      -> Found config
      -> Found config.x86_64
      -> Found linux.preset
    ==> Validating source files with sha256sums...
        linux-4.7.tar.xz ... Passed
        linux-4.7.tar.sign ... Skipped
        patch-4.7.6.xz ... Passed
        patch-4.7.6.sign ... Skipped
        config ... Passed
        config.x86_64 ... Passed
        linux.preset ... Passed
    ==> Verifying source file signatures with gpg...
        linux-4.7.tar ... FAILED (unknown public key 79BE3E4300411886)
        patch-4.7.6 ... FAILED (unknown public key 38DBBDC86092693E)
    ==> ERROR: One or more PGP signatures could not be verified!

    解决办法

    //编译时先忽略签名
    makepkg --skippgpcheck -s

    错误3:找不到补丁文件

    patch: **** Can't open patch file /home/oeh/archlinux/linux/src/change-default-console-loglevel.patch : No such file or directory
    ==> ERROR: A failure occurred in prepare().
        Aborting...

    解决办法

    //手动拷贝补丁文件到指定目录
    oeh@EMVR-R1:~/archlinux/linux$ cp ~/archlinux/linux/change-default-console-loglevel.patch /home/oeh/archlinux/linux/src/

    编译成功后,将在PKGBUILD同级目录下生成安装包文件”linux-4.7.6-1-x86_64.pkg.tar.gz”,”linux-headers-4.7.6-1-x86_64.pkg.tar.gz”.

    //在目标板上安装内核包
    pacman -U linux-headers-4.7.6-1-x86_64.pkg.tar.gz
    pacman -U linux-4.7.6-1-x86_64.pkg.tar.gz

    基于官方内核定制/修改

    内核定制一般可以分为直接编译入内核和模块加载两种方式.
    - 编译入内核

    1.修改内核代码
    2.生成bzImage:
    make bzImage
    3.拷贝bzImage到目标板的/boot目录下:
    cp arch/x86_64/boot/bzImage /boot/vmlinuz-linux
    4.制作initrd:
    mkinitcpio -p linux
    5.重启后就是新内核了:reboot
    • 模块加载
    1.修改模块代码
    2.修改安装目录:
    export INSTALL_MOD_PATH=./libmodules
    3.生成模块:
    make modules_install
    4.将生成的模块(*.ko)文件复制拷贝到目标板的/lib/modules/kernelversion目录中-ARCH即可

    后记

    搞好后,写下来感觉没什么内容,但自己在搞的时候过程是痛苦的,搞过之后学习到的东西也挺多的,archlinux的WIKI真的很棒,推荐这几个相关的链接:

    • arch_boot_process
      搞的过程中,经常把机器搞死了,搞清楚这里的流程后处理起来就方便很多。
    • mkinitcpio
      制作init ram disk的工具,碰到不少问题,如果在制作initrd有问题时,可以把这个脚本的源码跟了一下。
    • ABS:arch build system
      arch很有特色的安装系统,当然还有PKGBUILD
    展开全文
  • 鸿蒙内核开发概述

    千次阅读 2020-09-18 15:00:51
    第一章 鸿蒙内核开发概述 1.1 鸿蒙系统有哪些内容? 鸿蒙系统,就相当于一套完整的PC软件系统。 Windows里含有: 简单地说,鸿蒙系统里含有 ① 电脑一开机,那些界面是谁显示的?是BIOS,它做什么?一些...
  • windows内核开发笔记八:内核开发回调函数基本介绍和基本使用场景 1.回调函数基本定义- 函数指针 要理解回调函数,首先要理解函数和函数指针,通俗点儿说,函数指针是一个指向特定函数的指针。函数的类型由其...
  • Linux 内核开发

    千次阅读 2018-11-08 23:27:35
    Linux 内核开发 简介 如你所知,我从去年开始写了一系列关于 x86_64 架构汇编语言程序设计的博文。除了大学期间写过一些 Hello World 这样无实用价值的程序之外,我从来没写过哪怕一行的底层代码。那些程序也...
  • 编写Java程序调用内核模块 功能为向内核模块虚拟设备写字符串,再从内核模块虚拟设备读出字符串长度。 编译加载内核模块 见《 Android内核开发 Linux C编程调用内核模块设备驱动》
  • 这里所说的“Linux内核开发”仅仅是指嵌入式Linux产品开发中内核和驱动相关开发工作,与Linux所领导的内核开发团队的内核开发有很大不同。 俗话说“工欲善其事,必先利其器”,面对几百兆的Linux内核代码...
  • 1.由于项目需求,需要更改内核版本并搭建内核开发环境。 当前内核版本 指定内核版本:3.10.0-327.el7.x86_64 2.下载指定内核rpm安装包 下载地址:...
  • 而且没有原生linux版本,要是想在纯linux环境下进行linux驱动开发,就只能wine+Source insight,而wine版的不好用容易卡死而且cpu占用还高,我就想到用开源跨平台的vscode进行linux内核开发,体验能否和source ...
  • 配置交叉编译环境见《Android内核开发 Goldfish Linux Kernel编译及安卓虚拟机测试》 Makefile文件 注意Linux kernel源码目录需要提前编译,否则内核模块会编译出错。
  • Android内核开发 学习笔记

    千次阅读 2017-02-27 09:20:10
    Android内核开发:序Android内核开发:开发板选购Android内核开发:理解和掌握repo工具下载manifest仓库 repo init -u https://android.googlesource.com/platform/manifest 如果要选择特定版本的Android源码,...
  • Linux内核开发概述

    2014-09-23 15:32:26
    Linux内核开发不同于用户kon
  • linux内核开发

    千次阅读 2021-01-28 14:42:51
    内核编程常常看起来像是黑魔法,而在亚瑟 C 克拉克的眼中,它八成就是了。Linux内核和它的用户空间是大不相同的:抛开漫不经心,你必须小心翼翼,因为你编程中的一个bug就会影响到整个系统。浮点运算做起来可不容易...
  • 在尝试内核开发之前,需要对内核有个整体的了解。 主要内容: 获取内核源码内核源码的结构编译内核的方法内核开发的特点   1. 获取内核源码 内核是开源的,所有获取源码特别方便,参照以下的网址,...
  • Linux内核开发的特点

    千次阅读 2015-03-21 18:55:31
    Linux内核开发的特点  相对于用户空间内的应用程序开发,内核开发存在很多的不同,最重要的差异包括以下几种:  1)内核编程时不能访问C库。  2)内核编程时必须使用GNU C。  3)内核编程时缺乏像用户空间...
  • 如何参与Linux内核开发以及开发经验

    千次阅读 2013-11-13 22:26:52
    如何参与Linux内核开发 --------------------- 这是一篇将如何参与Linux内核开发的相关问题一网打尽的终极秘笈。它将指导你 成为一名Linux内核开发者,并且学会如何同Linux内核开发社区合作。它尽可能不 包括任何...
  • UNIX内核(5):内核开发的特点

    千次阅读 2013-05-14 21:50:10
    内核开发不是洪水猛兽。一旦你了解到其中的规则,你就会发现,跟开发应用程序一样;两者区别在于要遵守的规则集合不一样。 Linux是UNIX家族的一员,而且其内核源代码唾手可得,因此这里用其来作说明。 规则上...
  • CefSharp是用chromium内核开发的.net版本浏览器工具。目前只支持X86模式。所以在调试的时候要把平台改为X86 CefSharp开发指引:...
  • OVERLAPPED结构体详解 typedef struct _OVERLAPPED {  DWORD Internal;  DWORD InternalHigh;  DWORD Offset;  DWORD OffsetHigh;...它指定一个独立于系统的状态,当GetOverlappedResult函数返回时没有设置扩展错误...
  • postgresql内核开发之HelloWorld入门

    千次阅读 2016-11-27 21:30:04
    postgresql内核开发从哪开始?如何在postgresql内核增加新功能?本文给大家来个postgresql版的HelloWorld!
  • 使用QtCreator进行Linux内核开发

    千次阅读 2016-03-09 13:02:46
    配置QtCreator进行Linux内核开发
  • postgresql内核开发之add_months函数实战

    千次阅读 2016-12-03 17:29:09
    postgresql内核开发之add_months函数实战 前文通过实现helloworld,简单上手postgresql内核开发。 本文承接上文,通过在postgresql内核中实现oracle内置函数add_months进一步揭示postgresql内核开发中添加内置函数...
  • 本文是《Android内核开发》系列的第八篇文章,本文主要关注如何分析Android系统的启动log,学会通过搜索重要的TAG标签,找到Android启动过程中的重要节点。要学会分析系统的启动log信息,首先得了解Android系统的...
  • 搭建内核开发调试环境

    千次阅读 2013-03-15 22:43:57
    闲来无事, 总结一下内核开发调试环境的搭建过程, 希望能对和我一样的内核新手们有所帮助. 方案 我的测试系统在QEMU中运行, Host和Guest的架构都是x86_64, 用Busybox生成的initrd做为根文件系统, KGDB做为调试器. ...
  • 内核开发指南 如何为内核打补丁

    千次阅读 2010-12-29 18:52:00
    这是内核开发中最基本的工作。 patch(补丁)就是存放着不同版本之间差异的文件。通过打补丁的方法升级源代码,可以不用下载整个源代码 详细的打补丁的方法可以查看内核/Document/applying-patchs。txt...
  • 学完C语言之后,最终是要应用到某个领域的,比如后端开发,应用开发或者Linux内核开发等。本文将介绍一下Linux内核相关的内容,Linux内核开发是相对比较难的领域,主要是门槛相对较高。虽然门槛较高,但有它的好处,...
  • Linux内核开发特点: 内核编程时不能访问标准C库;内核编程时必须使用GNU C;内核编程时缺乏像用户空间那样的内存保护机制;内核编程时浮点数很难使用;内核只有一个很小的定长堆栈;由于内核支持异步中断,抢占...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 48,799
精华内容 19,519
关键字:

内核开发