首页 新闻资讯 技术资料 论坛 网站地图
SOPC 医疗电子 消费电子 通信产品 军工/航空航天 应用产品 数控系统
电子元器件搜索:
IC库存(8958万) PDF资料(329万) IC价格 IC求购 资讯 技术资料
维库电子市场网是知名的电子元器件交易网站, 为电子生产企业提供IC库存和技术资料查询服务。
位置: 首页 > 详细信息
  升级Linux内核奋斗记
出处:嵌入式技术网 时间: 2007-11-15

我的PIII&nbspDell机运行着内核2.4.的RedHat,自从Linux内核2.6发布以来一直想把该系统升级到内核2.6。经过一番艰辛万苦,终于成功了。为了体验一下在Linux下编写多线程程序的步骤,又更新GCC和C语言库。在此愿和各位朋友共享这段经历,共享这段成果。
(可能有记录错误,仅供参考)。
具体步骤包括以下内容:
1,升级内核的具体步骤
2,更新GCC
3,使用glibc2.3.5
4,使用NPTL线程进行编程

在此之前,先简要地介绍一下Linux内核2.6所做的改进及新增功能
Linux2.6主要在以下的10个方面作了很大的改进,简单概括如下,有关详细情况,请参阅相关资料。
1)通过改善并行处理能力和采用POSIX线程等,提高了系统的处理能力,从而Linux真正具备大型信息系统所要求性能。
2)通过改善文件系统的输出/输入能力和提高对大容量内存的利用效率,使得Linux能够更胜任大型信息系统中的数据处理。
3)加强了对数据库应用程序的支持。
4)提高了抗系统高负荷时能力。
5)提高了系统的可用性,包括对不停机时备份和不停机时更换硬件功能的支持。
6)强化了对网络的支持,增加了对Ipv6,&nbspSCTP,&nbspIPSec,等的支持。
7)通过增加访问控制和内核暗号化技术,提高了系统的安全性。
8)强化了对电源的管理。
9)强化了对嵌入式CPU和系统的支持。
10)添加了更多的硬件驱动程序。
一.升级内核
1, 下载linux-2.6.3.tar.bz2(可以是更新的版本)到/usr/src
bzcat&nbsplinux-2.6.3.tar.bz2 |&nbsptar&nbspxvf –
cd&nbsplinux-2.6.3
阅读README及Changes 文件,确认必须的工具软件。因为不是笔记本电脑和笔记本电脑有关的软件可以忽略。
发现module-init-tools需要更新。
2,下载module-init-tools-0.9.13.tar.bz2
bzcat&nbspmodule-init-tools-0.9.13.tar.bz2 |&nbsptar&nbspxvf –
cd&nbspmodule-init-tools-0.9.13
./configure --prefix=/usr/local/module-init
make
make&nbspmoveold
make&nbspinstall
/usr/local/module-init/sbin/generate-modpobe.conf > /etc/modprobe.conf
成功。
3, 编译Linux内核
cd /usr/src/linux-2.6.3
make&nbspmenuconfig
一看太麻烦了,而且许多选项不知所云。退出该程序。
执行make&nbspoldconfig,对kernel2.6新增的不熟悉的选项作不选或为缺省。
make&nbspbzImage
make&nbspmodules&nbspmodules_install
pwd
/usr/src/linux-2.6.3
mv&nbsparch/i386/boot/bzImage /boot/bzImage2.6.3
mv&nbspSystem.map /boot/System.map-2.6.3
cd /boot
mv&nbspSystem.map&nbspoldSystem.map
ln –s&nbspSystem.map-2.6.3&nbspSystem.map
4,建立sys目录
mkdir /sys
5, 修改相关文件,增加对sys的支持
在/etc/rc.d/rc.sysinit文件增加对sys的支持。
1) 找到mount –f /proc的行,在其下面,增加&nbspmount –f /sys
2) 找到&nbspaction $ “Mounting&nbspproc&nbspfilesystem:”&nbspmount –n –t&nbspproc /proc /proc 在其下面,增加
action $ “Mounting&nbspsysfs&nbspfilesystem:”&nbspmount –n –t&nbspsysfs /sys /sys
3) 把文件中的&nbspksyms 改成&nbspkallsyms
在/etc/fstab文件中,增加一行
none /sys&nbspsysfs&nbspdefaults&nbsp0&nbsp0
在/etc/rc.d/init.d/halt中,增加对sys的支持
把&nbspawk ‘$2 ~/^/$ | ^/proc | ^/dev / {next} 变为
awk ‘$2 ~/^/$ | ^/proc | ^/sys | ^/dev / {next}
6,启动
修改/etc/lilo.conf, 增加下面的设置

image=/boot/bzImange2.6.3
label=Linux2.6.3
read-only
root=/dev/hda3(由自己的PC设置决定)
成功。
二,更新GCC (因为gcc2.95.3无法编译glibc-2.3.5)
下载gcc-3.4.4.tar.bz2
bzcat&nbspgcc-3.4.4.tar.bz2 |&nbsptar&nbspxvf –
cd&nbspgcc-3.4.4
./configure –prefix=/usr/local/gcc344 –enable-shared –enable-threads –enable-threads=posix –enable-languages=c,c++,f77
make&nbspbootstrap (因为使用CFLAGS选项时,出错了,所以省略)
make&nbspinstall
ln –s /usr/local/gcc344/bin/gcc /usr/bin/gcc

三,使用glibc-2.3.5
1)、通过调查发现要编译glibc-2.3.5,要求binutils在2.13以上。所以必须安装binutils-2.14
下载binutils-2.14.tar.gz
tar&nbspzxpvf&nbspbinutils-2.14.tar.gz
mkdir&nbspbinutils-build
cd&nbspbinutils-build
../binutils-2.14/configure –prefix=/usr –enable-shared
make&nbsptooldir=/usr
make&nbspcheck
make&nbsptooldir=/usr&nbspinstall
cp ../binutils-2.14/include/libiberty.h /usr/include
2) 安装glibc-2.3.5
下载&nbspglibc-2.3.5.tar.gz 和&nbspglibc-2.3.5-fix_test-1.patch
tar&nbspzxpvf&nbspglibc-2.3.5.tar.gz
patch –Np1 –i ../glibc-2.3.5-fix_test-1.path
mkdir&nbspglibc-build
cd&nbspglibc-build
../glibc-2.3.5/configure –prefix=/usr/local/glibc235 –enable-add-ons=linuxthreads –enable-kernel=2.6.0 (若安装在/usr目录下,很危险,可能会损坏你的系统)
make
make&nbspcheck (必须执行的一步)
make&nbsplocaledata /install-locales (对应各国文字)
mkdir /usr/man/man3(man的安装路径)
make –C ../glibc-2.3.5/linuxthreads/man&nbspinstall
上面的安装完成以后,最好把/usr/local/glibc235/lib和/usr/local/glibc235/include加入到系统的路径中,这样在编译程序时,就不必指定库和header文件的路径了。
四、使用NPTL进行线程编程
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <pthread.h>
void&nbspthread_fun(void *&nbsparg);
char&nbspmessage[] = “I&nbspam&nbspcreated&nbspthread”;
int&nbspmain() {
int&nbsprnt;
pthread_t&nbspnew_thread;
void *thread_result;
rnt=pthread_create(&new_thread,NULL,&nbspthread_fun, (void*)&nbspmessage);
if (rnt !=&nbsp0) {
perrer (“thread&nbspcreation&nbspfailed”);
exit(EXIT_FAILURE);
}
printf(“Waiting&nbspfor&nbspother&nbspthread&nbspto&nbspfinish…\n”);
rnt =&nbsppthread_join(new_thread, &thread_result);
if (rnt !=&nbsp0) {
perrer (“thread&nbspjoin&nbspfailed”);
exit(EXIT_FAILURE);
}
printf(“Thread&nbspjoin,&nbspit&nbspreturned %s \n”, (char*)&nbspthread_result);
printf(“message&nbspnow %s\n”,&nbspmessage);
exit(EXIT_SUCCESS);
}
void *thread_fun (void *&nbsparg) {
printf(“the&nbspnew&nbspthread&nbspis&nbsprunning.&nbspArgument&nbspwas %s\n”,(char*)arg);
sleep(3);
strcpy(message, “Bye”);
pthread_exit(“Thank&nbspyou&nbspfor&nbspthe&nbsptest”);
}
编译
gcc -D_REENTRANT&nbsptest_thread.c -o&nbsptest_thread -lpthread
./test_thread
成功了。


关闭】 【打印
相关专题  
安防产品
存储器
电源系列
嵌入式开发新闻
开发工具
综合电子技术
测试测量
通信产品
计算机外设
AD/DA
接口电路
嵌入式软件
消费电子
CPLD/FPGA
嵌入式硬件
软件开发
SOPC
军工/航空航天
应用产品
嵌入式系统
医疗电子
工业控制
IC设计
汽车电子
传感控制

© 2007 百斯嵌入式开发网 网站地图