Linux驱动开发之环境搭建Ubuntu 12.4 编译内核

摘要:
在arch/x86/vdso/Makefile_LDFLAGS_ vdso开头行中的“-melf_x86_64”中。lds替换为“-m64”。将在以vdso32.lds开头的行中使用VDSO_LDFLAGS_替换为“-m32”。

要想编写驱动,建立内核目录树是必须的.也即是在PC Linux上编译内核,加入到PC Linux中,以这个内核作为PC Linux的内核启动.

1. 我的系统是Ubuntu 12.4,先查看一下原先的内核版本:

cody@cody-linux:/$ uname -a
Linux cody-linux 3.2.0-29-generic-pae #46-Ubuntu SMP Fri Jul 27 17:25:43 UTC 2012 i686 i686 i386 GNU/Linux

原来是3.2.0-29,还挺新的,起码到目前为止是这样的

2. 安装必要的软件包:

cody@cody-linux:/$ sudo  apt-get install build-essential kernel-package  libncurses5-dev

3. 去https://www.kernel.org/pub/linux/kernel/选择一个合适的版本下载.因为我的开发板使用的内核是2.6.29.4,所以我选择"linux-2.6.29.4.tar.bz2”, 下载完成后放到一个合适的位置,我的是:/home/cody/kernel/,然后右键选择解压在这里(让命令去S吧,点击二下就可以做的事,我干嘛还要去命终端打一堆的命令来解压呢?)

4. 打开终端,进入到刚刚解压出来的目录:

cody@cody-linux:/$ cd ~/k*/l*
cody@cody-linux:~/kernel/linux-2.6.29.4$

看到了吧,使用通配符*,快速进入到目标目录,因为在我的主目录下以k开关的只有kernel这个目录,而kernel目录下以l开关的也只有linux-2.6.29.4这个目录,如果还有一些目录是以l开头,可能进入的不是你想要的目录,多打几个前面的字母,直到能区别为止即可.

5. 先配置一下. 我使用的是默认的配置,因为我不懂行那么多配置到底代表什么意思.是否可行有待时间验证

sudo make-kpkg clean #如果之前已经make过,最好clean一下
sudo make menuconfig #会打开一下图形界面的配置,我直接Exit,问我是否保存,我选择Yes
sudo make-kpkg --initrd --append-to-version=-fordevkernel kernel-image kernel-headers

其中字符串”fordevkernel”可以换成你想要的.--append-to-version的解释是这样的(来源):

--append-to-version= you can write any string that helps you identify the kernel, but it must begin with a minus (-) and must not contain whitespace

6. 根据make要很久才能跑玩,可是我的跑了大概2分钟的时候,出现一个错误:

gcc: 错误: elf_i386:没有那个文件或目录
make[2]: *** [arch/x86/vdso/vdso32-int80.so.dbg] 错误 1
make[1]: *** [arch/x86/vdso] 错误 2
make: *** [sub-make] 错误 2

解决办法:

原因是 gcc 4.6 不再支持 linker-style 架构。讲 arch/x86/vdso/Makefile 中, 将以 VDSO_LDFLAGS_vdso.lds 开头所在行的 "-m elf_x86_64" 替换为 "-m64"。 将以 VDSO_LDFLAGS_vdso32.lds 开头所在行的 "-m elf_x86" 替换为 "-m32"

7. 又跑了半小时左右,出现如下错误:

include/linux/kvm.h:241:9: 错误: 重复的成员‘padding’
arch/x86/kvm/svm.c: 在函数‘io_interception’中:
arch/x86/kvm/svm.c:1099:30: 警告: 变量‘rep’被设定但未被使用 [-Wunused-but-set-variable]
arch/x86/kvm/svm.c:1099:12: 警告: 变量‘down’被设定但未被使用 [-Wunused-but-set-variable]
make[2]: *** [arch/x86/kvm/svm.o] 错误 1
make[1]: *** [arch/x86/kvm] 错误 2
make[1]:正在离开目录 `/home/cody/kernel/linux-2.6.29.4'
make: *** [debian/stamp/build/kernel] 错误 2

百度,Google,Bing…. 没有找到直接使用的信息,有的说是配置错误.好吧,重新make menuconfig, 从出错信息来看,应该是kvm相关的.因为没有用到kvm,为何不干脆关掉这个选项呢?ok,就这样!

找到Virtualization选择,把勾选去掉.如下例如所示.

image

继续make, 还有一个错误,重复的定义'codec’,解决办法是找到 include/sound/soc-dai.h,可以看到里面定义了一个struct和一个union类型的codec, 我注释掉struct的那个,不知道这样做会不会有问题. 反正我的是编译过了.

6. 等了好久好久,终于编译过了, 内牛满面!! 生成的安装文件在上层目录中, 返回上层目录(~/kernel),可以看到生成了二个deb文件,一个linux-image-开头的内核文件和一个lnux-headers-开头的头文件.

7. 使用dpkg –i 安装上述二个文件.

8. 查看一下启动菜单文件里有没有进加入的内核的启动选项

vi /boot/grub/grub.cfg

9. 启动试试,哈哈,因为我在vmware里运行的,默认没有打开启动菜单显示的,所以重新启动之后看不到启动菜单,还是进入原来的内核系统

10. 修改/etc/default/grub文件中

GRUB_HIDDEN_TIMEOUT=1
GRUB_TIMEOUT=10   #10表示等待的时间,可以修改成你喜欢的时间

还有一些地方要修改,打开/etc/grub.d/30_os-prober,按如下修改(来源)

if [ "x\${timeout}" != "x-1" ]; then
  if keystatus; then
    if keystatus --shift; then
      set timeout=-1
    else
      set timeout=10  # 修改这里 1/3
    fi
  else
    if sleep$verbose --interruptible 3 ; then
      set timeout=10 # 修改这里 2/3
    fi
  fi
fi
EOF
      else
    cat << EOF
if [ "x\${timeout}" != "x-1" ]; then
  if sleep$verbose --interruptible ${GRUB_HIDDEN_TIMEOUT} ; then
    set timeout=10  # 修改这里 3/3
  fi
fi

修改之后不要忘了更新grub

sudo update-grub

11. 重新启动,这时应该可以选择内核了.

12. 选择新编译的内核启动之后, 会提示一些错误. 但还算可以用. 先这样吧.

免责声明:文章转载自《Linux驱动开发之环境搭建Ubuntu 12.4 编译内核》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇python爬虫入门02:教你通过 Fiddler 进行手机抓包Python基础(二)--基本数据类型、格式化输出、基本运算符下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

[转]论数学在机器学习中的作用

机器学习和计算机视觉都是很多种数学的交汇场。看着不同的理论体系的交汇,对于一个researcher来说,往往是非常exciting的enjoyable的事情。不过,这也代表着要充分了解这个领域并且取得有意义的进展是很艰苦的。 Linear Algebra (线性代数) 和 Statistics (统计学) 是最重要和不可缺少的。 这代表了Machine...

Python编程软件的安装与使用——Windows、Linux和Mac

Python版本:3.6.2  操作系统:Windows  作者:SmallWZQ        最近,有读者透露:Python软件如何安装?为什么自己安装的软件会有各种“奇怪”的问题?据此,本篇随笔将具体讲述如何安装Python 3.x版本的软件。特别地,篇中所述的不是安装文本编辑器(比如Notepad++,Sublimetext,PyCharm.......

linux --&amp;gt; 获取系统启动时间

获取系统启动时间一、前言   时间对操作系统来说非常重要,从内核级到应用层,时间的表达方式及精度各部相同。linux内核里面用一个名为jiffes的常量来计算时间戳。应用层有time、getdaytime等函数。今天需要在应用程序获取系统的启动时间,百度了一下,通过sysinfo中的uptime可以计算出系统的启动时间。 二、sysinfo结构   sys...

linux学习9 运维基本功-Linux常用基础命令实战应用

一、文件系统知识回顾 1、Linux文件系统: a、文件名称严格区分字符大小写 b、文件可以使用除/以外任意字符 c、文件名长度不能超过255个字符 d、以.开头的文件为隐藏文件: . :当前目录 .. :当前目录的上一级目录 2、linux目录 a、工作目录:working directory b、家目录 二、常用命令 1、pwd:printing wo...

Samba的配置

Samba的配置 对于linux与windows共享,和平共处,我们可以用Samba软件 Samba是一套免费的开源软件,可以在linux或其他类unix操作系统上实现windows域控制器,文件服务,打印服务等。 Samba实现了windows系统所使用的核心网络协议:SMB(Server Message Block) Samba可以提供如下功能: 活动...

【记录】 iSCSI服务器的搭建与使用[Debian]

序言 更换系统后需要一个网络文件存储用于备份文件,本想用NFS多方便,但是timeshift不支持网络存储,备份路径必须是一个块存储设备, 但是你还必须分好文件系统,这不是多此一举???反正我只用rsync进行同步 于是使用iscsi满足它的需求,因为iscsi连接后获取到的就是一个块存储设备 在配置过程中参考了很多网友写的博客 很有参考价值 非常感谢 《...