移植新核心4.15.6到JZ2440開發板
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,傳入正確的機器碼才能啟動核心。 但事實上,無論