1. 程式人生 > >移植新核心4.15.6到JZ2440開發板

移植新核心4.15.6到JZ2440開發板

近來無事就想著動手移植新的核心在JZ2440開發板上跑起來,https://www.kernel.org/ 下載kernel linux-4.15.6.tar.xd,執行
xz -d linux-4.15.6.tar.xz
tar -xvf linux-4.15.6.tar

進行解壓操作,就可以進行移植操作了。

1.修改Makefile檔案:

-ARCH           ?= $(SUBARCH)
-CROSS_COMPILE  ?= $(CONFIG_CROSS_COMPILE:"%"=%)
+ARCH           ?= arm
+CROSS_COMPILE  ?= arm-linux-gnueabi-

在3.4.2核心中交叉編譯設定arm-linux-就可以編譯,這裡不知為何會出錯,網上查詢設定成arm-linux-gnueabi-就可以,我的arm-linux-gcc 的版本是4.3.2,arm-linux-gnueabi-gcc的版本是4.7.3。需要注意的是arm和arm-linux-gnueabi-之後不能新增任何的空格否則會出現莫名其妙的錯誤。

複製arch/arm/config/s3c2410_defconfig檔案到核心原始碼根目錄

2.修改晶振頻率

linux-4.15.6/arch/arm/mach-s3c24xx/mach-smdk2440.c 檔案中

static void __init smdk2440_init_time(void)
{
	//s3c2440_init_clocks(16934400);
	s3c2440_init_clocks(12000000);
	samsung_timer_init();
}

修改時鐘頻率為12M,否則串列埠輸出將為亂碼

3.修改mtd分割槽

/linux-4.15.6/arch/arm/mach-s3c24xx/common-smdk.c檔案中

/* NAND parititon from 2.4.18-swl5 */

static struct mtd_partition smdk_default_nand_part[] = {
	[0] = {
                .name   = "bootloader",
                .size   = SZ_256K,
                .offset = 0,
        },
        [1] = {
                .name   = "params",
                .offset = MTDPART_OFS_APPEND,
                .size   = SZ_128K,
        },
        [2] = {
                .name   = "kernel",
                .offset = MTDPART_OFS_APPEND,
                .size   = SZ_4M,
        },
        [3] = {
                .name   = "rootfs",
                .offset =  MTDPART_OFS_APPEND,
                .size   = MTDPART_SIZ_FULL,
        }
};

這個要跟uboot的mtdparts相對應,由於新的kernel比較大,原先的2M不夠,故這裡修改為4M。設定uboot變數用set 命令,後需要saveenv進行儲存變數。

uboot環境變數:

baudrate=115200
ethaddr=08:00:3e:26:0a:5b
serverip=192.168.7.11
netmask=255.255.255.0
mtdids=nand0=nandflash0
bootdelay=5
ipaddr=172.16.91.161
mtdparts=mtdparts=nandflash0:[email protected](bootloader),128k(params),4m(kernel),-(root)
machid=16a //s3c2440對應的id
filesize=1A7540
bootcmd=nand read 0x30008000 0x80000 0x500000
bootargs=init=/linuxrc console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=yaffs2 rw mem=64M
nand=read 30000000 kernel;bootm 30000000
stdin=serial
stdout=serial
stderr=serial
partition=nand0,0
mtddevnum=0
mtddevname=bootloader

Environment size: 525/131068 bytes

make s3c2410_defconfig配置生成.config檔案,

make uImage在arch/arm/boot/目錄底下生成uImage映象檔案。

4.分割槽設定好之後但是還是不能正常啟動開發板,需要製作根檔案系統。

4.1

下載busybox-1.20.0,make menuconfig

 Busybox Settings   ===>Build Options ====>Build Busybox as a static binary(no shared libs)編為靜態庫

4.2

修改Makefile 中的 ARCH 和 CROSS_COMPILE 為arm 和 arm-linux-

直接進行make,之後進行安裝,執行命令

4.3

make CONFIG_PREFIX=/home/username/rootfs

安裝到指定目錄位置,這裡裝到roofs目錄底下,將出現bin sbin usr 目錄和linuxrc檔案

修改linuxrc檔案許可權chmod 777 linuxrc。

4.4

建立etc lib proc tmp dev home mnt root    sys等目錄。

在etc資料夾底下建立fstab、inittab、mdev.conf等檔案,建立資料夾init.d,並在其目錄底下建立rcS檔案。

inittab檔案中的內容定義如下:

::sysinit:/etc/init.d/rcS
console::askfirst:-/bin/sh
::ctrlaltdel:/sbin/reboot
::shutdown:/bin/umount -a -r

fstab檔案中的內容定義如下:

#device   mount-point     type      option     dump   fsck   order 
  proc        /proc     proc     defaults    0        0  
  tmpfs       /tmp      tmpfs    defaults    0        0  
  sysfs       /sys      sysfs    defaults    0        0  
  tmpfs       /dev      tmpfs    defaults    0        0

rcS檔案中的內容定義如下:

PATH=/sbin:/bin:/usr/sbin:/usr/bin
runlevel=S
prevlevel=N
umask 022 
export PATH runlevel prevlevel
mount -a
echo /sbin/mdev>/proc/sys/kernel/hotplug
mdev -s

各個檔案的定義詳解請見http://blog.csdn.net/mybelief321/article/details/10007719

4.5

新增庫檔案。檢視自己的工具鏈環境變數echo $PATH,可得知其安裝目錄。如我的是/usr/local/arm/4.3.2/目錄

/opt/jdk1.6.0_32/bin:/opt/jdk1.6.0_32/jre/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/local/arm/4.3.2/bin:

執行命令

cp /usr/local/arm/4.3.2/arm-none-linux-gnueabi/libc/armv4t/lib/*so* lib/ -d
-d :若來原始檔為連結檔案的屬性(link file),則複製連結檔案屬性而非檔案本身;

4.6

需要在dev中建立console 和null節點

mknod console c 5 1
mknod null c 1 3

許可權要求加sudo

4.7

製作yaffs2根檔案系統:

由於所使用的開發板NAND是256M的,需要使用工具mkyaffs2image-128M進行製作根檔案系統。

cd /home/username/
mkyaffs2image-128M rootfs/ rootfs.yaffs2

製作根檔案系統檔案rootfs.yaffs2,通過uboot進行燒寫進開發板。

而此時的開發板核心是沒有支援yaffs2檔案系統的,需要進行打補丁。

5.核心增加支援yaffs2檔案系統

git clone git://www.aleph1.co.uk/yaffs2

下載yaffs2原始碼,進入yaffs2原始碼根目錄,給4.15.6核心打補丁

./patch-ker.sh c m /your kernel path

將在核心fs目錄底下新增yaffs2資料夾,fs目錄底下的Makefile和Kconfig中新增對yaffs2檔案系統的支援。

make menuconfig配置核心,

Location:                                                                                                                                                                                          │  
  │     -> File systems                                                                                                                                                                                  │  
  │       -> Miscellaneous filesystems (MISC_FILESYSTEMS [=y])                                                                                                                                           │  
  │ (2)     -> yaffs2 file system support (YAFFS_FS [=y])

make clean清理下

make uImage重新生成核心映象檔案uImage

6.

由於yaffs2的更新腳步跟不上kernel的更新,所以在編譯uImage時候會出現錯誤。

根據錯誤提示進行相應位置的修改即可:

iff -urN compare-linux-4.15.6/linux-4.15.6/fs/yaffs2/yaffs_vfs.c linux-4.15.6/fs/yaffs2/yaffs_vfs.c
--- compare-linux-4.15.6/linux-4.15.6/fs/yaffs2/yaffs_vfs.c     2018-03-03 09:19:34.482203584 +0800
+++ linux-4.15.6/fs/yaffs2/yaffs_vfs.c  2018-03-02 17:27:47.442250025 +0800
@@ -136,7 +136,8 @@
 #if (LINUX_VERSION_CODE < KERNEL_VERSION(2, 6, 26))
 #define Y_INIT_TIMER(a)        init_timer(a)
 #else
-#define Y_INIT_TIMER(a)        init_timer_on_stack(a)
+//#define Y_INIT_TIMER(a)      init_timer_on_stack(a)//檢視原始碼4.15.6並無該函式
+#define Y_INIT_TIMER(a)        __init_timer_on_stack(a,NULL,0)
 #endif

 #if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 6, 27))
@@ -262,6 +263,8 @@
 #define YAFFS_NEW_GET_LINK 0
 #endif

+#define CURRENT_TIME           (current_kernel_time())
+
 #define update_dir_time(dir) do {\
                        (dir)->i_ctime = (dir)->i_mtime = CURRENT_TIME; \
                } while (0)
diff -urN compare-linux-4.15.6/linux-4.15.6/fs/yaffs2/yportenv.h linux-4.15.6/fs/yaffs2/yportenv.h
--- compare-linux-4.15.6/linux-4.15.6/fs/yaffs2/yportenv.h      2018-03-03 09:19:34.482203584 +0800
+++ linux-4.15.6/fs/yaffs2/yportenv.h   2018-03-02 17:36:59.814250025 +0800
@@ -59,6 +59,7 @@

 #define YAFFS_ROOT_MODE                        0755
 #define YAFFS_LOSTNFOUND_MODE          0700
+#define CURRENT_TIME            (current_kernel_time()) //檢視3.4.2原始碼中該巨集所對應函式

 #if (LINUX_VERSION_CODE > KERNEL_VERSION(2, 5, 0))
 #define Y_CURRENT_TIME CURRENT_TIME.tv_sec
diff -urN compare-linux-4.15.6/linux-4.15.6/include/linux/timer.h linux-4.15.6/include/linux/timer.h
--- compare-linux-4.15.6/linux-4.15.6/include/linux/timer.h     2018-02-25 18:15:44.000000000 +0800
+++ linux-4.15.6/include/linux/timer.h  2018-03-02 17:29:01.310250025 +0800
@@ -19,7 +19,7 @@
        unsigned long           expires;
        void                    (*function)(struct timer_list *);
        u32                     flags;
-
+       unsigned long data;//新增data成員變數
 #ifdef CONFIG_LOCKDEP
        struct lockdep_map      lockdep_map;
 #endif
diff -urN compare-linux-4.15.6/linux-4.15.6/include/linux/mtd/nand.h linux-4.15.6/include/linux/mtd/nand.h
--- compare-linux-4.15.6/linux-4.15.6/include/linux/mtd/nand.h  1970-01-01 08:00:00.000000000 +0800
+++ linux-4.15.6/include/linux/mtd/nand.h       2018-03-02 17:34:35.958250025 +0800 新增nand.h檔案

錯誤可能不止這些,需要根據實際錯誤提示進行相應的修改。

用kernel3.4.2+網上下載的yaffs2原始碼(不是目前最新),make uImage過程中不會出現錯誤但是會有warnning提示,當時不在意,但是在掛載的時候就會出現致命性的錯誤。核心啟動的提示:

[15:09:52]Booting Linux ...
[15:09:52]
[15:09:52]NAND read: device 0 offset 0x60000, size 0x400000
[15:09:52]
[15:09:58]Reading data from 0x45f800 -- 100% complete.
[15:09:58] 4194304 bytes read: OK
[15:09:58]## Booting image at 30007fc0 ...
[15:09:58]   Image Name:   Linux-3.4.2
[15:09:58]   Created:      2018-03-02   6:24:08 UTC
[15:09:58]   Image Type:   ARM Linux Kernel Image (uncompressed)
[15:09:58]   Data Size:    2088800 Bytes =  2 MB
[15:09:58]   Load Address: 30008000
[15:09:58]   Entry Point:  30008000
[15:09:59]   Verifying Checksum ... OK
[15:09:59]   XIP Kernel Image ... OK
[15:09:59]
[15:09:59]Starting kernel ...
[15:09:59]
[15:09:59]Uncompressing Linux... done, booting the kernel.
[15:10:00]Booting Linux on physical CPU 0
[15:10:00]Linux version 3.4.2 ([email protected]) (gcc version 4.3.2 (Sourcery G++ Lite 2008q3-72) ) #2 Fri Mar 2 14:24:04 CST 2018
[15:10:00]CPU: ARM920T [41129200] revision 0 (ARMv4T), cr=c0007177
[15:10:00]CPU: VIVT data cache, VIVT instruction cache
[15:10:00]Machine: SMDK2440
[15:10:00]Memory policy: ECC disabled, Data cache writeback
[15:10:00]CPU S3C2440A (id 0x32440001)
[15:10:00]S3C24XX Clocks, Copyright 2004 Simtec Electronics
[15:10:00]S3C244X: core 400.000 MHz, memory 100.000 MHz, peripheral 50.000 MHz
[15:10:00]CLOCK: Slow mode (1.500 MHz), fast, MPLL on, UPLL on
[15:10:00]Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 16256
[15:10:00]Kernel command line: init=/linuxrc console=ttySAC0,115200 root=/dev/mtdblock3 rootfstype=yaffs2 rw mem=64M
[15:10:00]PID hash table entries: 256 (order: -2, 1024 bytes)
[15:10:00]Dentry cache hash table entries: 8192 (order: 3, 32768 bytes)
[15:10:00]Inode-cache hash table entries: 4096 (order: 2, 16384 bytes)
[15:10:00]Memory: 64MB = 64MB total
[15:10:00]Memory: 60648k/60648k available, 4888k reserved, 0K highmem
[15:10:00]Virtual kernel memory layout:
[15:10:00]    vector  : 0xffff0000 - 0xffff1000   (   4 kB)
[15:10:00]    fixmap  : 0xfff00000 - 0xfffe0000   ( 896 kB)
[15:10:00]    vmalloc : 0xc4800000 - 0xff000000   ( 936 MB)
[15:10:00]    lowmem  : 0xc0000000 - 0xc4000000   (  64 MB)
[15:10:00]    modules : 0xbf000000 - 0xc0000000   (  16 MB)
[15:10:00]      .text : 0xc0008000 - 0xc03c2000   (3816 kB)
[15:10:00]      .init : 0xc03c2000 - 0xc03e1000   ( 124 kB)
[15:10:00]      .data : 0xc03e2000 - 0xc0409fc0   ( 160 kB)
[15:10:00]       .bss : 0xc0409fe4 - 0xc0428f48   ( 124 kB)
[15:10:00]NR_IRQS:85
[15:10:00]irq: clearing pending ext status 00000300
[15:10:00]irq: clearing subpending status 00000003
[15:10:00]irq: clearing subpending status 00000002
[15:10:00]sched_clock: 32 bits at 200 Hz, resolution 5000000ns, wraps every 4294967291ms
[15:10:00]Console: colour dummy device 80x30
[15:10:00]Calibrating delay loop... 199.47 BogoMIPS (lpj=498688)
[15:10:00]pid_max: default: 32768 minimum: 301
[15:10:00]Mount-cache hash table entries: 512
[15:10:00]CPU: Testing write buffer coherency: ok
[15:10:00]Setting up static identity map for 0x302f5088 - 0x302f50e0
[15:10:00]gpiochip_add: registered GPIOs 0 to 23 on device: GPIOA
[15:10:00]gpiochip_add: registered GPIOs 32 to 47 on device: GPIOB
[15:10:00]gpiochip_add: registered GPIOs 64 to 79 on device: GPIOC
[15:10:00]gpiochip_add: registered GPIOs 96 to 111 on device: GPIOD
[15:10:00]gpiochip_add: registered GPIOs 128 to 143 on device: GPIOE
[15:10:00]gpiochip_add: registered GPIOs 160 to 167 on device: GPIOF
[15:10:00]gpiochip_add: registered GPIOs 192 to 207 on device: GPIOG
[15:10:00]gpiochip_add: registered GPIOs 224 to 234 on device: GPIOH
[15:10:00]gpiochip_add: registered GPIOs 256 to 271 on device: GPIOJ
[15:10:00]NET: Registered protocol family 16
[15:10:00]S3C Power Management, Copyright 2004 Simtec Electronics
[15:10:00]S3C2440: Initialising architecture
[15:10:00]S3C2440: IRQ Support
[15:10:00]S3C244X: Clock Support, DVS off
[15:10:00]bio: create slab <bio-0> at 0
[15:10:00]SCSI subsystem initialized
[15:10:00]usbcore: registered new interface driver usbfs
[15:10:00]usbcore: registered new interface driver hub
[15:10:00]usbcore: registered new device driver usb
[15:10:00]s3c-i2c s3c2440-i2c: slave address 0x10
[15:10:00]s3c-i2c s3c2440-i2c: bus frequency set to 97 KHz
[15:10:00]s3c-i2c s3c2440-i2c: i2c-0: S3C I2C adapter
[15:10:00]Advanced Linux Sound Architecture Driver Version 1.0.25.
[15:10:00]NET: Registered protocol family 2
[15:10:00]IP route cache hash table entries: 1024 (order: 0, 4096 bytes)
[15:10:00]TCP established hash table entries: 2048 (order: 2, 16384 bytes)
[15:10:00]TCP bind hash table entries: 2048 (order: 1, 8192 bytes)
[15:10:00]TCP: Hash tables configured (established 2048 bind 2048)
[15:10:00]TCP: reno registered
[15:10:00]UDP hash table entries: 256 (order: 0, 4096 bytes)
[15:10:00]UDP-Lite hash table entries: 256 (order: 0, 4096 bytes)
[15:10:00]NET: Registered protocol family 1
[15:10:00]RPC: Registered named UNIX socket transport module.
[15:10:00]RPC: Registered udp transport module.
[15:10:00]RPC: Registered tcp transport module.
[15:10:00]RPC: Registered tcp NFSv4.1 backchannel transport module.
[15:10:00]jffs2: version 2.2. (NAND) ?2001-2006 Red Hat, Inc.
[15:10:00]msgmni has been set to 118
[15:10:00]io scheduler noop registered
[15:10:00]io scheduler deadline registered
[15:10:00]io scheduler cfq registered (default)
[15:10:00]Console: switching to colour frame buffer device 30x40
[15:10:00]fb0: s3c2410fb frame buffer device
[15:10:00]s3c2440-uart.0: ttySAC0 at MMIO 0x50000000 (irq = 70) is a S3C2440
[15:10:00]console [ttySAC0] enabled
[15:10:00]s3c2440-uart.1: ttySAC1 at MMIO 0x50004000 (irq = 73) is a S3C2440
[15:10:00]s3c2440-uart.2: ttySAC2 at MMIO 0x50008000 (irq = 76) is a S3C2440
[15:10:01]brd: module loaded
[15:10:01]loop: module loaded
[15:10:01]S3C24XX NAND Driver, (c) 2004 Simtec Electronics
[15:10:01]s3c24xx-nand s3c2440-nand: Tacls=2, 20ns Twrph0=6 60ns, Twrph1=2 20ns
[15:10:01]s3c24xx-nand s3c2440-nand: NAND soft ECC
[15:10:01]NAND device: Manufacturer ID: 0xec, Chip ID: 0xda (Samsung NAND 256MiB 3,3V 8-bit)
[15:10:01]Scanning device for bad blocks
[15:10:01]Bad eraseblock 1403 at 0x00000af60000
[15:10:01]Bad eraseblock 1695 at 0x00000d3e0000
[15:10:01]Bad eraseblock 1702 at 0x00000d4c0000
[15:10:01]Creating 4 MTD partitions on "NAND":
[15:10:01]0x000000000000-0x000000040000 : "bootloader"
[15:10:01]0x000000040000-0x000000060000 : "params"
[15:10:01]0x000000060000-0x000000460000 : "kernel"
[15:10:01]0x000000460000-0x000010000000 : "rootfs"
[15:10:01]dm9000 Ethernet Driver, V1.31
[15:10:01]ohci_hcd: USB 1.1 'Open' Host Controller (OHCI) Driver
[15:10:01]s3c2410-ohci s3c2410-ohci: S3C24XX OHCI
[15:10:01]s3c2410-ohci s3c2410-ohci: new USB bus registered, assigned bus number 1
[15:10:01]s3c2410-ohci s3c2410-ohci: irq 42, io mem 0x49000000
[15:10:01]hub 1-0:1.0: USB hub found
[15:10:01]hub 1-0:1.0: 2 ports detected
[15:10:01]mousedev: PS/2 mouse device common for all mice
[15:10:01]s3c2410_wdt: S3C2410 Watchdog Timer, (c) 2004 Simtec Electronics
[15:10:01]s3c2410-wdt s3c2410-wdt: watchdog inactive, reset disabled, irq disabled
[15:10:01]TCP: cubic registered
[15:10:01]NET: Registered protocol family 17
[15:10:01]drivers/rtc/hctosys.c: unable to open rtc device (rtc0)
[15:10:01]ALSA device list:
[15:10:01]  No soundcards found.
[15:10:01]yaffs: dev is 32505859 name is "mtdblock3" rw
[15:10:01]yaffs: passed flags ""
[15:10:01]VFS: Mounted root (yaffs2 filesystem) on device 31:3.
[15:10:01]Freeing init memory: 124K
[15:10:01]Unable to handle kernel paging request at virtual address 6f692d73
[15:10:01]pgd = c0004000
[15:10:01][6f692d73] *pgd=00000000
[15:10:01]Internal error: Oops: 3 [#1] ARM
[15:10:01]Modules linked in:
[15:10:01]CPU: 0    Not tainted  (3.4.2 #2)
[15:10:01]PC is at yaffs_getxattr+0x28/0x98
[15:10:01]LR is at get_vfs_caps_from_disk+0x64/0x100
[15:10:01]pc : [<c0119e94>]    lr : [<c0133b6c>]    psr: 60000013
[15:10:01]sp : c381fe08  ip : c381fe30  fp : c381fe2c
[15:10:01]r10: c3401d18  r9 : c381c660  r8 : c03f9c74
[15:10:01]r7 : c381fe34  r6 : 00000014  r5 : 6f692d6b  r4 : c34057c0
[15:10:01]r3 : 00000014  r2 : f0000010  r1 : c037f434  r0 : c3401d18
[15:10:01]Flags: nZCv  IRQs on  FIQs on  Mode SVC_32  ISA ARM  Segment kernel
[15:10:01]Control: c000717f  Table: 30004000  DAC: 00000017
[15:10:01]Process swapper (pid: 1, stack limit = 0xc381e270)
[15:10:01]Stack: (0xc381fe08 to 0xc3820000)
[15:10:01]fe00:                   c34057c0 c3401d18 c381fe7c c3a1a7c0 c381e000 c381c660
[15:10:01]fe20: c381fe64 c381fe30 c0133b6c c0119e7c 00000000 c3802be0 00000000 c3a5a5f8
[15:10:01]fe40: c3a4bde0 00000000 00000000 c3a1a7c0 c381c120 000081ff c381fec4 c381fe68
[15:10:01]fe60: c0133c98 c0133b18 c3a5a5f8 c381c150 00000000 60000013 c381feb4 00000000
[15:10:01]fe80: 00000000 00000000 00000000 00000000 c040a4bc c3a4be14 c381feb4 c3a1a7c0
[15:10:01]fea0: c34057c0 000081ff c3a1a7c0 c03ecfb0 c381ff30 c03ecf28 c381feec c381fec8
[15:10:01]fec0: c008b804 c0133c18 c008a6d4 c02f4854 00000001 00000002 c381e000 c04a92a5
[15:10:01]fee0: c381ff2c c381fef0 c008c0d8 c008b75c c04098d4 00000000 c381ae84 00000000
[15:10:01]ff00: c00a0148 c04a92a5 c03ecf28 c03ecfb0 c381ff30 0000006b c03c2210 c03dc040
[15:10:01]ff20: c381ff9c c381ff30 c000bdfc c008be7c 00000000 00000000 00000000 00000000
[15:10:02]ff40: 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
[15:10:02]ff60: 00000000 00000000 00000000 00000000 00000000 00000000 c03ecf28 c040a000
[15:10:02]ff80: 00000008 c040a000 0000006b c03c2210 c381ffb4 c381ffa0 c00087dc c000bdcc
[15:10:02]ffa0: c03e0d4c c03dc03c c381fff4 c381ffb8 c03c23f8 c00086e8 00000007 00000007
[15:10:02]ffc0: c03c2210 c03c2284 c001a3b8 00000000 c03c2284 c001a3b8 00000013 00000000
[15:10:02]ffe0: 00000000 00000000 00000000 c381fff8 c001a3b8 c03c2294 33cd3a09 f3cc3bc0
[15:10:02]Backtrace: 
[15:10:02][<c0119e6c>] (yaffs_getxattr+0x0/0x98) from [<c0133b6c>] (get_vfs_caps_from_disk+0x64/0x100)
[15:10:02] r9:c381c660 r8:c381e000 r7:c3a1a7c0 r6:c381fe7c r5:c3401d18
[15:10:02]r4:c34057c0
[15:10:02][<c0133b08>] (get_vfs_caps_from_disk+0x0/0x100) from [<c0133c98>] (cap_bprm_set_creds+0x90/0x424)
[15:10:02] r6:000081ff r5:c381c120 r4:c3a1a7c0
[15:10:02][<c0133c08>] (cap_bprm_set_creds+0x0/0x424) from [<c008b804>] (prepare_binprm+0xb8/0x11c)
[15:10:02][<c008b74c>] (prepare_binprm+0x0/0x11c) from [<c008c0d8>] (do_execve+0x26c/0x378)
[15:10:02] r6:c04a92a5 r5:c381e000 r4:00000002
[15:10:02][<c008be6c>] (do_execve+0x0/0x378) from [<c000bdfc>] (kernel_execve+0x40/0x8c)
[15:10:02][<c000bdbc>] (kernel_execve+0x0/0x8c) from [<c00087dc>] (init_post+0x104/0x140)
[15:10:02] r9:c03c2210 r8:0000006b r7:c040a000 r6:00000008 r5:c040a000
[15:10:02]r4:c03ecf28
[15:10:02][<c00086d8>] (init_post+0x0/0x140) from [<c03c23f8>] (kernel_init+0x174/0x1c4)
[15:10:02] r5:c03dc03c r4:c03e0d4c
[15:10:02][<c03c2284>] (kernel_init+0x0/0x1c4) from [<c001a3b8>] (do_exit+0x0/0x76c)
[15:10:02]Code: e1a06003 e3120002 e5915134 1a00000f (e5954008) 
[15:10:02]---[ end trace e57bb244bbe532f0 ]---
[15:10:02]Kernel panic - not syncing: Attempted to kill init! exitcode=0x0000000b
[15:10:02]
出現核心崩潰的情況,定位
yaffs_getxattr

可知該錯誤位於fs\yaffs2\Yaffs_vfs.c檔案中:

#ifdef YAFFS_NEW_XATTR
static ssize_t yaffs_getxattr(struct dentry * dentry, struct inode *inode,
	const char *name, void *buff, size_t size)
{
#else
static ssize_t yaffs_getxattr(struct dentry * dentry, const char *name,
			void *buff, size_t size)

對於#ifdef 後面的巨集,只要前面有#define 過的話不管它是0還是1都將執行

static ssize_t yaffs_getxattr(struct dentry * dentry, struct inode *inode,
	const char *name, void *buff, size_t size)

這樣的函式的宣告,而不會執行else分支的宣告。

在本檔案中查詢可發現:

#if (LINUX_VERSION_CODE >= KERNEL_VERSION(3,12,0))
#define YAFFS_NEW_PROCFS
#include <linux/seq_file.h>
#endif

#if (LINUX_VERSION_CODE >= KERNEL_VERSION(4, 8, 0))
#define PAGE_CACHE_SIZE PAGE_SIZE
#define PAGE_CACHE_SHIFT PAGE_SHIFT
#define Y_GET_DENTRY(f) ((f)->f_path.dentry)
#define page_cache_release put_page
#define YAFFS_NEW_XATTR 1
#define YAFFS_NEW_GET_LINK 1
#else
#define Y_GET_DENTRY(f) ((f)->f_dentry)
#define YAFFS_NEW_XATTR 0
#define YAFFS_NEW_GET_LINK 0
#endif
核心版本大於3.12時,該巨集定義為1,否則定義為0,無論是0還是1,該巨集
YAFFS_NEW_XATTR 

都是定義過的,函式yaffs_getxattr函式都將被宣告為5個引數的型別。

而對於呼叫到yaffs_getxattr的結構體inode_operations:

static const struct inode_operations yaffs_file_inode_operations = {
	.setattr = yaffs_setattr,
#ifdef YAFFS_USE_XATTR
	.setxattr = yaffs_setxattr,
	.getxattr = yaffs_getxattr,
	.removexattr = yaffs_removexattr,
#endif
	.listxattr = yaffs_listxattr,
};

該結構體的定義為:

struct inode_operations {
	struct dentry * (*lookup) (struct inode *,struct dentry *, struct nameidata *);
	void * (*follow_link) (struct dentry *, struct nameidata *);
	int (*permission) (struct inode *, int);
	struct posix_acl * (*get_acl)(struct inode *, int);

	int (*readlink) (struct dentry *, char __user *,int);
	void (*put_link) (struct dentry *, struct nameidata *, void *);

	int (*create) (struct inode *,struct dentry *,umode_t,struct nameidata *);
	int (*link) (struct dentry *,struct inode *,struct dentry *);
	int (*unlink) (struct inode *,struct dentry *);
	int (*symlink) (struct inode *,struct dentry *,const char *);
	int (*mkdir) (struct inode *,struct dentry *,umode_t);
	int (*rmdir) (struct inode *,struct dentry *);
	int (*mknod) (struct inode *,struct dentry *,umode_t,dev_t);
	int (*rename) (struct inode *, struct dentry *,
			struct inode *, struct dentry *);
	void (*truncate) (struct inode *);
	int (*setattr) (struct dentry *, struct iattr *);
	int (*getattr) (struct vfsmount *mnt, struct dentry *, struct kstat *);
	int (*setxattr) (struct dentry *, const char *,const void *,size_t,int);
	ssize_t (*getxattr) (struct dentry *, const char *, void *, size_t);//函式宣告為4個引數型別
	ssize_t (*listxattr) (struct dentry *, char *, size_t);
	int (*removexattr) (struct dentry *, const char *);
	void (*truncate_range)(struct inode *, loff_t, loff_t);
	int (*fiemap)(struct inode *, struct fiemap_extent_info *, u64 start,
		      u64 len);
} ____cacheline_aligned;

故引數型別不一致會產生前面所說的wanning提示,到實際呼叫的時候可能就會產生致命的錯誤,故在此做以下的修改即可:

diff -urN compare-linux-3.4.2/linux-3.4.2/fs/yaffs2/yaffs_guts.c linux-3.4.2/fs/yaffs2/yaffs_guts.c
--- compare-linux-3.4.2/linux-3.4.2/fs/yaffs2/yaffs_guts.c      2018-03-03 09:13:13.514203584 +0800
+++ linux-3.4.2/fs/yaffs2/yaffs_guts.c  2018-03-02 16:11:55.347615000 +0800
@@ -4526,7 +4526,8 @@
        } else if (obj->short_name[0]) {
                strcpy(name, obj->short_name);
        } else if (obj->hdr_chunk > 0) {
-               int result;
+               //int result;//提示未初始化,提供個初始值即可,不加也行
+               int result=YAFFS_FAIL;
                u8 *buffer = yaffs_get_temp_buffer(obj->my_dev);

                struct yaffs_obj_hdr *oh = (struct yaffs_obj_hdr *)buffer;
diff -urN compare-linux-3.4.2/linux-3.4.2/fs/yaffs2/yaffs_vfs.c linux-3.4.2/fs/yaffs2/yaffs_vfs.c
--- compare-linux-3.4.2/linux-3.4.2/fs/yaffs2/yaffs_vfs.c       2018-03-03 09:13:13.778203584 +0800
+++ linux-3.4.2/fs/yaffs2/yaffs_vfs.c   2018-03-02 16:10:51.495705001 +0800
@@ -974,7 +974,8 @@
        return error;
 }

-#ifdef YAFFS_NEW_XATTR
+//#ifdef YAFFS_NEW_XATTR
+#if (YAFFS_NEW_XATTR > 0)
 static ssize_t yaffs_getxattr(struct dentry * dentry, struct inode *inode,
        const char *name, void *buff, size_t size)
 {
總結:注意看編譯過程的提示,不要對原始碼恐慌,理智分析。

修改上述錯誤之後,即可看到親切的
Please press Enter to activate this console.

最簡單的啟動完成,還需要移植相應的驅動才能實現更復雜的功能。



相關推薦

移植核心4.15.6到JZ2440開發

近來無事就想著動手移植新的核心在JZ2440開發板上跑起來,https://www.kernel.org/ 下載kernel linux-4.15.6.tar.xd,執行xz -d linux-4.15.6.tar.xz tar -xvf linux-4.15.6.tar進行

x4412開發移植Linux核心4.9.123版本

X4412開發板移植Linux核心4.9.123版本 基本移植 1、原始碼下載 官網下載linux4.9.123核心:https://mirrors.edge.kernel.org/pub/linux/kernel/v4.x/。 2、解壓並配置 xz -d

移植最新的核心linux-4.9到開發JZ2440全過程筆記

移植最新的核心:linux-4.9 實驗工具: 開發板:    JZ2440 移植核心:  linux-4.9 下載地址:https://www.kernel.org/pub/linux/kernel/v4.x/linux-4.9.tar.gz 交叉編譯器:4.4.3 下載地址:http://download

Tslib和Qt 4.8.4與在開發上的移植

Linux:Ubuntu 12.04 X86 QT:4.8.4 交叉編譯工具鏈:gcc version 4.3.2 (Sourcery G++ Lite 2008q3-72) 安裝如下的軟體  sudo apt-get install automake sudo a

移植OpenCV+QT到ARM S3C6818開發上(2)

續《移植OpenCV+QT到ARM S3C6818開發板上(1)》 安裝QT開發環境到宿主機 解壓qt5.7.0原始碼(時間稍稍有點長,為待會編譯捏了一把汗啊!) 解壓完之後進入原始碼根目錄,終端輸入: sudo ./configure -v -release

核心裁剪,arm_mini2440開發中增刪自己寫的驅動

1、把編譯通過的buttons1711.c檔案放入 /home/mini2440/linux-2.6.32.2/drivers/char/ 2、修改Makefile         在同一個目錄下(第1步中放入.c檔案

centos7 升級核心4.15

yum -y updateyum -y install yum-plugin-fastestmirror安裝Reporpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org 如果執行失敗(一般是DNS配置的問題),手

I.MX6開發移植Linux4.1.15核心之TSC2007觸控式螢幕裝置樹資訊的新增

之前寫過一篇3.0.35核心移植關於TSC2007觸控式螢幕驅動移植的文章。裡面對TSC2007.c驅動程式的分析比較清晰,點選連結檢視:點選連結檢視 本篇文章,主要記錄在4.1.15核心移植的過程中,對於TSC2007裝置的新增,需要如何新增裝置樹資訊。 1、

【資料分享】迅為4412開發核心4.3寸螢幕logo修改方法

平臺: iTOP-4412開發板+4.3寸螢幕 問題:4.3寸螢幕-logo修改   本文件主要介紹 iTOP-4412 開發板,4.3 寸螢幕,核心 logo 修改過程。預設的映象,在 4.3 寸螢幕上是不顯示核心 logo 的。 本文件需要用到的工具包可以

移植好uboot和基於initramfs根檔案系統Linux核心開發的啟動過程

我們移植好uboot和Linux核心之後,當我們重啟之後,開發板首先做的事情就是將nandflash前4K的內容複製到SRAM中去,由於SRAM只有4K大小,所以我們必須將初始化CPU、記憶體、中斷、關閉開門狗以及nandflash中uboot拷貝到SDRAM中的的程式都放

移植linux3.7.4系統到itop4412開發記錄

最近要移植linux3.7.4系統到itop4412開發板,好長時間沒有移植系統了,今天弄了一下,都感覺手生了。 首先先編譯一下核心試下,然後再慢慢移植各驅動 1.下載linux核心原始碼 2.進入核心原始碼目錄,修改makefile中的arch =arm 交叉編譯器為我們

linux核心移植開發步驟

1 解壓縮核心原始碼 2 給原始碼打補丁 3 配置   a  make(完全手動)   b 使用預設的配置,在上面修改   在arch/arm/configs/找到對應的配置檔案   xxxdefconfig   執行make xxxdefconfig   執行完成以後會

ARM開發OK6410移植opencv-2.4.7庫qt介面顯示(附加各種問題解決方案)

轉載:http://blog.csdn.net/jiebaoabcabc/article/details/22935185          經過了昨天一天苦逼的研究opencv原始碼、arm-linux編譯器工作原理和堅持不懈的make,我終於移植成功了opencv-2

vsftpd-2.3.4伺服器在ok6410開發上的移植

chown_uploads=YES chown_username=ftp # #You may override where the log file goes if you like. The default isshown # below. #xferlog_file=/var/log/vsftpd.lo

fl2440開發移植tslib-1.4

        在移植這個tslib時出現了好多問題,因為是新手出現,所以出現的更多的是低階錯誤         如果你要執行tslib的話,首先你要確定你之前移植的lcd,,觸控式螢幕驅動都是好好的否則的話出了錯,那就是比了xxx了。。。。。        下面就進入正題:

iTop4412 3.0.15核心移植到linux4.4.34(一)

打算借linux移植學習核心啟動過程,及4412各外設驅動原理 移植時,先修改一些config,然後解決編譯出現的問題 System Type-->Multiple platform selection [*]ARMv7 based platforms(Cortex-

vsftpd-2.3.4移植到8621開發

客戶不知道從哪裡買來塊板子,讓我幫他移植程式。先開始搭環境。 (1)解壓vsftpd-2.3.4.tar.gz   #tar xvzf vsftpd-2.3.4.tar.gz (2)交叉編譯     需要修改的地方有兩處。 第一處是Makefile: # Ma

移植opencv2.4.9到itop4412開發

OpenCV是目前開源專案中最著名的基於機器視覺方向的影象處理的開發包,目前已經有被移植到嵌入式Linux環境上。本文介紹了OpenCV交叉編譯的基本步驟。 在opencv交叉編譯之前要先進行依賴庫的交叉編譯,然後才能進行opencv庫的交叉編譯(因為open

opencv2.4.9在Hi3516A開發移植

opencv2.4.9下載不用說了。 Ubuntu12.04虛擬機器安裝的+arm-hisiv200-linux交叉編譯器+cmake-gui(2.8.7) 參考:http://blog.csdn.net/luotuo44/article/details/8958990 h

第九章:基於九鼎X210開發移植2014.10版U-boot之啟動核心

接下來要啟動核心了。首先要先將機器碼設定成我們開發板的機器碼,將/board/Samsung/x210目錄下的x210.c中的board_init函式中的bi_arch_number傳入MACH_TYPE_SMDKV210,傳入正確的機器碼才能啟動核心。 但事實上,無論