class="markdown_views prism-github-gist">

Linux内核编译

本篇博客来自凌云实验室开发板介绍及其烧录学习笔记

1.内核介绍

一种开源电脑操作系统内核。它是一个用C语言写成,符合POSIX标准的类Unix操作系统。也就是,最上面是用户(或应用程序)空间,程序执行的地方。**函数库(glibc或uclibc)**提供了连接内核的系统调用接口,还提供了在用户空间应用程序和内核之间进行转换的机制。区别于51,stm32单片机等,每个用户空间的进程都使用自己的虚拟地址空间,而内核则占用多带带的地址空间。

2.内核下载

现在内核更新的比较快,我们为s3c2440选择3.0版本。附上内核下载链接。

3.文件准备

博主使用的是三星的ARM9 S3C2440,该cpu是以armv4t指令集的ARM920t,跑ARM Linux的开发板时,以SMDK2440为模板支持相应的硬件。建立整体框架。

[klaus@localhost ~]$ mkdir fl2440

[klaus@localhost ~]$ cd fl2440/

[klaus@localhost fl2440]$ mkdir -p {crosstool,bootloader,linux/{kernel,rootfs},driver,3rdparty,program,images}

[klaus@localhost fl2440]$ tree

.

├── 3rdparty

├── bootloader

├── crosstool

├── driver

├── images

├── linux

│ ├── kernel

│ └── rootfs

└── program

9 directories, 0 files

[klaus@localhost fl2440]

4.内核修改编译

下载源代码后,修改成自己单片机相应的类型

一般为开发板型号

其他型号都不需要选择,只选择s3c2440 and s3c2442 Machines

不同需要,比如更改串口驱动设备,自己的交叉编译器等等。

编译前可以查看一下C文件和汇编文件的多少,当然我这个是内核生成之后的文件个数。

[klaus@localhost linux-3.0]$ find -name *.c | wc -l

16563

[klaus@localhost linux-3.0]$ find -name *.S | wc -l

1226

[klaus@localhost linux-3.0]$

5. 有趣的三角

拟写一个shell脚本,博主会在另一篇文章详细讲解,文章链接在这里。

#!/bin/bash

make

mkimage -A arm -O linux -T kernel -C none -a 30008000 -e 30008040 -n "Linux Kernel" -d arch/arm/boot/zImage linuxrom-s3c2440.bin

chmod a+x linuxrom-s3c2440.bin

执行脚本后就可以查看生成结果了

[klaus@localhost linux-3.0]$ chmod a+x build.sh

[klaus@localhost linux-3.0]$ ./build.sh

... ... ...

Image Name: Linux Kernel

Created: Thu Mar 15 11:58:01 2018

Image Type: ARM Linux Kernel Image (uncompressed)

Data Size: 2314180 Bytes = 2259.94 kB = 2.21 MB

Load Address: 30008000

Entry Point: 30008040

[klaus@localhost linux-3.0]$ ls

arch CREDITS firmware ipc lib mm net scripts tools vmlinux.o

block crypto fs Kbuild linuxrom-s3c2440.bin modules.builtin README security usr

build.sh Documentation include Kconfig MAINTAINERS modules.order REPORTING-BUGS sound virt

COPYING drivers init kernel Makefile Module.symvers samples System.map vmlinux

[klaus@localhost linux-3.0]$

6.可能遇到的问题

#####1)格式错误

... ... ...

[klaus@localhost linux-3.0]$ make s3c2410_defconfig

make: *** /home/klaus/fl2440/linux/linux-3.0/arch/arm: Is a directory. Stop.

解决办法,在改文件路径时,多空格少换号都不行,要严格注意

export KBUILD_BUILDHOST := $(SUBARCH)

ARCH ?=arm

CROSS_COMPILE ?=/opt/x-tools/arm920t/bin/arm-linux-

楼主我出现这个问题是因为我多打了一个空格,arm后面。

####2)缺少依赖

... ... ...

IHEX2FW firmware/emi62/spdif.fw

IHEX2FW firmware/emi62/midi.fw

./build.sh:line 3:mkimage:command not found

chmod:cannot access `linuxrom-s3c2440.bin`:No such file or directory

[klaus@localhost linux-3.0]$

可能是缺少uboot-tools之间这个依赖,可以直接下载这个安装包进行安装

[klaus@localhost ~]$ wget http://rpmfind.net/linux/epel/6/x86_64/Packages/u/uboot-tools-2011.03-1.el6.x86_64.rpm

[klaus@localhost ~]$ sudo rpm -ivh uboot-tools-2011.03-1.el6.x86_64.rpm

7.烧录到开发板

内核生成后,我们可以尝试将这个.bin文件烧录到现有的开发板上去,看看现象会怎样

这里在u-boot界面采用tftp下载到开发板

U-Boot 2010.09 (May 05 2017 - 19:48:28)

DRAM: 64 MiB

NAND: 256 MiB

In: serial

Out: serial

Err: serial

Net: dm9000

Hit any key to stop autoboot: 0

[fl2440@lingyun]#

[fl2440@lingyun]# run tb

dm9000 i/o: 0x20000300, id: 0x90000a46

DM9000: running in 16 bit mode

MAC: 00:11:22:33:44:55

could not establish link

Using dm9000 device

TFTP from server 192.168.100.8; our IP address is 192.168.100.18

Filename 'linuxrom-s3c2440.bin'.

Load address: 0x30008000

Loading: #################################################################

#################################################################

##########################################################

done

Bytes transferred = 2752308 (29ff34 hex)

## Booting kernel from Legacy Image at 30008000 ...

Image Name: Linux Kernel

Created: 2017-06-19 22:03:17 UTC

Image Type: ARM Linux Kernel Image (uncompressed)

Data Size: 2752244 Bytes = 2.6 MiB

Load Address: 30008000

Entry Point: 30008040

Verifying Checksum ... OK

XIP Kernel Image ... OK

OK

Starting kernel ...

Uncompressing Linux... done, booting the kernel.

Linux version 3.0.0 (guowenxue@centos6.localdomain) (gcc version 4.5.4 (Buildroot 2012.08) ) #2 Tue Jun 20 06:03:14 CST 2017

CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=c0007177

CPU: VIVT data cache, VIVT instruction cache

Machine: SMDK2440

Memory policy: ECC disabled, Data cache writeback

CPU S3C2440A (id 0x32440001)

S3C24XX Clocks, Copyright 2004 Simtec Electronics

S3C244X: core 405.000 MHz, memory 101.250 MHz, peripheral 50.625 MHz

... ... ...

arp_tables: (C) 2002 David S. Miller

TCP cubic registered

NET: Registered protocol family 17

lib80211: common routines for IEEE802.11 drivers

Registering the dns_resolver key type

s3c-rtc s3c2410-rtc: setting system clock to 2017-10-31 02:57:07 UTC (1509418627)

Root-NFS: no NFS server address

VFS: Unable to mount root fs via NFS, trying floppy.

VFS: Cannot open root device "(null)" or unknown-block(2,0)

Please append a correct "root=" boot option; here are the available partitions:

1f00 1024 mtdblock0 (driver?)

1f01 15360 mtdblock1 (driver?)

1f02 40960 mtdblock2 (driver?)

1f03 81920 mtdblock3 (driver?)

1f04 81920 mtdblock4 (driver?)

1f05 40960 mtdblock5 (driver?)

Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(2,0)

Backtrace:

[] (dump_backtrace+0x0/0x110) from [] (dump_stack+0x18/0x1c)

r6:00008000 r5:c38ac000 r4:c056dd40 r3:c05446d4

[] (dump_stack+0x0/0x1c) from [] (panic+0x5c/0x17c)

[] (panic+0x0/0x17c) from [] (mount_block_root+0x1c8/0x208)

r3:00000000 r2:20000013 r1:c3819f58 r0:c04c32ed

r7:c04c3351

[] (mount_block_root+0x0/0x208) from [] (mount_root+0xac/0xd0)

[] (mount_root+0x0/0xd0) from [] (prepare_namespace+0x160/0x1b4)

r4:c056d680

[] (prepare_namespace+0x0/0x1b4) from [] (kernel_init+0xe4/0x118)

r5:c0025d3c r4:c056d620

[] (kernel_init+0x0/0x118) from [] (do_exit+0x0/0x624)

r5:c00088f0 r4:00000000

系统会报出 **Unable to mount root fs on unknown-block(2,0)**这样的错误,这时候就是缺少根文件系统了,下一步,将根文件系统树烧进内核中绑定一起就以可以将系统跑起来,这里文件系统的制作链接。

最小的linux内核编译,Linux最小内核移植相关推荐

  1. linux 2.4内核编译,linux 2.4内核编译详解

    2.4内核编译详解 内核简介 内核,是一个操作系统的核心.它负责管理系统的进程.内存.设备驱动程序.文件和网络系统,决定着系统的性能和稳定性. Linux的一个重要的特点就是其源代码的公开性,所有的内 ...

  2. linux内核编译与新内核启用

    1.  准备工作 (1)       整理出系统需要支持的硬件.文件系统类型以及网络协议等内容. (2)       建议用命令uname –r 查看一下系统的版本号,如果你的系统版本与将要编译的内核 ...

  3. Linux内核编译和替换内核

    前言 Linux内核支持多种架构.该篇小记是笔者第一次针对已有的内核配置文件来编译内核的,比如arm系列的博通bcm,海思HISI,恩智浦i.MX6ULL-本次是针对博通bcm2709_defconf ...

  4. Linux内核编译之修改内核版本号

    Linux内核编译--修改版本号 参考文章:https://blog.csdn.net/weixin_38180645/article/details/82856407 一.实验环境 Ubuntu18 ...

  5. linux下编译安装ntfs,内核编译安装 (用NTFS模块)

    内核编译安装 (用NTFS模块) 1 rz 下载的 的内核最新文件 在这 https://www.kernel.org/ 2 tar xvf linux-4.12.10.tar.xz 解压文件 内核文 ...

  6. android内核编译教程,Android内核开发:系统编译输出的镜像文件

    主要介绍一下源码编译输出的几个重要的镜像文件,这里把bootloader源码和Linux内核源码的编译输出也算在其中,因为毕竟Android系统缺少了这两个部分在设备上也是跑不起来的. 1. MLO, ...

  7. linux iptables 编译,Linux下编译安装iptables

    Linux下如何编译安装iptables实例: 先卸载系统已经安装的iptables,卸载前需备份三个文档:iptables启动脚本,iptables-config配置文档,以及已经建立好的iptab ...

  8. linux dvb编译,linux dvb - frontend

    1. linux dvb devices linux dvb api使得应用程序可以控制相关硬件模块通过六个unix风格的字符设备,包括video, audio, frontend, demux, c ...

  9. linux撤销编译,linux重新编译内核

    一.linux内核 1.查看linux内核版本 uname -r 2.下载对应的linux内核 https://www.kernel.org/pub/linux/kernel/ 将内核文件夹解压到/u ...

最新文章

  1. LSM 优化系列(四) -- Rocksdb和Lethe 对Delete问题的优化
  2. 网页同步交互和异步交互的区别?
  3. nyist 132Prime Ring Problem
  4. Linux Mysql 1130错误解决
  5. 练习:每一分钟产生一个文件,保存本分钟内所有数字之和。
  6. 【动态规划】农田个数 (ssl 1633)
  7. 2016蓝桥杯省赛---java---B---3(平方怪圈)
  8. 斗鱼第三方开放平台2.2版使用记录
  9. mysql不能删除外键吗,为什么mysql不允许删除外键?
  10. [转]Zend Framework + Smarty 应用实例
  11. pandasql库学习使用之在Python中执行SQL语句
  12. Java中的>>,>>>
  13. Android 吸顶布局的写法
  14. 拳头产品|海泰虎讯,新一代安全即时通讯系统
  15. 杯具的无线鼠标安装记
  16. 给小白程序员的建议!
  17. 深度学习在工业界的应用案例(二)
  18. Java:Exceptions相关学习
  19. ASP.NET 基础(7)
  20. 这可能是人工智能领域覆盖最全的一份技术趋势报告

热门文章

  1. 蚂蚁森林快捷指令_利用快捷指令实现钉钉自动化打卡
  2. 四种python 单继承的实现方式
  3. Python 读取 csv 文件忽略引号中字段的逗号
  4. python进行两个大数相加
  5. 2019 Python100道 面试 题,你会几道?
  6. python issubclass 和 isinstance函数
  7. linux smtp 发送邮件乱码,使用gomail发送邮件之解决附件名乱码的问题
  8. numpy np.matmul()(两个数组的矩阵乘积)
  9. 尚硅谷最新版JavaWeb全套教程,java web零基础入门完整版(一)
  10. Linux挂载新磁盘