•  步骤: 1、安装Cygwin官方版,然后选择安装一下包:  安装gcc-core、make、perl、gettext、libelf-devel、libgmp-devel、gettext, libelf-devel, libgmp-devel, libmpc-devel, libmpfr-devel, zlib-devel...
    

    步骤:

    1、安装Cygwin官方版,然后选择安装一下包:

        安装gcc-core、make、perl、gettext、libelf-devel、libgmp-devel、gettext, libelf-devel, libgmp-devel, libmpc-devel, libmpfr-devel, zlib-devel、libncurses-devel

    2、从cygwinports安装交叉编译工具
        linux-i686-binutils(linux-x86_64-binutils)和linux-i686-gcc-core(linux-x86_64-gcc-core)

    3. 编译内核 

        配置: make ARCH=x86_64 CROSS_COMPILE=x86_64-pc-linux-gnu- O=_build nconfig

         编译:

    4、打包安装:

        API头文件: make headers_install

        内核:make install

        模块: make modules_install


    展开全文
  • 自己动手编译Linux内核 自己动手编译Linux内核 整理了一下Linux内核编译的方法,原始内核版本为Linux-2.4.20.8,新内核版本为Linux-2.4.22,其它内核版本编译方法类似。
  • 解压后默认的文件夹位置是D:\Linux-0.11,如果你不是将文件解压到该目录, 你要修改MinGW32目录的MinGW32.bat文件,将里面的PATH指向MinGW32的bin目录. 2). 打开Linux-0.11目录,双击MinGW32.bat快捷方式,...

    编译过程:

    1). 解压后默认的文件夹位置是在D:\Linux-0.11,如果你不是将文件解压到该目录下,

    你要修改MinGW32目录下的MinGW32.bat文件,将里面的PATH指向MinGW32的bin目录.

    2). 打开Linux-0.11目录,双击MinGW32.bat快捷方式,打开控制台.

    3). make 一下,生成1.44M的Boot.img软盘镜像,要清除编译结果请"make clean"

    4). 如果安装了bochs,直接双击bochsrc.bxrc即可运行Linux-0.11了.

    5). 也可用其它虚拟机加载Boot.img后运行,如果出现Kernel panic,请把虚拟机里的硬盘删了

    6). 在出现Insert root floppy and press ENTER以后,将rootimage-0.11.img载入虚拟软驱,回车

    这就是能在windows环境下编译的Linux 0.11了,不是在Cygwin,也不是在虚拟机里,而是使用MinGW.

    下面是在Windows下编译Linux 0.11会遇到的问题和对原文件作的修改:

    1.赵炯博士已经将汇编程序中引用的C变量(包括嵌入汇编的C变量)的下划线去掉了,但MinGW的gcc可能是为了与其它Windows下的编译器保持兼容,并不能识别这些不带下划线的C变量,因而还得把原先已经在汇编程序中去掉下划线的C变量加上下划线,同时也要把被C程序引用的汇编程序中的变量加上下划线.

    2.MinGW中不带as86编译器,因而把boot目录下原先用as86编译的bootsect.s和setup.s两个程序修改成能用nasm编译的程序.并且更名为bootsect.asm和setup.asm.

    3.在Makefile作的主要修改:

    在LDFLAGS中加了--image-base 0x0000 将elf_i386改成i386pe

    将cd 与 make 之间的;改成&,如cd kernel ; make 改成cd kernel & make

    MinGW中没有sync这个程序,可以把它注释掉,更简单的办法是写一个sync.c,这个sync.c只包含一个空的main函数,编译成sync.exe

    因为类似的原因,make dep会出错

    4.生成的system文件是PE格式的(PE是Portable Executable的简称),这是windows下的可执行文件的格式,显然是不能直接执行的,必须加以转化.我实现了通过两种方式加以转化.

    1)写一个程序Trans.cpp将system.exe里的代码和数据从PE文件里解析出来,生成一个system.bin文件,这个文件是能被setup模块直接加载的.我已经将这个程序放在了Linux-0.11的tools目录下,要微软的编译器编译.

    2)自己写一个PE Loader,这种方式比较麻烦,但是想想自己也能做一个PE Loader,还是满有成就感的,尽管这是一个最简单的Loader.代码是加在Linux-0.11-With-PE-Loader\boot目录下的setup.asm文件里,里面有详细的注释.

    5.对tools下的build.c作了修改,使其能生成可引导的1.44M的软盘镜像文件Boot.img

    6.在Link的过程中,init目录下的main.c会出现以下错误:

    boot/head.o(.text+0x540c):fake: undefined reference to `_main'

    init/main.o(.text+0x16f):main.c: undefined reference to `_alloca'

    init/main.o(.text+0x174):main.c: undefined reference to `__main'

    make: *** [tools/system.exe] Error 1

    第一个和最后一个错误还好理解,但中间那个错误那就莫明其妙了,因为Linux 0.11根本没有这个函数,在gcc的编译选项里也有-nostdinc .有一个解释是main函数不是一个普通的函数,MinGW gcc会对它作特殊的处理.解决的办法其实也很简单,把main.c下面的main函数改名为_main,或者是干脆把它改成另外一个函数,就改成start吧.记得把head.s里的_main也改了.

    在最后,要感谢《自己动手写操作系统》的作者于渊,其实我也是先将原先只能在Linux下编译的书里源代码用MinGW移植到Windows下编译的过程中才试着在Windows下编译Linux 0.11源代码的,有了在Windows下编译Linux 0.11源代码的经验,移植高版本的源代码,像0.12,0.95,0.96等等版本应该不会有太大的麻烦了。

    也要感谢Linux内核完全注释的作者赵炯博士,是他拉接了操作系统与操作系统爱好者的距离.

    最后,我也非常想和操作系统爱好者们共同交流心得体会,也希望能多认识一些朋友.

    我的网名:flyfish

    我的QQ:785606288

    E-mail:I2CBus@126.com

    另外,要转载请保持本文件的完整性,请尊重别人的劳动果实.

    修改日志:

    08/3/29

    修改了一下Makefile,旧的Makefile在某些文件更新后还会重新编译。

    修改了Trans.cpp中的一个dug,该dug在translate MinGW gcc编译的程序时可能会出错。用MinGW gcc 编译的程序的VirtualAddress的形式可能是0xFFC1000这样的形式,其实0x1000才是它的VirtualAddress

    08/4/2

    修改了下MinGW32.bat,现在已经不用重设路径了。

    08/4/4

    Trans.cpp还是有错,如果VirtualAddress>0xffff,那么生成的system.bin就错了,bochs调试时会一直重启。

    权宜之计,把0xffff再改成0x3ffff,这样VirtualAddress就不能大于0x3ffff,不知谁有更好的解决方法,

    展开全文
  • 买的笔记本CPU非常不济,在win7虚拟机上面跑起来很慢,特别是编译大的软件,慢的让人无法忍受,现在新工作是部门linux下的首席开发(部门现在我是唯一专职linux下软件开发,哈哈哈),所以尝试在linux下装双系统,...

    买的笔记本CPU非常不济,在win7虚拟机上面跑起来很慢,特别是编译大的软件,慢的让人无法忍受,现在新工作是部门linux下的首席开发(部门现在我是唯一专职linux下软件开发,哈哈哈),所以尝试在linux下装双系统,直接利用硬件来跑linux,提高性能,下面是折腾的一些心得,分享给大家。


    1.分区不能多于3个,一个还要留给linux,我也还没摸索出来其他办法,否则分区就要失败。

    2.编译的时候主要消耗的资源是CPU所以一定要加上make -j5选项,我的CPU是双核的,j后面参赛的计算方法是CPU核数*2+1.

    3.如果报warning: clock skew detected,你调整下时间 date -s 06/18/2013 和 date -s 12:14:50,再编译就ok了,否则编译错误一大堆。

    5.要搞清楚自己的驱动,默认情况好像没有无线网卡的驱动,你在make xconfig里面要认真选。


    展开全文
  • Ubuntu下编译linux内核

    2016-12-31 19:41:14
    vmlinuz是可引导的、压缩的内核。“vm”代表“Virtual Memory”。Linux 支持虚拟内存,不像老的操作系统比如DOS...一是编译内核时通过“make zImage”创建,然后通过:“cp /usr/src/linux-2.4/arch/i386/linux/boot

    1.概念解释

          vmlinuz是可引导的、压缩的内核。“vm”代表“Virtual Memory”。Linux 支持虚拟内存,不像老的操作系统比如DOS有640KB内存的限制。Linux能够使用硬盘空间作为虚拟内存,因此得名“vm”。vmlinuz的建立有两种方式。一是编译内核时通过“make zImage”创建,然后通过:“cp /usr/src/linux-2.4/arch/i386/linux/boot/zImage /boot/vmlinuz”产生。zImage适用于小内核的情况,它的存在是为了向后的兼容性。二是内核编译时通过命令make bzImage创建,然后通过:“cp /usr/src/linux-2.4/arch/i386/linux/boot/bzImage /boot/vmlinuz”产生。bzImage是压缩的内核映像,需要注意,bzImage不是用bzip2压缩的,bzImage中的bz容易引起误解,bz表示“big zImage”。 bzImage中的b是“big”意思。

    vmlinux  编译出来的最原始的内核文件,未压缩。

    zImage   是vmlinux经过gzip压缩后的文件。

    bzImage bz表示“big zImage”,不是用bzip2压缩的。两者的不同之处在于,zImage解压缩内核到低端内存(第一个640K),bzImage解压缩内核到高端内存(1M以上)。如果内核比较小,那么采用zImage或bzImage都行,如果比较大应该用bzImage。

    uImage   U-boot专用的映像文件,它是在zImage之前加上一个长度为0x40的tag。

    vmlinuz  是bzImage/zImage文件的拷贝或指向bzImage/zImage的链接。

    initrd   是“initial ramdisk”的简写。一般被用来临时的引导硬件到实际内核vmlinuz能够接管并继续引导的状态。

    2.编译选项

    在内核源代码目录下执行以下步骤:

    1."make mrproper", 清理源代码目录, 对于刚下载的内核, 可省略该步骤

    2."make menuconfig", 直接保存默认配置即可(一般默认配置就是发行版的默认配置), 也可根据需要修改相关配置.

    3."make dep", 检查模块间的依赖关系

    4."make bzImage", 编译内核

    5."make modules", 编译模块

    6."sudo make modules_install", 安装模块 //将编译好的内核模块从内核源代码目录copy到/lib/modules下,可以查看Makefile文件看其究竟做了什么事情

    7."sudo make install", 安装内核

    8."sudo mkinitramfs 2.6.32.56+drm33.22 -o /boot/initrd.img-2.6.32.56+drm33.22", 安装initramfs; "2.6.32.56+drm33.22"为内核版本号

    9.修改grub启动设置, 在ubuntu上, 如无特殊需求, 执行"sudo update-grub"即可; 也可手动修改/boot/grub/menu.lst文件或/boot/grub/grub.cfg文件.

    3.具体编译与启动步骤

    ①去www.kernel.org 下载源码并解压,我下载的是3.12.68版本,最近更新日期是2016.11.29,能满足需求。我是通过共享文件夹的方式让Ubuntu虚拟机与win7共享源码,这样既可以直接在虚拟机中编译,又可以在win7上用sourceinsight阅读与修改源码。共享文件夹默认挂在在/mnt/hgfs/xxx下。

    ②如果已经安装了必须的库(见我另一篇博文点击打开链接),则make menuconfig可以正常看到配置界面。为了节约时间,将当前正在使用的Linux的配置文件拷贝到源码目录下,并改名为.config。

    cp /boot/config-3.11.0-15-generic ./

            mv config-3.11.0-15-generic .config


    有了.config文件之后,执行make menuconfig,然后Load目录下的.config文件,如果想要自己定制一些模块,则可以进行修改,修改选项有Y 、N 和M,可以只把Linux内核启动必需的模块编译到内核中,其它的可以选择M或N。其中:

       y: 模块驱动编译到内核中,启动时自动加载

       m:模块会被编译,但是不会被编译到内核中,只是生成.o文件,我们可以收集这些.o文件做到Linux的文件系统中,然后用insmod实现动态加载。

    (3)make -j4 进行编译

            make命令默认的执行的是:make bzlmage和make modules

        模块的编译

       模块一般用来支持那些不经常使用的功能。例如,通常情况下你仅使用拨号网络,因此网络功能并不是任何时候都需要的,那么就应该使用可装入的模块来提供 这个功能。仅在你进行拨号联接的时候,该模块才被装入。而在你断掉连接的时候它会被自动卸下。这样会使内核使用内存的量最小,减小系统的负荷。 
      当然,那些象硬盘访问这样时时刻刻都需要的功能,则必须作在内核里。如果你搭一台网络工作站或web服务器,那么网络功能是时刻都需要的,你就应该考 虑把网络功能编译到内核里。另外一个方法是在启动的时候就装入网络模块。这种方法的优点是你不需要重新编译内核。而缺点是网络功能不能特别高效。 

     如果要以手工的方式加载模块, 建议最好使用 modprobe, 因为它可以解决模块之间的依赖性问题。

     关于精简内核可以查看menuconfig配置解析

    (4)安装

           make modules_install   安装模块,会在/lib/modules下生成3.12.68的文件夹,里面存放着新内核的所有可加载模块,这一步不可缺少,否则后面的make install会有问题。

         make install   安装内核,复制内核目录内的.config,vmlinuz,initrd.img,System.map文件到系统/boot目录、更新grub。


         重启系统即发现grub启动项中有了刚刚编译生成的linux系统了。需要注意Linux发行版与内核的关系,我们在上面将不同的Linux内核都安装到了/boot下,但是他们使用的是同一套发行版即Ubuntu12.04LTS,内核是系统核,发行版是每个社团增加了外围资源(比如用户界面,系统安装,程序更新),所以发行版和内核是可以任意搭配的,但发行版采取的各种用户应用方式可能不同,其实本质是一样的,就是内核定制+驱动定制+应用定制,版本号只是用来标识而已。


    展开全文
  • 真正能windows下编译linux 0.11,不是Cygwin,也不是虚拟机里! 2008年09月18日 星期四 21:30 一、简介  这就是能windows环境直接编译Linux 0.11了,不是Cygwin,也不是虚拟机里,而是...
    真正能在windows下编译的linux 0.11,不是在Cygwin,也不是在虚拟机里!
    2008年09月18日 星期四 21:30
    一、简介  
    这就是能在windows环境下直接编译的Linux 0.11了,不是在Cygwin,也不是在虚拟机里,而是使用MinGW gcc,
    这是GNU gcc在Windows下的移植版本.在oldlinux上的论坛看见有许多人在问怎样在Windows下直接编译,
    最佳答案应该是使用Cygwin,现在看来这个最佳答案该改了。本编译环境源代码加上gcc编译器压缩后才4.2兆。
    二、编译过程:

    1.   解压后默认的文件夹位置是在D:\Linux-0.11,如果你不是将文件解压到该目录下,
        你要修改MinGW32目录下的MinGW32.bat文件,将里面的PATH指向MinGW32的bin目录.
    2.   打开Linux-0.11目录,双击MinGW32.bat快捷方式,打开控制台.
    3.   make 一下,生成1.44M的Boot.img软盘镜像,要清除编译结果请"make clean"
    4.   如果安装了bochs,直接双击bochsrc.bxrc即可运行Linux-0.11了.
    5.   也可用其它虚拟机加载Boot.img后运行,如果出现Kernel panic,请把虚拟机里的硬盘删了
    6.   在出现Insert root floppy and press ENTER以后,将rootimage-0.11.img载入虚拟软驱,回车


    三、在Windows下编译Linux 0.11会遇到的问题和对原文件作的修改:

    1.赵炯博士已经将汇编程序中引用的C变量(包括嵌入汇编的C变量)的下划线去掉了,但MinGW的gcc可能是为了与其它Windows下的编译器
       保持兼容,并不能识别这些不带下划线的C变量,因而还得把原先已经在汇编程序中去掉下划线的C变量加上下划线,同时也要把被C程序
       引用的汇编程序中的变量加上下划线.

    2.MinGW中不带as86编译器,因而把boot目录下原先用as86编译的bootsect.s和setup.s两个程序修改成能用nasm编译的程序.
       并且更名为bootsect.asm和setup.asm.

    3.在Makefile作的主要修改:
       在LDFLAGS中加了--image-base 0x0000   将elf_i386改成i386pe
       将cd 与 make 之间的;改成&,如cd kernel ; make 改成cd kernel & make
       MinGW中没有sync这个程序,可以把它注释掉,更简单的办法是写一个sync.c,这个sync.c只包含一个空的main函数,编译成sync.exe
       因为类似的原因,make dep会出错

    4.生成的system文件是PE格式的(PE是Portable Executable的简称),这是windows下的可执行文件的格式,显然是不能直接执行的,
       必须加以转化.我实现了通过两种方式加以转化.
    1)写一个程序Trans.cpp将system.exe里的代码和数据从PE文件里解析出来,生成一个system.bin文件,这个文件是能被setup模块
       加载的.我已经将这个程序放在了Linux-0.11的tools目录下,要微软的编译器编译.
    2)自己写一个PE Loader,这种方式比较麻烦,实现原理却和Trans.cpp差不多,只是要用汇编来写.
       但是当Linux-0.11真的能运行的时候,还是满有成就感的.
       尽管这是一个最简单的Loader.代码是加在Linux-0.11-With-PE-Loader\boot目录下的setup.asm文件里,里面有详细的注释.

    5.对tools下的build.c作了修改,使其能在windows下生成可引导的1.44M的软盘镜像文件Boot.img

    6.在Link的过程中,init目录下的main.c会出现以下错误:
    boot/head.o(.text+0x540c):fake: undefined reference to `_main'
    init/main.o(.text+0x16f):main.c: undefined reference to `_alloca'
    init/main.o(.text+0x174):main.c: undefined reference to `__main'
    make: *** [tools/system.exe] Error 1
    第一个和最后一个错误还好理解,但中间那个错误那就莫明其妙了,因为Linux 0.11根本没有这个函数,在gcc的编译选项里
    也有-nostdinc .有一个解释是main函数不是一个普通的函数,为了使main能正常运行,至少要加alloca这个内存分配函数.解决的办法其实也很简单,
    把main.c下面的main函数改名为_main,或者是干脆把它改成另外一个函数,就改成start吧.记得把head.s里的_main也改了.

    在最后,要感谢《自己动手写操作系统》的作者于渊,其实我也是先将原先只能在Linux下编译的书里源代码
    用MinGW移植到Windows下编译的过程中才试着在Windows下编译Linux 0.11源代码的.
    有了在Windows下编译Linux 0.11源代码的经验,移植高版本的源代码,像0.12,0.95,0.96等等版本应该不会有太大的麻烦了。
    也要感谢《Linux内核完全注释》的作者赵炯博士,是他写了这样一本务实的书,并且不余余力的对操作系统爱好者加以帮助,
    包括建了一个很好的论坛。当然,能编译源代码并不等于对源代码都懂了,这离真正完全理解源代码还很远。
    我想源代码还有许多地方是值得我去细细深究的。当然有了能直接在Windows下编译的Linux源代码,我想整个进展会快得多。
    碰到模糊不清的地方,改改源代码,加加printf,make ,几秒钟的事情。bochs调试,再make,再调试。。。
    展开全文
  • WSL 2相比WSL 1,最大的改变就是使用了真正的Linux内核,而不仅仅是一个适配层。我们可以通过命令uname -r查看这个内核的版本,通过正式推送获得的WSL 2的内核版本应当是4.19.84。这个版本比较老,让我们为WSL 2编译...
  • 因为是新手接触linux,还是想从基础一点一点做起,于是从编译linux内核开始。 0.准备工作  编译内核时,所有的输出文件默认与原内核文件存放一起,为了避免编译过程出错而引起不必要的启动错误,建议编译时...
  • 继将Bash shell、原生 OpenSSH、WSL 引入 Windows,以及微软商店提供Ubuntu、SUSE Linux 和 Fedora 等发行版,正在举...
  • 1、实验背景:主机WIN7 虚拟机VMware (ubuntu12.04) 内核版本linux-3.2.0-23-generic-pae 2、下载了新的内核版本linux-3.2.1来进行编译,安装 步骤:  1、首先下载你想要编译内核版本:linux-3.2.1.tar.bz2。...
  • 由于目前Win10的WSL不支持NFS,自己编译一个,把NFS CLient和NFS Server选上。 0.下载WSL2内核 # git clone https://github.com/microsoft/WSL2-Linux-Kernel 2、编译WSL: WSL2-Linux-Kernel-master/Microsoft/...
  • ubuntu下编译和安装linux内核,实现linux内核升级。
  • 如何升级/编译Linux内核    如何编译Linux内核 具体如下:太多了,打了主要的部分。有些地方没有说明,看命令就明白了。 1、下载内核文件如:linux-2.4.18-3.tar.gz拷贝到/usr/src目录并解压缩。 # cd ...
  • 欢迎使用Markdown编辑器写博客 本Markdown编辑器使用StackEdit修改而来,用它写博客,将会带来全新的体验哦: Markdown和扩展Markdown简洁的语法 代码块高亮 图片链接和图片上传 LaTex数学公式 ...
  • 1.安装arm-none-linux-gnueabi交叉编译器 百度一下下载安装交叉编译器 export PATH=/arm-2009q3/bin:$PATH (一次性) 或者gedit ...2.构造linux内核源码树 百度一下下载安装Linux内核 然后我
  • 编译linux内核3.0

    2011-08-06 21:27:50
    先下载 www.kernel.org下载最新的kernel源代码。 建议用wget下载吧!!! wget http://www.kernel.org/XXXXXX(XXX为内核版本,下同) 呵呵。。我是用win开雷的。。 解压 tar -jxvf linu
  • 你马上就会发现,你也可以获得(get),配置(configure),编译(compile)和安装(install)属于你自己的Linux内核(Kernel)。   引言 为什么你想要编译并安装一个完全属于你自己的内核(Kernel)? 可能是...
  • 下载part1... 解压后默认的文件夹位置是D:/Linux-0.11,如果你不是将文件解压到该目录, 你要修改MinGW32目录的MinGW32.bat文件,将里面的PATH指向Min
  • 1. 安装debian 使用unetbootin(http://unetbootin.sourceforge.net/)来创建启动盘,并且下载debian的基本包。 将磁盘进行压缩操作,并且保留出一... 事先Windows系统中,通过“计算机->管理->磁盘管理”的工...
  • 为了在内核运行,本实验针对Linux内核进行修改,增加自定义系统调用函数实现用户态程序对任意进程的nice值进行修改或者读取来进行测试。2 主要函数的接口设计核心态程序SYSCALL_DEFINE3(mysetnice, pid_t, pid...
1 2 3 4 5 ... 20
收藏数 19,401
精华内容 7,760
关键字:

下编译linux内核 在win