『壹』 如何编译linux内核
一、编译环境
ubuntu 5.10,要编译的内核源码版本2.6.12 二、下载并解压源代码 首先从linux内核的官网www.kernel.org把源代码下载下来。为了和后面实验要求符合,我们要下载使用O(1)调度器的源码。因此这里下载了2.6.12版本源码。下载 下linux-2.6.12.tar.bz2,将下载源码放入/usr/src/目录下。如下图所示: 解压该源码: 三、构建编译环境 现在我们得到的只是源代码,只是许许多多的文本文件,要想使这些文件成为可以运行的程序,需要使用编译器进行编译以及链接。编译器有很多,但在里linux下一般都使用gnu的开源编译器套件,这里包括gcc等,现在我们安装基本的编译器套件,如图所示: 四、安装ncurses库 这里使用Ubuntu系统,因为系统自带的ncurses库在支持make menuconfig的时候会出错,所以,依然要安装ncurses库,这里我们从源码安装。首先去ncurses官网http://ftp.gnu.org/pub/gnu/ncurses/ 上下载源码。这里我们下载5.9版本,并通过简单的安装方式.configure 和make、make install方式安装。如下图所示: 五、配置内核 一切准备工作做完,现在我们就可以配置内核了,这里我们使用make menuconfig方式。如下图: 在使用make menuconfig这个命令后,会出现如下的字符界面,我们就可以在这个界面上对内核进行配置。但是如果这不是你第一次配置这个内核,那么请先运行:make mrproper来清除以前的配置,回到默认配置,然后再运行:make menuconfig.
在这里,我们以对cpu支持的配置为例,其余的选项就不一一详述,首先查看本机的cpu类型,如下图:
在这里我们可以看到,我的电脑的cpu是AMD Athlon的,因此我们在cpu选项里面选用AMD,如下图所示:
在这里需要注意的是:
A、 cpu的设置在linux内核编译过程中,不是必需的,即使保持默认的386选项(我们刚才把它改成了AMD),内核也能正常运行,只不过运行慢一些而已。
B、 一般容易出问题的地方在于Device Driver的设置。我在一开始就遇到了在内核编译完,通过grub引导系统过程中报 “ALERT! /dev/sda1 does not exist . Dropping to a shell!”的错误。这是因为硬盘驱动没有配置好而造成的。运行lspci命令,查看到下面这行:
由此确定,需要配置SCSI、PCI-X、Fusion-MPT驱动,需要在响应的驱动选项里将[M]设置为[*],因为硬盘驱动是在系统开机的时候加载,所以不能以模块形式加载。
把这几个驱动内部的选项全部改为[*]:
六、编译内核
对内核的配置完成之后,现在就可以开始编译内核了,只需要一个简单的make命令即可,之后我们就只能慢慢等,直到编译完成,在我的电脑上,大概用了25分钟。下图是运行make后的部分输出。
七、安装内核
编译完成之后,我们需要安装内核,主要分为如下几步:
1)、安装模块
安装模块,对于内核来说,每一个内核版本有自己的模块目录,默认在/lib/moles/内核版本号这个目录下,make moles_install会创建对应的目录,并把对应的模块文件拷贝过去。注意,这一步必须要在编译过内核再做。
2)、拷贝bzImage文件
bzImage文件是内核映像文件,是启动内核所必需的,我们应当把它拷贝到/boot目录下。在这里,我为自己新建了一个目录,我们把它拷贝过去,并且按照一般内核映像文件的命名方式为它改名为vmlinuz-2.6.12。
3)、制作initrd文件
initrd文件命名为initrd.img-2.6.12
4)、修改grub启动项
要能引导起我们的新系统,需要更改grub配置,增加启动选项。ubuntu 5.10的grub版本比较低,配置文件为/boot/grub/menu.lst,高版本的grub可能在/boot/grub/grub.cfg里。在原有启动项基础上,添加我们自己的启动项,并把它设为默认启动项,配置如下:
5)重启
不出意外的话,我们的内核已经正常加载了,运行uname -a,会发现,内核版本已经是2.6.12了。
『贰』 linux浣跨敤gcc缂栬瘧c璇瑷绋嬪簭linux浣跨敤gcc
Linux鐨刧cc鏄鎬庝箞鐢ㄧ殑锛
鍦ㄧ粓绔涓杈撳叆gcc鏂囦欢鍚-o鐩鏍囨枃浠跺悕鐒跺悗./鐩鏍囨枃浠跺悕灏辫屼簡锛屾病鏈夌洰鏍囨枃浠跺悕锛岃嚜鍔ㄥ瓨涓篴鎵ц./a灏辫屼簡銆傚湪浣跨敤Gcc缂栬瘧鍣ㄧ殑鏃跺欙紝鎴戜滑蹇呴』缁欏嚭涓绯诲垪蹇呰佺殑璋冪敤鍙傛暟鍜屾枃浠跺悕绉般侴CC缂栬瘧鍣ㄧ殑璋冪敤鍙傛暟澶х害鏈100澶氫釜锛屽叾涓澶氭暟鍙傛暟鎴戜滑鍙鑳芥牴鏈灏辩敤涓嶅埌锛岃繖閲屽彧浠嬬粛鍏朵腑鏈鍩烘湰銆佹渶甯哥敤鐨勫弬鏁般侴CC鏈鍩烘湰鐨勭敤娉曟槸鈭秅cc鍏朵腑options灏辨槸缂栬瘧鍣ㄦ墍闇瑕佺殑鍙傛暟锛宖ilenames缁欏嚭鐩稿叧鐨勬枃浠跺悕绉般-c锛屽彧缂栬瘧锛屼笉杩炴帴鎴愪负鍙鎵ц屾枃浠讹紝缂栬瘧鍣ㄥ彧鏄鐢辫緭鍏ョ殑.c绛夋簮浠g爜鏂囦欢鐢熸垚.o涓哄悗缂鐨勭洰鏍囨枃浠讹紝閫氬父鐢ㄤ簬缂栬瘧涓嶅寘鍚涓荤▼搴忕殑瀛愮▼搴忔枃浠躲-ooutput_filename锛岀‘瀹氳緭鍑烘枃浠剁殑鍚嶇О涓簅utput_filename锛屽悓鏃惰繖涓鍚嶇О涓嶈兘鍜屾簮鏂囦欢鍚屽悕銆傚傛灉涓嶇粰鍑鸿繖涓閫夐」锛実cc灏辩粰鍑洪勮剧殑鍙鎵ц屾枃浠禷.out銆-g锛屼骇鐢熺﹀彿璋冭瘯宸ュ叿(GNU鐨刧db)鎵蹇呰佺殑绗﹀彿璧勮锛岃佹兂瀵规簮浠g爜杩涜岃皟璇曪紝鎴戜滑灏卞繀椤诲姞鍏ヨ繖涓閫夐」銆-O锛屽圭▼搴忚繘琛屼紭鍖栫紪璇戙佽繛鎺ワ紝閲囩敤杩欎釜閫夐」锛屾暣涓婧愪唬鐮佷細鍦ㄧ紪璇戙佽繛鎺ヨ繃绋嬩腑杩涜屼紭鍖栧勭悊锛岃繖鏍蜂骇鐢熺殑鍙鎵ц屾枃浠剁殑鎵ц屾晥鐜囧彲浠ユ彁楂橈紝浣嗘槸锛岀紪璇戙佽繛鎺ョ殑閫熷害灏辩浉搴斿湴瑕佹參涓浜涖-O2锛屾瘮-O鏇村ソ鐨勪紭鍖栫紪璇戙佽繛鎺ワ紝褰撶劧鏁翠釜缂栬瘧銆佽繛鎺ヨ繃绋嬩細鏇存參銆-Idirname锛屽皢dirname鎵鎸囧嚭鐨勭洰褰曞姞鍏ュ埌绋嬪簭澶存枃浠剁洰褰曞垪琛ㄤ腑锛屾槸鍦ㄩ勭紪璇戣繃绋嬩腑浣跨敤鐨勫弬鏁般侰绋嬪簭涓鐨勫ご鏂囦欢鍖呭惈涓ょ嶆儏鍐碘埗A)#includemyinc.h>B)#include鈥渕yinc.h鈥濆叾涓锛孉绫讳娇鐢ㄥ皷鎷鍙(>)锛孊绫讳娇鐢ㄥ弻寮曞彿(鈥溾)銆傚逛簬A绫伙紝棰勫勭悊绋嬪簭cpp鍦ㄧ郴缁熼勮惧寘鍚鏂囦欢鐩褰(濡/usr/include)涓鎼滃荤浉搴旂殑鏂囦欢锛岃孊绫伙紝棰勫勭悊绋嬪簭鍦ㄧ洰鏍囨枃浠剁殑鏂囦欢澶瑰唴鎼滅储鐩稿簲鏂囦欢銆侴CC鎵ц岃繃绋嬬ず渚嬬ず渚嬩唬鐮乤.c锛#includestdio.h>intmain(){printf("hellon");}棰勭紪璇戣繃绋嬶細杩欎釜杩囩▼澶勭悊瀹忓畾涔夊拰include锛屽苟鍋氳娉曟鏌ャ傚彲浠ョ湅鍒伴勭紪璇戝悗锛屼唬鐮佷粠5琛屾墿灞曞埌浜910琛屻俫cc-Ea.c-oa.icata.c|wc-l5cata.i|wc-l910缂栬瘧杩囩▼锛氳繖涓闃舵碉紝鐢熸垚姹囩紪浠g爜銆俫cc-Sa.i-oa.scata.s|wc-l59姹囩紪杩囩▼锛氳繖涓闃舵碉紝鐢熸垚鐩鏍囦唬鐮併傛よ繃绋嬬敓鎴怑LF鏍煎紡鐨勭洰鏍囦唬鐮併俫cc-ca.s-oa.ofilea.oa.o:ELF64-bitLSBrelocatable,AMDx86-64,version1(SYSV),notstripped閾炬帴杩囩▼锛氶摼鎺ヨ繃绋嬨傜敓鎴愬彲鎵ц屼唬鐮併傞摼鎺ュ垎涓轰袱绉嶏紝涓绉嶆槸闈欐侀摼鎺ワ紝鍙﹀栦竴绉嶆槸鍔ㄦ侀摼鎺ャ備娇鐢ㄩ潤鎬侀摼鎺ョ殑濂藉勬槸锛屼緷璧栫殑鍔ㄦ侀摼鎺ュ簱杈冨皯锛屽瑰姩鎬侀摼鎺ュ簱鐨勭増鏈涓嶄細寰堟晱鎰燂紝鍏锋湁杈冨ソ鐨勫吋瀹规э紱缂虹偣鏄鐢熸垚鐨勭▼搴忔瘮杈冨ぇ銆備娇鐢ㄥ姩鎬侀摼鎺ョ殑濂藉勬槸锛岀敓鎴愮殑绋嬪簭姣旇緝灏忥紝鍗犵敤杈冨皯鐨勫唴瀛樸俫cca.o-oa绋嬪簭杩愯岋細./ahello缂栬緫鏈娈礕CC缂栬瘧绠鍗曚緥瀛愮紪鍐欏備笅浠g爜锛#includestdio.h>intmain(){printf("hello,world!n");}鎵ц屾儏鍐靛備笅锛歡cc-Ehello.c-ohello.igcc-Shello.i-ohello.sgcc-chello.s-ohello.ogcchello.c-ohello./hellohello,world!
linux涓嬫庝箞瀹夎単cc锛
1銆佸湪Linux鐜澧冧笅鍙瑕佽兘閾炬帴Internet灏卞彲浠ラ氳繃鏈鍦扮殑yum婧愭潵瀹夎咃紝鍦ㄧ粓绔涓嬭緭鍏yuminstallgcc灏卞彲浠
2銆乴inux鍐呮牳鑷甯︿簡杩欎簺纭浠剁殑椹卞姩锛屾棤椤讳笅杞藉畨瑁呯殑
3銆佷綘鐢ㄧ殑鏄铏氭嫙鏈猴紝鍙瑕佸湪瀹夎卨inux鐨勬椂鍊欒惧畾濂戒互妗ヨ繛鐨勬柟寮忓叡浜獻nternet灏卞彲浠ヤ笂缃戠殑
4銆佽繖涓杩樻病璇曡繃銆備綘鍙浠ユ悳绱涓涓嬭櫄鎷熸満涓庢湰鍦版枃浠跺叡浜鐩稿叧鐨勫叧閿瀛楄瘯涓璇
5銆佽繖涓鍙鏄涓獁arning锛屼笉鏄痚rror锛岀郴缁熷凡缁忔彁绀轰綘鍙浠ヤ互瓒呯骇鐢ㄦ埛锛堢浉褰撲簬windows涓嬬殑绠$悊鍛樻潈闄愶級鐨勬槸韬浠界櫥闄嗕簡锛岃屼笖杩樿佽惧畾瀵嗙爜
杩樻湁浠涔堢枒闂锛屽挶浠鍐嶈ㄨ
鍦╨inux涓锛屾庝箞鐢╣cc缂栬瘧鏂囦欢锛
缂栬瘧鏂规硶锛氭牸寮廹cc甯哥敤鐨勯夐」鏈绠鍗曠殑鏄:gcchello.c榛樿ょ殑鎯呭喌涓嬪皢鐢熸垚a.out鐨勫彲鎵ц屾ф枃浠讹紝鍙闇瑕佸湪缁堢涓婅緭鍏./a.out灏卞彲浠ョ湅鍒版墽琛岀殑缁撴灉锛屽傛灉浣犳兂鎸囧畾鐢熸垚鐩鏍囨枃浠剁殑鍚嶅瓧閭d箞浣犲彲浠ュ姞涓-o閫夐」,鍛戒护濡備笅:gcc-ohellohello.c鍛戒护锛歡cc-chellohello.c
鎵╁睍璧勬枡锛
gcc鍛戒护鐨勫熀鏈鐢ㄦ硶gcc鍏朵腑锛宖ilenames涓烘枃浠跺悕锛沷ptions涓虹紪璇戦夐」銆傚綋涓嶄娇鐢ㄤ换浣曠紪璇戦夐」缂栬瘧hello.c鏃讹紝gcc灏嗕細鑷鍔ㄧ紪璇戜骇鐢熶竴涓猘.out鐨勫彲鎵ц屾枃浠讹細#lshello.c#gcchello.c#lsa.outhello.c鎵ц岋細#./a.outHello,World!浣跨敤-o缂栬瘧閫夋嫨锛屽彲浠ヤ负缂栬瘧鍚庣殑鏂囦欢鎸囧畾涓涓鍚嶅瓧锛#lsa.outhello.c#gcchello.c-ohello#lsa.outhellohello.c鎵ц岋細#./helloHello,World!娉ㄦ剰锛氫娇鐢-o閫夐」鏃讹紝-o鍚庨潰蹇呴』璺熶竴涓鏂囦欢鍚嶏紝鍗筹細-ooutfile銆備负浜嗕究浜庢弿杩板悗闈㈢殑閫夐」锛屽垹闄hello鍜宎.out鍙鎵ц屾枃浠躲瀹夎卨inux鏃跺備綍瀹夎匞CC锛
浣犲彲鍦ㄤ綘鐨勫厜鐩樹笂鎵撅紝鏈変竴涓狦CC鍖呭拰4涓渚濊禆鏂囦欢锛歡libc-devel-2.3.4-2.13.i386.rpmcpp-3.4.4-2.i386.rpmglibc-kernheaders-2.4-9.1.98.EL.i386.rpmglibc-headers-2.3.4-2.13.i386.rpmgcc-3.4.4-2.i386.rpm濡傛病鏈夌殑璇濓紝鍙浠ョ敤缃戜笂鑷鍔ㄦ洿鏂扮殑鏂瑰紡瀹夎咃紝濡俧edora鐨勮瘽鍙鐢▂uminstallgcc杩欐潯鍛戒护鑷鍔ㄥ畨瑁呫
『叁』 如何编译linux内核
编译linux内核步骤:
1、安装内核
如果内核已经安装(/usr/src/目录有linux子目录),跳过。如果没有安装,在光驱中放入linux安装光盘,找到kernel-source-2.xx.xx.rpm文件(xx代表数字,表示内核的版本号),比如RedHat linux的RPMS目录是/RedHat/RPMS/目录,然后使用命令rpm -ivh kernel-source-2.xx.xx.rpm安装内核。如果没有安装盘,可以去各linux厂家站点或者www.kernel.org下载。
2、清除从前编译内核时残留的.o 文件和不必要的关联
cd /usr/src/linux
make mrproper
3、配置内核,修改相关参数,请参考其他资料
在图形界面下,make xconfig;字符界面下,make menuconfig。在内核配置菜单中正确设置个内核选项,保存退出
4、正确设置关联文件
make dep
5、编译内核
对于大内核(比如需要SCSI支持),make bzImage
对于小内核,make zImage
6、编译模块
make moles
7、安装模块
make moles_install
8、使用新内核
把/usr/src/linux/arch/i386/boot/目录内新生成的内核文件bzImage/zImage拷贝到/boot目录,然后修改/etc/lilo.conf文件,加一个启动选项,使用新内核bzImage/zImage启动。格式如下:
boot=/dev/hda
map=/boot/map
install=/boot/boot.b
prompt
timeout=50
linear
default=linux-new ### 告诉lilo缺省使用新内核启动linux ###
append="mem=256M"
image=/boot/vmlinuz-2.2.14-5.0
label=linux
read-only
root=/dev/hda5
image=/boot/bzImage(zImage)
label=linux-new
read-only
root=/dev/hda5
保留旧有的启动选项可以保证新内核不能引导的情况,还可以进入linux进行其他操作。保存退出后,不要忘记了最重要的一步,运行/sbin/lilo,使修改生效。
9、重新生成ram磁盘
如果您的系统中的/etc/lilo.conf没有使用了ram磁盘选项initrd,略过。如果您的系统中的/etc/lilo.conf使用了ram磁盘选项initrd,使用mkinitrd initrd-内核版本号,内核版本号命令重新生成ram磁盘文件,例如我的Redhat 6.2:
mkinitrd initrd-2.2.14-5.0 2.2.14-5.0
之后把/etc/lilo.conf中的initrd指向新生成的initrd-2.2.14-5.0文件:
initrd=/boot/initrd-2.2.14-5.0
ram磁盘能使系统性能尽可能的优化,具体参考/usr/src/linux/Documents/initrd.txt文件
10、重新启动,OK!
『肆』 RockPI 4A Linux内核下载与编译
本文介绍RockPI 4A单板Debian系统Linux内核的下载和编译方法,为后续介绍RockPI 4A单板Linux内核调试进行抛砖引玉。
一笑神腔、代码下载
Rockpi 4A Debian版本SDK代码下载方法:
代码下载完成后,显示如下瞎册:
kernel 目录下保存Linux内核代码。
build 目录下保存配置和编译脚本。
如果RockPI 4A代码下载失败,提示如下:
解决方法:将下载链接中 https 替换成 git 。
二、内核编译
使用代码里的编译脚本,编译脚本名称: mk-kernel.sh ,位置如下:
注:在脚本 mk-kernel.sh 中有一段代码: source $LOCALPATH/build/board_configs.sh $BOARD ,使用脚本编译时,必须在 build 文件夹同一级目录。
RockPI 4A Linux内核编译方法碰衫如下(使用...省略部分编译输出):
其中: rockpi4a 对应RockPI 4A单板,如果使用其它单板,需要设置不同内容。单板类型可参考 build/board_configs.sh 脚本中 case ${BOARD} in 的选项。例:
编译出来的映像路径:
『伍』 linux内核编译 .c如何生成.o文件
gcc -Wall adc.c -o adc.o
或者在makefile中写下:
adc.o:
gcc -Wall adc.c -o adc.o
然后make,注意adc.o:下面的空格必须用Tab键