二:内核启动
一:流程
sudo vim /etc/network/interfaces
sudo chmod 0666 /etc/default/tft...... //修改可读
uboot命令:
help/? : 帮助手册,列出uboot支持的所有命令
printenv/print 打印环境变量
setenv ipaddr 192.168.xx.xx 设置环境变量
setenv ipaddr 删除环境变量
saveenv 保存环境变量
ping serverip 检查网络连接(uboot下是单向的,只能从uboot ping ubuntu)
内核启动:
设置serverip(ubuntu有限网卡的ip)及ipaddr(开发板)在同一网段
tftp 0x30008000 uImage 通过tftp服务将serverip中的uImage下载到内存的0x30008000地址处
bootm 0x30008000 启动0x30008000地址处的内核
二:内核恐慌
(driver?)
1f04 262144 mtdblock4 (driver?)
Kernel panic - not syncing: VFS: Unable to mount root fs on unknown-block(2,0)
Backtrace:
因为没有向内核传参(根文件系统类型/xxxxxx)
三:编译内核
嵌入式系统:软硬件可裁剪的专用计算机系统
1.1Kconfig
Kconfig 定义menuconfig中的配置选项 ---每个目录下都有一个Kconfig文件---make menuconfig中的所有配置选项都在Kconfig中定义make menuconfig /搜索可查到对应搜索文件的路径 ---- 活地图
1:过程
//以下所有操作均在linux内核源码顶层目录进行// /linux-2.6.32.2
1.拷贝默认配置到 .configcp config_mini2440_td35 .config //拷贝到config .开头是隐藏文件//官方配置都在arch/arm/configs
2.make menuconfig
3.make uImage //静态编译内核 -j8 意思用8核线程来编译make modules //编译内核模块make //内核及模块都编译--------------------------------------------ls -a //显示文件(包括隐藏文件)
sudo vim /home/linux/ARM/linux-2.6.32.2/kernel/timeconst.pl//修改把对应报错的行数注释 #val
make uImage
---------------------------------------------------
linux@ubuntu:~/ARM/linux-2.6.32.2$ make uImage -j8CHK include/linux/version.hSYMLINK include/asm -> include/asm-arm
make[1]: 'include/asm-arm/mach-types.h' is up to date.CHK include/linux/utsrelease.hCALL scripts/checksyscalls.shCHK include/linux/compile.hKernel: arch/arm/boot/Image is ready//流程1Kernel: arch/arm/boot/zImage is ready//流程2UIMAGE arch/arm/boot/uImage//流程3
Image Name: Linux-2.6.32.2-FriendlyARM
Created: Mon Aug 25 16:04:46 2025
Image Type: ARM Linux Kernel Image (uncompressed)
Data Size: 2333148 Bytes = 2278.46 kB = 2.23 MB
Load Address: 30008000
Entry Point: 30008000//两个地址都是一样,但是minicom中,进入的是0x30008040,应该是未定义模式(异常向量表 ,未定义0x40),所以在minicom中进不去,
Image //可以直接使用的内核映像(镜像)
zImage //一段解压程序(代码)+Image的压缩包
uImage //64字节的头信息+zlmage前两个可以直接执行
2:arm编译器
arm-linux-gcc -v //查看编译器
3.继续过程
重复昨天步骤
tftp 0x30008000 uImage
bootm 0x30008000
//有错误,如下
Starting kernel ...undefined instruction //进入了未定义的模式
pc : [<30008008>] lr : [<33f01200>] //函数返回地址
sp : 33affdd0 ip : 33affd88 fp : 00000000
r10: 33f356d0 r9 : fff3032c r8 : 33afff64
r7 : 33f351b8 r6 : 00000000 r5 : 33f356d0 r4 : 30008000
r3 : 33afffdc r2 : 30000100 r1 : 000007cf r0 : ea000014
Flags: nzCv IRQs off FIQs off Mode SVC_32
Resetting CPU ...resetting ...
错误解决:
在arch/arm/boot/Makefile 中 64中
quiet_cmd_uimage = UIMAGE $@cmd_uimage = $(CONFIG_SHELL) $(MKIMAGE) -A arm -O linux -T kernel-C none -a $(LOADADDR) -e 0x30008040 \ -n'LinUX-$(KERNELRELEASE)'-d $< $@C none -a $(LOADADDR) -e 0x30008040 \ 改成未定义mode
4.hello.c(向内核新加文件)
1.在drivers/char目录下创建并编辑hello.c文件2.修改drivers/char下的Makefile新加一样eg:obj-$(CONFIG_HELLO)+=hello.o
3.在同层目录下修改Kconfig,添加一个hello的配置ps:只有Kconfig中定义的配置才会出现在make menucofnig中
4.make menuconfig修改关于hello的配置
5.make uImage
5.整个过程
//1.在drivers/char目录下创建并编辑hello.c文件 1.vi demo.c
static int __init demo_init(void)
{int ret = 0;dev = MKDEV(MAJOR_NUM, MINOR_NUM);cdev_init(&cdev, &fops);ret = cdev_add(&cdev, dev, DEV_NUM);if(ret < 0)goto err_cdev_add;ret = register_chrdev_region(dev, DEV_NUM, DEV_NAME);if(ret < 0)goto err_register_chrdev_region;printk("demo_init #######################################...\n");
2.2.修改drivers/char下的Makefile新加一样
//vi Makefileeg:obj-$(CONFIG_HELLO)+=hello.oobj-$(CONFIG_DEMO) += demo.o
3.在同层目录下修改Kconfig,添加一个hello的配置ps:只有Kconfig中定义的配置才会出现在make menucofnig中
// vi Kconfigconfig DEMObool "this is demo_tets"default y---help---this is a test demo_test driver.
4.make menuconfig修改关于hello的配置CONFIG_DEMO=y #关闭
CONFIG_DEMO is not set #开启
5.make uImage
Load Address: 30008000
Entry Point: 30008040sudo cp ./arch/arm/boot/uImage /home/linux/tftpboot/在tftpboot中 tftp 0x30008000 uImagebootm 0x30008000
显示效果
在 bootm 0x30008000过程中会显示的效果eg:
Console: switching to colour frame buffer device 30x20
fb0: s3c2410fb frame buffer device
backlight initialized
demo_init #######################################...//ok
leds initialized
buttons initialized
pwm initialized
adc initialized
解压压缩包sudo tar -xvf xxxx.tar.gz
从windos复制文件到linuxsudo cp "paste as filename" ./