Linux内核学习1----下载与编译

来源:互联网 发布:网络大电影 编辑:程序博客网 时间:2024/06/05 21:04

一、安装ubuntu系统

因为各种原因,最终选择在虚拟机上安装了ubuntu,在官网下了iso文件后,配置vmware,然后就可以成功启动啦。安装过程不多写了,网上一堆资料参考。记录下遇到的问题:

1. 安装完成后安装vmware tool,网上说的用mount,把CD-ROM挂到一个自定义目录下,搞了半天也没搞明白,以后再试。最后是用的桌面文件夹拷贝了压缩包过来,然后再tar解压并调用./xxxxx.pl,成功。

2. vmware里显示的桌面只有中间一块,设置全屏。网上有个说是去设置-显示里调整到跟外面的分辨率接近即可,但我的调整后不是宽多了就是长少了。其实只要安装好了vmware tool后,重启下系统就会自动调整了,而我没有重启。

3. 终端命令窗口调出:CTRL+ALT+T即可,进入root用su,出来用CTRL+D,第一次进root要设置密码,方法网上找。


二、下载linux内核源码

最近看的书用的是2.6.34,最后下了这个版本。一开始用的git clone,make总是报错。查了下git clone和.tar的区别,感觉像是一个是携带了管理版本信息,一个是纯源码的区别。然后又去下了个压缩包,www.kernel.org 进去看到最低版本的代码已经是3以上的了找了下资料,在 http://www.kernel.org/pub/linux/kernel/v2.6 即可找到对应的了,如果要其他版本的,应该把vx.x改一下即可。

下载好了后,tar xvjf xxx解压.tar.bz2,tar xvzf xxx解压.tar.gz,解压后建立一个linux-x.y.x目录。


三、搭建编译环境

在这步之前其实我就尝试了make defconfig但会报错,对Linux的不熟悉让我无从下手,后来看了篇文章(http://blog.chinaunix.net/uid-24782829-id-3211008.html)说要搭建编译环境,也就是要安装编译器软件。命令sudo apt install build-essential gcc g++ gdb make,然后安装nurses库。http://ftp.gnu.org/pub/gnu/ncurses/ 下载的5.9版本,下载完成后进入目录下,敲命令./configure,然后make,这里出问题了,报错

In file included from ../ncurses/curses.priv.h:283:0,                 from ../ncurses/lib_gen.c:19:_46863.c:835:15: error: expected ‘)’ before ‘int’../include/curses.h:1594:56: note: in definition of macro ‘mouse_trafo’ #define mouse_trafo(y,x,to_screen) wmouse_trafo(stdscr,y,x,to_screen)                                                        ^Makefile:790: recipe for target '../objects/lib_gen.o' failedmake[1]: *** [../objects/lib_gen.o] Error 1make[1]: Leaving directory '/home/ran/workspace/ncurses-5.9/ncurses'Makefile:109: recipe for target 'all' failedmake: *** [all] Error 2

这时找到了另一篇文章(http://blog.csdn.net/praying2/article/details/52143557)按照步骤解决。这里记录下vim的几个命令:[:set number 显示行号][/xxxx 查找字符串][:wq 保存并退出][输入i进入编辑模式,按esc退出编辑],其他命令用的时候查找一下格式。最后make install 即安装完成。

然后进入linux-x.y.z目录下make menuconfig,这里也出了一个问题,说没有complier-gcc5.h这个文件,后来在网上下了一个放到include/linux再重新make menuconfig会出来一个可视化菜单界面,这里由于不懂,选择了使用make defconfig编译,此时再make,好,又出问题了。

1.报错recipe for target xxxx failed,再往前找找就会找到error的地方,原来是uninitialized_var引起的,猜测是因为编译器的版本已经不支持这个定义了,于是手动更改,把uninitialized_var(x);的地方改成x = 0;即可。

 2.elf_i386或elf_x86_64:没有那个文件或目录。原因是gcc 4.6不再支持linker-style架构(我使用的是gcc 4.6.3)。解决办法:确保当前路径是在内核目录中,然后执行命令:vim arch/x86/vdso/Makefile,在Makefile中搜索elf_x86_64,然后把”-m elf_x86_64” 替换为 “-m64“;接着在Makefile中搜索elf_i386,然后把”-m elf_i386” 替换为 “-m32“,保存退出解决了。

3.

Can't use 'defined(@array)' (Maybe you should just omit the defined()?) at kernel/timeconst.pl line 373.

起初一头雾水,仔细看了错误提示后删掉了kernel/timeconst.pl 文件中 373行的define即可

 

以上问题感觉像是版本不对应导致,参考网站https://lwn.net/Articles/529954/

原创粉丝点击