linux内核分析与移植,内核分析移植
1.make menuconfig
添加对s3c2440的支持
system type--> s3c2440 machine--> smdk2440
2. __lookup_machine_type
处理uboot传来的 machine id 获得一个 表示该id的 machine_desc 结构体
smdk2440的 machin_desc 结构体的定义如下/arch/arm/mach-s3c2440/mach-smdk2440.c
MACHINE_START(S3C2440, "SMDK2440")
/* Maintainer: Ben Dooks */
.phys_io = S3C2410_PA_UART,
.io_pg_offst = (((u32)S3C24XX_VA_UART) >> 18) & 0xfffc,
.boot_params = S3C2410_SDRAM_PA + 0x100,
.init_irq = s3c24xx_init_irq,
.map_io = smdk2440_map_io,
.init_machine = smdk2440_machine_init,
.timer = &s3c24xx_timer,
MACHINE_END
3. setup_arch函数
函数的目的 处理uboot传来的tag 参数
__lookup_machine_type 获取machine_desc-->boot_params
parse_tags(tags ) 根据获得的 boot_params 对tags 初步处理
__tagtable(ATAG_MEM, parse_tag_mem32); 内存参数处理函数的定义
在全局结构变量meninfo结构中增加内存的描述
__tagtable(ATAG_CMDLINE, parse_tag_cmdline);命令行参数(bootargs)处理函数的定义
将命令行字符串拷贝为 default_command_line
parse_cmdline(cmdline_p, from); 进一步处理 default_command_line
__early_param("mem=", early_mem); 当bootargs里有 men=xxx 时执行early_men函数 进行处理
__early_param("initrd=", early_initrd); 当bootargs里有 initrd=xxx 时执行early_initrd函数进行处理
paging_init(&meminfo, mdesc); 对上边的 meninfo结构处理
--> devicemaps_init(mdesc);
-->(mdesc->map_io()) 这里的mdesc就是上边的 machine_desc 结构体
map_o 就是smdk2440_machine_init()
smdk2440_machine_init()代码如下 该函数主要用于 设置外部晶振12000000
该函数在mach_smdk2440.c中定义
static void __init smdk2440_map_io(void)
{
s3c24xx_init_io(smdk2440_iodesc, ARRAY_SIZE(smdk2440_iodesc));
s3c24xx_init_clocks(16934400);
s3c24xx_init_uarts(smdk2440_uartcfgs, ARRAY_SIZE(smdk2440_uartcfgs));
}
4.parse_args()
setup_arch()函数并没有全部处理完tag参数 比如 ttySAC0= XXX
这个函数会继续处理 并对已处理的参数进一步处理
5.console_init()
该函数依次调用 __con_initcall_start 与 __con_initcall_end之间定义的每个函数
这些函数用宏 console_initcall( fn )定义 例如console_initcall(s3c24xx_serial_initconsole)
s3c24xx_serial_initconsol函数在/dev/serial/s3c2410.c中定义
-->register_console(&s3c24xx_serial_console); //向内核注册控制台
s3c24xx_serial_console 为一个结构体
6.修改MTD分区
MTD---内存技术设备
7.驱动对设备的识别
内核确定设备的信息 加载驱动时将驱动程序与设备信息比较
如果驱动和某个设备匹配 则通过该驱动操作这个设备
内核里设备的信息用 结构体表示
设备 struct platform_device {
const char * name;
u32 id;
struct device dev;
u32 num_resources;
struct resource * resource;
};
驱动 struct platform_driver {
int (*probe)(struct platform_device *);
int (*remove)(struct platform_device *);
void (*shutdown)(struct platform_device *);
int (*suspend)(struct platform_device *, pm_message_t state);
int (*suspend_late)(struct platform_device *, pm_message_t state);
int (*resume_early)(struct platform_device *);
int (*resume)(struct platform_device *);
struct device_driver driver;
};
10. 默认的arm的mtd的分区在arch/arm/plat-s3c24xx/common-smdk.c文件中的smdk_default_nand_part结构体里
linux内核分析与移植,内核分析移植相关推荐
- linux内核体系学习路径_Linux内核分析(一)linux体系简介|内核源码简介|内核配置编译安装...
从本篇博文开始我将对linux内核进行学习和分析,整个过程必将十分艰辛,但我会坚持到底,同时在博文中如果那些地方有问题还请各位大神为我讲解. 今天我们会分析到以下内容: 1. Linux体系结构简介 ...
- Linux内核的Nand驱动流程分析
最近在做Linux内核移植,总体的感觉是这样的,想要彻底的阅读Linux内核代码几乎是不可能的,至少这还不是嵌入式学期初期的重要任务.内核代码解压后有250M左右,据统计,有400多万行,而且涉及到了 ...
- 十六.linux开发之Kernel移植——内核的配置和编译原理
有道云笔记地址: 详情看这里链接,记录太多,就不一一排版了. http://note.youdao.com/noteshare?id=d25dbce79566963e3699574a74048154& ...
- Linux内核IP Queue机制的分析(一)
将会通过包括本文在内的三篇文章,对IP Queue机制从用户态的应用到内核态的模块程序设计进行分析.三篇文章的题目分别是: Linux内核IP Queue机制的分析(一)--用户态接收数据包 Linu ...
- linux收发包内核进程名称,Linux内核IP Queue机制的分析(一)——用户态接收数据包...
序 笔者将会通过包括本文在内的三篇文章,对IP Queue机制从用户态的应用到内核态的模块程序设计进行分析.三篇文章的题目分别是: Linux内核IP Queue机制的分析(一)--用户态接收数据包 ...
- linux系统移植---内核移植(3)
linux内核移植 参考:https://blog.csdn.net/qq_27516841/article/details/80565622 内核开源下载网站:www.kernel.org 一.前言 ...
- 十七.linux开发之Kernel移植——内核的启动过程分析
有道云笔记地址: 详情看这里链接,记录太多,就不一一排版了. http://note.youdao.com/noteshare?id=e68caf68c259bc3491dd7f8c4ac4bb99& ...
- 讯为开发板移植linux,迅为I.MX6ULL开发板移植Linux5.4内核教程
4412上移植最新5.4内核的流程非常的简单,因为4412被Linux官方支持,那么我们来看一下怎么把官方5.4内核移植到我们的I.MX6ULL终结者开发板上. 平台:i.MX6ULL开发板 前言 本 ...
- 【移植Linux 3.4.2内核之四】修改内核代码支持YAFFS文件系统
上一篇文章,我们从0制作jffs2文件系统,因为我们的内核本身就支持iffs2文件系统,但是它不支持yaffs文件系统.今天我们就来修改内核代码,让内核支持yaffs文件系统的格式. 1.首先我们获取 ...
- Linux内核 eBPF基础:kprobe原理源码分析:源码分析
Linux内核 eBPF基础 kprobe原理源码分析:源码分析 荣涛 2021年5月11日 在 <Linux内核 eBPF基础:kprobe原理源码分析:基本介绍与使用>中已经介绍了kp ...
最新文章
- EDA电子设计技术与应用
- 文档扫描仪的构建——使用Python,OpenCV应用透视变换来获得图像的自顶向下的“鸟瞰图”
- Elasticsearch使用BulkProcessor批量插入
- python 用lambda表达式代替简单的函数, 匿名函数
- 《架构探险——从零开始写Java Web框架》这书不错,能看懂的入门书
- mvc html validator,ASP.NET MVC实现Validation验证器扩展
- php划分年龄段,儿童时期是怎样划分年龄阶段的
- 阶乘和(信息学奥赛一本通-T1173)
- 基于权重的节点驱逐 - Oracle RAC 12.2 新特性
- 神经网络技巧篇之寻找最优参数的方法【续】
- C# 访问mongodb数据库
- 来自联通302的问候
- WPF 动态添加控件以及样式字典的引用(Style introduction)
- PB通过VDN实现Http上传、下载
- 2020中兴捧月-傅里叶-丰收祭赛题常规解法
- MPEG-TS封装格式数据
- 学术-物理-维空间:一维空间
- 期货涨跌与什么有关(期货和股市涨跌有关系吗)
- 5G产业——新智能时代革命
- linux大作业聊天室报告,Linux聊天室系统期末大作业.docx
热门文章
- ASP.NET Core 2.2 项目升级至 3.0 备忘录
- [译].Net中的内存-什么分配在了哪里
- TIOBE 6月排行:C# 以微弱的优势超过了 Visual Basic .NET 的排名,再次进入 TOP 5
- 为您的机器配置开发环境
- 现身说法:实际业务出发分析百亿数据量下的多表查询优化
- Visual Studio 2017 与 Visual Studio for Mac 支持更新
- Entity Framework中的字符串插值引发担忧
- C#在Linux+Mono环境中使用微信支付证书
- 实验2 java_《Java程序设计》实验2
- 【数据库原理及应用】经典题库附答案(14章全)——第八章:数据库并发控制