当前位置: 首页 > news >正文

内核编译 day61

二:内核启动

一:流程

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"	./
http://www.dtcms.com/a/350785.html

相关文章:

  • Ubuntu安装及配置Git(Ubuntu install and config Git Tools)
  • Linux 磁盘文件系统
  • 【银河麒麟桌面系统】PXE实现arm、x86等多架构安装
  • Linux-进程相关函数
  • Vulkan学到什么程度才算学会
  • 关系轮-和弦图的可视化
  • VPS一键测试脚本NodeQuality,无痕体验+自动导出,服务器测试更轻松
  • illustrator-01
  • 我的项目管理之路-组织级项目管理(二)
  • ASW3642 pin√pin替代TS3DV642方案,可使用原小板只需简单调整外围|ASW3642 HDMI二切一双向切换器方案
  • QT6软件设置图标方法
  • Chrome插件开发:在网页上运行脚本
  • 6种简单方法将大视频从iPhone传输到PC
  • 音频相关数学支持
  • C++ 类型转换深度解析
  • 【应急响应工具教程】Unix/Linux 轻量级工具集Busybox
  • 为什么软解码依然重要?深入理解视频播放与开发应用(视频解码)
  • STM32F103C8T6引脚分布
  • 1. 并发产生背景 并发解决原理
  • 【JavaEE】文件IO操作
  • MyBatis 从入门到精通:一篇就够的实战指南(Java)
  • 最大子数组和【栈和分治两种思路】
  • Linux简明教程01 基础运维
  • C标准库 ---- locale.h
  • Escrcpy 3.0投屏控制软件使用教程:无线/有线连接+虚拟显示功能详解
  • 什么是生命体AI
  • TCP和UDP的使用场景
  • 【系统分析师】高分论文:论软件需求验证方法及应用
  • 用蒙特卡洛法求解三门问题和Π
  • day20 二叉树part7