内核移植基础.

Slides:



Advertisements
Similar presentations
1 97 年度新住民子女教育研討會 九十七年十月二十九日 柯伯儒 [1] 詹雅琄 [2] [1] [2] [1] [1] 國立台北教育大學課程與教學研究所博士生、 彰化縣二林鎮廣興國小主任 [2] [2] 國立台中教育大學課程與教學研究所研究生、 彰化縣二林鎮廣興國小教師 有效提升國小新住民子女 語文學習的策略.
Advertisements

1 I/O 设备访问方式和类型. 2 Overview n The two main jobs of a computer: l I/O (Input/Output) l processing n The control of devices connneted to the computer is.
語文教學分享心得 組員: B 蘇品綺 B 張慈真 B 陳怡君 B 蕭美玲 B 王雅萍 B 蔡佳珍.
環保 環保問題社會病態行為 從選購產品方面 家庭廢棄物的處理 住家的節約能源方面. 環保問題社會病態行為 社會功利主義過盛,疏忽善盡設備的責任; 缺乏惜福愛物的觀念,以自我為重心,任 意破壞使用資源; 「家」的觀念過度狹隘,只顧裝修生活的 表面,缺乏公同經營人類共有的家 — 地球 的概念; 無正確的理財觀念,而以金錢的謀取為目.
縮短公共工程工期之 招標決標策略及作法 行政院公共工程委員會 1. 簡報大綱 壹、前言 貳、招標決標策略及作法 参、適用案件類型 肆 、 結語 2.
宿建德江 內容探究 問題討論 語文小詞典 絕句淺說 借代修辭 (補充說明借代法) 延伸閱讀 應用練習 (二)
母親的教誨 胡適 投影片設計:邱芳芸、謝瑞珍.
工 业 产 品 设 计 广义的工业设计:产品设计、环境设计、视觉传达设计。 狭义的工业设计:产品设计。
第五章银行负债业务 孙小平 经济教研室.
NEUSOFT Institute of information Technology .ChengDu
建设工程保险制度案例分析 班级:建工134 学号: 姓名:韩秀昆.
岳麓版历史必修一 近代西方资本主义政体的建立 近代西方资本主义政体的建立 山东师大附中 侯新磊.
第7章 樹與二元樹 (Trees and Binary Trees)
如何生动形象地 写人记事.
小组工作实训课(1) 第 教案 04.
心在哪裡 夢在哪裡.
香港普通話研習社科技創意小學 周順強老師.
第12课时 对自己的行为负责 在承担责任中成长 考 点 聚 焦 考 题 探 究 考 点 拓 展 1.
不为追"星"所累 (三) 第四课 青春故事 授课人:商城县汪桥一中王启学.
技术试验及其方法 制作者 : 贾琼瑞
宁波万里国际学校 陈湘龙
贴近教学 服务师生 方便老师.
基于Android的开源平板电脑 (FSPAD723)系统构成分析
基于ARM和linux的开发 华中科技大学 武汉创维特 2017/3/20.
嵌入式操作系统 陈天洲、陈文智.
UClinux在3000平台上的移植.
足太阳膀胱经.
心理的力量 --兼谈教师心理压力的调适
歡迎蒞臨 一年二班家長日.
<<文獻學學習報告>>
2007 學校國民教育 交流研討會 學校經驗分享.
Linux Further.
典藏豐富、深具特色的小型博物館 鹽分地帶文化館興建募款啟事 施工中 歡迎蒞臨參觀 建館緣由
内核移植实例.
主題課程的設計與實例 黃繼仁 課程發展與設計.
PIC16F1827介紹 以微控器為基礎之電路設計實務-微處理器實驗室.
配置编译内核.
Bootloader技术分析.
嵌入式系統架構 長高科技 顏旭偉.
第12章 樹狀搜尋結構 (Search Trees)
怎样从0开始写bootloader? 李明 北京亚嵌教育研究中心
CH.8 硬體管理.
陈香兰 助教:陈博、李春华 Spring 2009 嵌入式操作系统 陈香兰 助教:陈博、李春华 Spring 2009.
在專用的嵌入式板子運行 GNU/Linux 系統已經變得越來越流行。一個嵌入式 Linux 系統從軟體的角度看通常可以分為四個層次:
u-boot环境变量和常用命令 广州创龙电子科技有限公司
I2C驱动 广州创龙电子科技有限公司 Guangzhou Tronlong Electronic Technology Co., Ltd.
嵌入式系统的Boot Loader技术 陈文智 浙江大学计算机学院 2009年5月.
Chapter 6 Linux 檔案權限與目錄配置 VBird 2005/08/03
Ch9 Communicating with Hardware
(第2版).
Linux核心編譯與模組管理 2013/01/19.
第3章 認識處理元.
注音符號 首冊教學 說明.
Author:BobZhang Copy Right 2007
(第2版).
閩南語初階研習報告 《我的冊包》 改編自康軒版第一冊第二課 程詩嵐 林幸玫 李佩瑾 吳瑛瑛 李逸琦 朱嬿蓉.
中華大學 資訊工程學系 報告人:資訊工程學系 許慶賢 系主任.
中国科学技术大学计算机系 陈香兰 2013Fall 第七讲 存储器管理 中国科学技术大学计算机系 陈香兰 2013Fall.
Chapter 7 掌控記憶體.
嵌入式Linux开发流程 成都研究所操作系统团队.
第7章 樹與二元樹(Trees and Binary Trees)
資料結構使用Java 第9章 樹(Tree).
幼稚園課程標準中的節奏樂器教學 4990U014李宜芸 4990U047陳靜芳 4990U049黃鈴珊 4990U050葉佩汾
Chapter 7 掌控記憶體.
ARM裸机第一部分-ARM那些你得知道的事
進階資料結構(2) Disjoint Sets
分組專題報告 陳錦蓮、陳麗妃製作.
沪粤版八年级物理 3.5 奇妙的透镜.
客語歌謠-四季歌 台中市葫蘆墩國小教師 吳國銘 張郁棻.
ARM裸机第一部分-ARM那些你得知道的事
Presentation transcript:

内核移植基础

内核移植基础 移植的基本工作 Linux设备树 Linux内核启动流程

移植的基本工作

移植的基本工作 板级移植通常要做以下基本工作: 移植后的工作 选择参考板 参考板Linux设备驱动工作正常,至少已经驱动基本接口。 对内核进行裁剪和添加功能 移植后的工作 $ cd linux-3.14.25-fs4412/ $ cp .config arch/arm/configs/fs4412_defconfig $ make ARCH=arm distclean $ cd ../ $ diff -urN linux-3.14.25/ linux-3.14.25-fs4412/ > patch-linux- 3.14.25-fs4412 $ xz patch-linux-3.14.25-fs4412

Linux设备树 Device Tree是一种描述硬件的数据结构,它起源于 OpenFirmware (OF)。 Device Tree由一系列被命名的结点(node)和属性(property)组成,而 结点本身可包含子结点。所谓属性,其实就是成对出现的name和value。在 Device Tree中,可描述的信息包括(原先这些信息大多被hard code到 kernel中 CPU的数量和类别 内存基地址和大小 总线和桥 外设连接 中断控制器和中断使用情况 GPIO控制器和GPIO使用情况 Clock控制器和Clock使用情况

Linux设备树 DTS(device tree source) .dts文件是一种ASCII 文本格式的Device Tree描述,此文本格式非常人性化, 适合人类的阅读习惯。基本上,在ARM Linux在,一个.dts文件对应一个ARM 的machine,一般放置在内核的arch/arm/boot/dts/目录。 如:arch/arm/boot/dts/exynos4412-origen.dts 由于一个SoC可能对应多个machine(一个SoC可以对应多个产品和电路板), 势必这些.dts文件需包含许多共同的部分,Linux内核为了简化,把SoC公用 的部分或者多个machine共同的部分一般提炼为.dtsi,类似于C语言的头文件。 如:arch/arm/boot/dts/skeleton.dtsi

Linux设备树 设备树语法: .dts和.dtsi文件的基本元素为结点和属性 有一个root结点”\”,,root结点下又可以有一系列子节点如: / { node1 { child-node1{ }; child-node2{ node2 {

Linux设备树 根节点属性 model :表示具体某一个machine / { model = "Insignal Origen evaluation board based on Exynos4412"; compatible = "insignal,origen4412", "samsung,exynos4412"; #address-cells = <1> #size-cells = <1> … }; model :表示具体某一个machine compatible:表示支持的一系列machine,第一个是主要支持machine,后边是 兼容的machine,用来表示每个设备的子节点也有这个属性,用来将驱动和设 备绑定。

Linux设备树 子节点属性 compatible:同上用来绑定一个驱动和设备 reg:可寻址设备用来表示编码地址信息,是一个列表 firmware@0203F000 { compatible = "samsung,secure-firmware"; reg = <0x0203F000 0x1000>; }; compatible:同上用来绑定一个驱动和设备 reg:可寻址设备用来表示编码地址信息,是一个列表 格式:reg = <addr1 len1 [addr2 len2] [addr3 len3]> addr表示地址起始,len表示范围,这两个字段长度可变如父节点 #address-cells=<1>和 #size-cells=<1>,0x0203F0000为地址起始,0x1000 为范围,如个父节点#address-cells=<2>和 #size-cells=<0>, 0x0203F0000,0x1000都是地址,如果不希望继承父节点则可以在本结点中添加 #address-cells和 #size-cells的定义

Linux设备树 子节点属性 其他属性: 参考Documentation/devicetree/bindings interrupt-parent interrupts clocks clock-name 还可以根据设备需求自定义属性 设备树与machine_desc的关系 在内核启动过程中设备树中的信息被转换为machine_desc

Linux内核启动流程

Linux内核启动流程 Bootloader -硬件上电后跳到一个固定位置执行相应的代码 第一个用户空间程序 -配置用户环境和执行服务进程 Kernel -内核自解压(zImage) -初始化静态编译进内核的驱动模块 (needed to access the root filesystem)‏ -挂载根文件系统 (needed to access and run userspace programs)‏ -直接执行第一个用户空间程序 Bootloader -硬件上电后跳到一个固定位置执行相应的代码 -初始化相应的设备 (local storage, network, removable media)‏ -加载内核的代码到内存 -跳到内核代码起始位置执行

Linux内核启动流程 arch/arm/boot/compressed/head.S start: …… bl decompress_kernel # 解压内核 b __enter_kernel # 进入解压后的内核 arch/arm/boot/compressed/misc.c void decompress_kernel(……) { putstr(“Uncompressing Linux...”); # 打印解压信息 putstr(" done, booting the kernel.\n"); }

Linux内核启动流程 arch/arm/kernel/head.S ENTRY(stext) …… bl __lookup_processor_type # 处理器是否支持 movs r10, r5 beq __error_p # 不支持则打印错误消息 bl __create_page_tables # 创建页表 ldr r13, =__mmap_switched # 在MMU使能后调用 b __enable_mmu # 使能MMU arch/arm/kernel/head-common.S __mmap_switched: b start_kernel # 进入内核的公共入口

Linux内核启动流程 init/main.c asmlinkage void __init start_kernel(void) { …… setup_arch(&command_line); /* arch/arm/kernel/setup.c */ mdesc = setup_machine_fdt(__atags_pointer); /* 搜索 匹配的机器 */ console_init(); /* 控制台初始化 */ rest_init(); /* 余下的初始化 */ }

Linux内核启动流程 init/main.c rest_init(void) { kernel_thread(kernel_init, NULL, CLONE_FS | CLONE_SIGHAND); schedule_preempt_disabled(); /* 抢占禁止的情况下调用cpu_idle */ cpu_startup_entry(CPUHP_ONLINE); }

Linux内核启动流程 init/main.c kernel_init(void *unused) { kernel_init_freeable(); do_basic_setup(); /* 驱动初始化 */ driver_init(); /* drivers/base/init.c */ do_initcalls(); /* 挂载根文件系统 */ populate_rootfs; /* init/initramfs.c, initramfs或initrd的处理 */ prepare_namespace(); /* 如果没有initramfs或initrd,则从其他设备上挂载根文件系统 */

Linux内核启动流程 if (execute_command) { ret = run_init_process(execute_command); if (!ret) return 0; pr_err(“Failed to execute %s (error %d). Attempting defaults...\n”, …); } /* 否则尝试执行下面的init程序 */ if (!try_to_run_init_process("/sbin/init") || !try_to_run_init_process("/etc/init") || !try_to_run_init_process("/bin/init") || !try_to_run_init_process("/bin/sh")) return 0; /* 所有的尝试都失败,打印错误信息 */ panic("No working init found. Try passing init= option to kernel. " "See Linux Documentation/init.txt for guidance.");