当前位置:文档之家› Linux内核移植开发手册

Linux内核移植开发手册

Linux内核移植开发手册
Linux内核移植开发手册

江苏中科龙梦科技有限公司

Linux内核移植开发手册

修 订 记 录

项 次 修订日期 版 本修订內容修订者审 核

1 2009‐02‐04 0.1 初版发行陶宏亮,

胡洪兵

2 2009‐11‐20 0.2 删除一些

多余文字

陶宏亮,

胡洪兵

DISCLAIMER

THIS DOCUMENTATION IS PROVIDED FOR USE WITH LEMOTE PRODUCTS. NO LICENSE TO LEMOTE PROPERTY RIGHTS IS GRANTED. LEMOTE ASSUMES NO LIABILITY, PROVIDES NO WARRANTY EITHER EXPRESSED OR IMPLIED RELATING TO THE USAGE, OR INTELLECTUAL PROPERTY RIGHT INFRINGEMENT EXCEPT AS PROVIDED FOR BY LEMOTE TERMS AND CONDITIONS OF SALE.

LEMOTE PRODUCTS ARE NOT DESIGNED FOR AND SHOULD NOT BE USED IN ANY MEDICAL OR LIFE SUSTAINING OR SUPPORTING EQUIPMENT.

ALL INFORMATION IN THIS DOCUMENT SHOULD BE TREATED AS PRELIMINARY. LEMOTE MAY MAKE CHANGES TO THIS DOCUMENT WITHOUT NOTICE. ANYONE RELYING ON THIS DOCUMENTATION SHOULD CONTACT LEMOTE FOR THE CURRENT DOCUMENTATION AND ERRATA.

JIANGSU LEMOTE TECHNOLOGY CORPORATION LIMITED

MENGLAN INDUSTRIAL PARK,YUSHAN,CHANGSHU CITY,JIANGSU PROVINCE,CHINA

Tel: 0512‐52308661

Fax: 0512‐52308688

Http: //https://www.doczj.com/doc/492728566.html,

目 录

1. Linux内核移植开发手册 (4)

1.1 内核源码访问途径 (4)

1.2 内核的编译环境及其配置 (4)

1.2.1本地编译 (4)

1.2.2 交叉编译 (4)

1.2.3 内核配置 (5)

1.3 如何编译内核和内核模块 (5)

1.3.1 编译内核 (5)

1.3.2 编译内核模块 (6)

1.4 龙芯平台代码移植框架 (6)

1.4.1 创建文件结构框架 (6)

1.4.2 Loongson2f cpu 支持 (7)

1.4.3 特定平台的支持 (7)

1.4.4 PCI子系统 (8)

1.5 龙芯平台代码描述 (8)

1.5.1中断 (8)

1.5.2 PMON内核读写模块 (13)

1.6 龙芯优化补丁描述 (15)

1.6.1 Uncache accelerate (15)

1.6.2 CS5536 Audio DMA (优化补丁) (16)

1. Linux内核移植开发手册

1.1 内核源码访问途径

如果系统自带了内核源码,你可以在/usr/src/目录下找到它,一般会以压缩文件呈现。如 linux‐source‐x.x.xx‐tar.bz2(其中x.x.xx标示了内核版本号)。在其所在目录下,通过: tar ‐xvf linux‐source‐x.x.xx‐tar.bz2

命令来解压此压缩包,阅读,学习。在内核源码根目录下的arch/mips/lemote/子目录中, 包含龙芯平台相关的大部分代码。

如果你没有龙芯电脑,你可以通过网站浏览到Linux内核源码,网址是:

https://www.doczj.com/doc/492728566.html,/code/linux_loongson

它是由git管理的龙芯相关项目开发的一个子项目,在这里,你可以跟踪此项目的每一次改动克隆到本地,创建分支,做你自己开发,使用:

git‐clone git://https://www.doczj.com/doc/492728566.html,/linux_loongson

当然,前提是你的电脑里已经安装了git工具.关于git的介绍和使用,你同样可以在这个开 发网站的热门文章里找到,也可以访问以下链接:

https://www.doczj.com/doc/492728566.html,/drupal/node/21

1.2 内核的编译环境及其配置

1.2.1本地编译

在建立编译环境前,建议您在/etc/apt/sources.list中加入龙芯官方源

deb https://www.doczj.com/doc/492728566.html,/debian‐loongson loongson contrib main non‐free

deb https://www.doczj.com/doc/492728566.html,/debian testing contrib main non‐free

并使用 apt‐get update 更新以启用源。

安装gcc:

apt‐get install gcc

更新/usr/bin/下的as文件:

下载地址:

https://www.doczj.com/doc/492728566.html,/files/toolchain/kernel/as

mv /usr/bin/as /usr/bin/as‐bak /*备份以前的as*/

cp as /usr/bin/ /*拷贝到下载的as,到指定目录*/

1.2.2 交叉编译

相对于本地编译, 交叉编译是一种更简单,快捷的编译方法,你只需要一套额外的交叉编译工具就可以在速度更快的pc平台甚至服务器上编译龙芯平台可执行的程序,内核。需要下载交叉编译工具:

gcc‐3.4.6‐newbin.ls2f.tar.gz

下载地址: https://www.doczj.com/doc/492728566.html,/debian‐loongson/code/

解压,一般放到/opt目录下,:

tar ‐xzf gcc‐3.4.6‐newbin.ls2f.tar.gz ‐C /opt

然后在环境变量中制定其路径:

export PATH=/opt/gcc‐3.4.6‐newbin/bin:$PATH

或者写入~/.bashrc中,便于多次使用:

export PATH=/opt/gcc‐3.4.6‐newbin/bin:$PATH

设置可执行权限

chmod +x /opt/gcc‐3.4.6‐newbin/bin ‐R

现在就可以在主机上编译龙芯平台可运行的内核了。

1.2.3 内核配置

在内核源码根目录输入: make menuconfig 会打开内核配置的图形界面。进行内核的配置, 当然对于龙芯平台不熟悉的人,从开头逐项进行内核配置是困难,迷惑的.我们提供了默认配置,你只需要在此基础上修改你所需要变更的选项。在源码根目录下: cp arch/mips/config/ls2f_xxxx_defconfig .config

(其中xxxx,为分支平台标记)

注: 目前在arch/mips/config/目录下,有3个龙芯平台的配置文件

fulong_defconfig 为福珑2E mini PC的默认配置文件

ls2f_fulong_defconfig 为福珑2F mini PC 的默认配置文件

ls2f_notebook_defconfig 为福珑 2F 笔记本的默认配置文件

然后再进行 make menuconfig你会看到默认配置已经写到配置界面中去了,它本身已经是一个附带多种功能和支持的可运行的内核配置,你可以在其上添加你想要的,去掉你不喜欢的。当然,你得清楚你在做什么。

1.3 如何编译内核和内核模块

1.3.1 编译内核

本地编译情况下,在内核源码根目录下,输入Make来完成内核的编译。

交叉编译情况下, 进入内核源码树根目录下,输入:

make ARCH=mips CROSS_COMPILE=mipsel‐linux‐

如果你说,你总是会反复编译,调试内核.这样的一条冗长繁琐的命令令你烦恼.人们总喜欢那些一劳永逸的办法, 好吧,修改你内核根目录下的makefile文件:

给ARCH变量赋值: ARCH ?= mips

给CROSS_COMPILE 变量赋值CROSS_COOMPILE ?= mipsel‐linux‐

1.3.2 编译内核模块

在make 完以后,实际上配置内核时所选的模块已经都编译好了,只是分别放在其源码所在的位置。我们只需要把他们安装到文件系统/lib/modules/中去,或者任意指定的目录。

如果想单独编译模块,那么:

make modules /*编译内核模块*/

make modules_install /*把编译好的模块安装到/lib/modules/下面*/

or make modules_install INSTALL_MOD_PATH=dir /*安装到dir目录下*/

当然,还有一种情况,你只是想编译单一模块,来添加个别功能. 比如你获得了一个硬公司提供的更好的,更新的网卡,或者显卡驱动.你想做尽量小的 改动,就使用它们,你需要: 进入你想编译的模块所在目录,执行:

make ‐C /usr/src/linux‐x.x.xx/ M=`pwd` modules

意思是说,先改变目录到你的内核源码树所在位置,编译此内核的模块

cp *.ko /lib/modules/`name ‐r`/driver/

然后把编译好的模块拷贝到系统模块的默认位置

depmod ‐a

生成modules.dep 文件和 映射文件

modprobe name.ko

然后,你就可以用modprobe把模块插入当前运行的内核,使用它

1.4 龙芯平台代码移植框架

代码移植需要注意的是平台相关中断的管理以及时钟的初始化,除此还需注意文件的结构以及相关配置文件(即Makefile,Kconfig)的修改。以Fuloong2f 代码为例讲解(具体代码参考git仓库)。

先简单的介绍一下kernel的执行流程:

在龙芯平台上通过pmon 将内核文件载入内存,开始运行,在内核开始处将bbs段进行清零处理,建立栈空间。完成后跳转到 start_kernel(),在start_kernel() 里面完成 arch_setup(), trap_init(), init_IRQ(), time_init(),init_mem(),init_ console()等等的初始化,rest_int() 启动init kerner线程 运行用户空间的/sbin/init进程等。

1.4.1 创建文件结构框架

arch/mips 下面有许多的目录,每个目录对应一块板子。在该目录下我们创建 arch/mips/lemote/ 将其命名为公司的名字只是为了我们方便管理平台相关的代码。

Loongson主要用于桌面不像其他的SOC ,这样可以尽可能多的共享一些代码。

在下面定义了arch/mips/lemote/lm2e 以及 arch/mips/lemote/lm2f 分别对应于

2e以及2f cpu,2f用于yeloong 以及fuloong 为了分别再定义了

arch/mipse/lemote/lm2f/lmbox/ 以及 arch/mips/lemote/lm2f/lmbook/。

arch/mips/lemote/common/ 下是两者可以共享的代码。相应的在头文件中我们添加了

include/asm‐mips/mach‐lemote/ 以便于添加平台相关的一些宏定义。

在arch/mips/Makefile中添加指向龙芯平台的编译选项。

在arch/mips/Kconfig中添加配置选项的支持以便于用户的配置选择。

1.4.2 Loongson2f cpu 支持

在文件arch/mips/cpu.h 添加Loongson相关的

loongson为mips64的在cpu_type_enum填入CPU_LOONGSON2

定义 #define PRID_IMP_LOONGSON2 0x6300

后面的数据定义是通过查Loongson2F手册定义的

在arch/mips/kernel/cpu‐probe.c中定义cpu type为loongson2f的支持

1.4.3 特定平台的支持

在arch/mips/lemote/lm2f/lmbox/ 下创建setup.c 以便于添加板级初始化设置相关的代码在这里需要实现的两个重要的函数为plat_time_init() plat_mem_init() arch/mips/mm/*

板级中断代码的支持

在开始书写中断管理代码时我们需要将Fuloong平台的中断路由的途径,中断源的列表,他们对应的中断控制器以及这些控制器之间怎么级联的情况搞清楚。具体的说明参考中断描述一节。

为了完成一个中断的服务,大概需要四个部分的共同工作。

他们包括:

A: 中断探测以及分发: 确定中断源以及相应的中断号。

B: do_IRQ(): 通过传递的参数去查找 driver注册上的相应中断处理程序。

C: 各个中断控制器的描述: 包括提供控制器初始化函数,为do_IRQ的中断处理过程提

供ack, mask, unmask等方法。

D: 实际的中断处理程序: 这是各个driver通过request_irq()注册的中断处理函数。

我们需要实现的为第一部分以及第三部分

关于中断的分发的实现 可参考中断描述一节

struc Irq_chip 数据结构用于描述各个中断控制器。在Fuloong平台上中断控制器有Loongson2f cpu,Bonito以及8259As。Loongson2f cpu与 8259As在kernel里面已经实现,可以参考arch/mips/kernel/irq_cpu.c以及arch/mips/kernel/i8259.c

Bonito的实现在 arch/mips/lemote/lm2f/lmbook/bonito_irq.c

创建arch/mips/lemote/lm2f/lmbox/irq.c

该文件主要用于中断的初始化以及中断分发函数的实现plat_irq_dispatch() 以及 arch_init_irq()

Timer 初始化设置等

在Fuloong平台上,可以使用的时钟源来自两处,cpu 或者 mfgp。

mfgp用于对动态变频的支持,mfgp的初始化可以参考动态变频一节。

使用mips 的 arch/mips/lemote/lm2f/lmbox/setup.c

plat_time_init() [plat_timer_setup()]

1.4.4 PCI子系统

PCI总线有三个独立的地址空间 config空间, I/O空间以及 mem空间。

每一个pci设备必须响应配置命令,可以响应io访问和/或mem的访问。

在启动阶段 BIOS 或者 OS 通过对配置空间的访问来设置 BARs,BARs决定了这个设备对某个IO 或者 mem地址空间的访问是否响应,在一条总线上绝对不能出现地址空间分配发生重合的情况。

对兼容机来说 BIOS会将各个PCI设备的资源进行分配 LINUX只需简单读取BARs地址就可以了,而龙芯的机器上由于pmon的一些限制不能够很好的分配更大的MEM空间所以在kernel中重新对这些资源进行分配。

关于资源的映射可参考地址分配一节。

在 arch/mips/lemote/lm2f/common/pci.c 中定义了pci的io以及mem资源的范围。

在arch/mips/pci/fixup‐lm2f.c 中对一些设备的配置头进行了修正以及pci设备irq 的查询表。

在arch/mips/pci/ops‐loongson2f.c 中为高层的配置空间访问函数提供了平台相关的底层实现。

Linux kernel内核对PCI三个空间地址的访问支持:

对于配置空间 kernel提供了高层的抽象pci_read_config_byte()等。

IO空间的访问,可以通过inb()等来访问,在Loongson平台,我们将IO空间映射到一块临近的地址空间。通过set_io_port_base()来设置IO空间的基地址。

mem空间访问,可以通过readb()等来实现,在Loongson平台,我们认为mem空间与 cpu的物理地址空间是一一对应的,对mem空间的访问,就相当于直接对物理内存访问一样。

调试建议:

如果在移植过程中不是那么顺利可以使用prom_printf通过串口来打印

将printk 换为 prom_printf()就行了

参考代码 arch/mips/lemote/lm2f/lmbox/dbg_io.c 以及

arch/mips/lemote/lm2f/lmbox/prom.c

1.5 龙芯平台代码描述

1.5.1中断

这里讨论的是硬件中断。先以Fuloong2f为例简单介绍一下龙芯平台中断处理的流程再以代码分析详细说明,大抵流程是:

中断发生时,硬件设置cause寄存器的Excode域以及相应的IP位。开始软件处理软件通过查询Excode确定使用哪一类异常处理例程,异常处理再调用平台相关的中断分发函数。平台函数再确定具体的发出中断的设备,然后执行do_IRQ()中断服务。 Loongson 2F CPU 引出的硬件中断引脚有4个:

INTn0 连接南桥8259As INTn2

INTn1 为cpu串口使用 INTn3

PCI的中断是通过PCI_IRQ#A(BCD)引脚联入cpu的。

相关代码描述在arch/mips/lemote/lm2f/lmbox/irq.c中。

第一级:中断判断 (cause寄存器IP位域定义)

IP7(timer 内部时钟中断),

IP6(bonito北桥),

IP5()

IP4()

IP3(cpu的uart)

IP2(8259As 南桥)

IP1(软件使用)

IP0(软件使用)

第二级:平台中断号分配

0~63中断号其中的0‐15号被分配给了8259中断控制器; 16‐23号被分配给了MIPS CPU;

而32‐63号被分配给了Bonito 北桥。

8259的0‐15号中断分配细节:

0 保留

1 i8024

2 级联

3 uart

4 红外

5‐7 保留

8 rtc

9 audio

10 保留

11 南桥usb共享

12‐13 保留

14 ide0

15 保留

MIPS CPU 16‐23号中断分配细节:

16‐22 保留

23 timer

Bonito北桥32‐63号中断分配细节:

36 eth0

内核中的代码实现,源码请查看arch/mips/pci/fixup‐lm2f.c

#define PCIA 4

#define PCIB 5

#define PCIC 6

#define PCID 7

/* all the pci device has the PCIA pin, check the datasheet. */

static char irq_tab[][5] __initdata = {

/* INTA INTB INTC INTD */

{0, 0, 0, 0, 0 }, /* 11: Unused */

{0, 0, 0, 0, 0 }, /* 12: Unused */

{0, 0, 0, 0, 0 }, /* 13: Unused */

{0, 0, 0, 0, 0 }, /* 14: Unused */

{0, 0, 0, 0, 0 }, /* 15: Unused */

{0, 0, 0, 0, 0 }, /* 16: Unused */

{0, PCIA, 0, 0, 0 }, /* 17: RTL8110‐0 */

{0, PCIB, 0, 0, 0 }, /* 18: RTL8110‐1 */

{0, PCIC, 0, 0, 0 }, /* 19: SiI3114 */

{0, 0, 0, 0, 0 }, /* 20: Unused */

{0, PCIA, PCIB, PCIC, PCID }, /* 21: PCI‐SLOT*/

{0, 0, 0, 0, 0 }, /* 22: Unused */

{0, 0, 0, 0, 0 }, /* 23: Unused */

{0, 0, 0, 0, 0 }, /* 24: Unused */

{0, 0, 0, 0, 0 }, /* 25: Unused */

{0, 0, 0, 0, 0 }, /* 26: Unused */

{0, 0, 0, 0, 0 }, /* 27: Unused */

};

这个表的构造是从连线上来的,

INTA,INTB, INTC,INTD指设备的中断引脚连接。

PCIA(BCD)是指CPU上的PCI连线号。 即cpu上面的四个PCI中断引脚。其中PCIA定义为4, PCIB定义为5等是与pci中断线在中断寄存器中的位相关的。这么定义方便代码书写。

(具体可查看《2F用户手册》中断控制器那一章)

以Longson 2F 的eth0为例,它位于17号slot是单功能设备,一般使用INTA中断引脚。

在CPU端它是连接在PCI_INTA#上的。 所以在对应列 写入PCIA。

如果有其他设备也使用INTA 连入PCI_INTA#上,那么这个设备的中断号与 eth0就是相等的了,这样这两个设备就是共享中断的。

mips对中断的查询是由软件来做的,比如判断具体由南桥哪个设备发出中断,是通过查询irr寄存器的值来确定的[arch/mips/lemote/lm2f/lmbox/irq.c 中的8259dispatch()],它与x86上8259的工作原理是不一样的(x86上中断控制器主动将中断号放到数据线上等待cpu读取。.与中断处理相关的status,cause, epc三个寄存器,以及异常码定义可参考2f用户使用手册。

具体的代码分析:

plat_irq_disaptch() 通过cause, status寄存器IP域与IM域的查询来确 定平台相关中断的分发。硬件中断发生时会自动设置cause寄存器的IP相应位。这个与硬件连接相关的。

Loongson2f中断处理分析,在内核启动阶段会将每个异常向量与一个异常处理例程对应起来。在文件arch/mips/kernel/traps.c 中的 void __init traps_init()函数中进行初始化。

异常码有 32个 (具体定义可以参考cpu手册),在这里我们只关注异常码0(中断例外)。

该例外使用通用的入口地址为: 80000180

此地址保存了下面的函数指针:

expect_vec3_generic() [arch/mips/kernel/genex.S]

NESTED(except_vec3_generic, 0, sp)

.set push

.set noat

#if R5432_CP0_INTERRUPT_WAR

mfc0 k0, CP0_INDEX

#endif

mfc0 k1, CP0_CAUSE

andi k1, k1, 0x7c //得到Excode * 4因为32bit下unsigned long为4byte

#ifdef CONFIG_64BIT

dsll k1, k1, 1 //k1*2 因为64bit下unsigned long为8byte

#endif

PTR_L k0, exception_handlers(k1) //k0 = exception_handlers + Excode*4

//取出某一类例外处理例程的地址

jr k0 //跳转到例程函数

.set pop

END(except_vec3_generic)

接下来开始填异常向量表,定义为

unsigned long exception_handlers[32];

注意这里的变量名与上面的含义相同。

填表的函数是 set_except_vector(), 就是将handler的地址填入到 expection_handler数组中。

在traps_init()中异常码0与handle_int处理例程关联。

set_except_vector(0,rollback?rollback_handle_int : handle_int); handle_int的实现在arch/mips/kernel/genex.S中,

NESTED(handle_int, PT_SIZE, sp)

#ifdef CONFIG_TRACE_IRQFLAGS

/*

* Check to see if the interrupted code has just disabled

* interrupts and ignore this interrupt for now if so.

*

* local_irq_disable() disables interrupts and then calls

* trace_hardirqs_off() to track the state. If an interrupt

* is taken

* after interrupts are disabled but before the state

* is updated

* it will appear to restore_all that it is

* incorrectly returning with

* interrupts disabled

*/

.set push

.set noat

mfc0 k0, CP0_STATUS //

..............

and k0, ST0_IE

bnez k0, 1f //上面判断中断是否屏蔽

eret

1:

.set pop

#endif

SAVE_ALL

CLI //关中断

TRACE_IRQS_OFF

LONG_L s0, TI_REGS($28)

LONG_S sp, TI_REGS($28)

PTR_LA ra, ret_from_irq

//将中断返回处理的地址放入到ra 以便返回。

j plat_irq_dispatch //平台相关中断处理

END(handle_int)

龙芯plat_irq_dispatch的实现在arch/mips/lemote/lm2f/lmbox/irq.c

在plat_irq_dispatch中 会查询CAUSE寄存器的IP位来确定中断源。

中断chip注册:

8259As(arch/mips/kernel/i8259.c)

MIPS(arch/mips/kernel/irq_cpu.c)

bonito(arch/mips/lemote/lm2f/lmbox/bonito‐irq.c)

中断屏蔽:

相应中断号屏蔽可以使用相应chip注册的mask方法来完成。

通过CP0寄存器的屏蔽。由于中断的一级判断是通过status寄存器与cause寄存器的相与来确定pending的interrupt,因此可以 通过清掉status寄存器中的Interrupt‐Mask (IM)域中的相应的位,八个中断中的任何一个都可以被屏蔽,并且,通过清掉status 寄存器的IE 位,可以一次屏蔽所有的八个中断。

具体操作可以参考宏CLI, STI的实现。(include/asm‐mips/stackframe.h)

1.5.6 PMON内核读写模块

通过MTD层来完成对存放pmon的flash设备进行读写。MTD(memory technology device 内存技术设备)是用于访问memory设备(ROM、flash)的Linux的子系统。MTD的主要目的是为了使新的memory设备的驱动更加简单,为此它在硬件和上层之间提供了一个抽象的接口。

MTD的所有源代码在/drivers/mtd子目录下。

Flash是 cfi接口nor flash chip

Nor 型flash具有片内执行的特点。其probe程序位于drivers/mtd/chips/ 下面

使用说明:编译内核时请选上 如下选项 [可选为M或者*,这里选为*]

Device drivers

[*] Memory Technology Device(MTD) support

[*]MTD partitioning support

[*]Caching block device access to MTD devices

RAM/ROM/Flash chip drivers

<*>Detect flash chips by Common Flash Interface probe

<*>Support for AMD/Fujitsu flash chip

编译使用该内核

编译生成 pmon_flash.ko的模块

insmod pmon_flash.ko 会生成/dev/mtdblock0 这样的设备

[我们只有一个分区故只有一个设备文件]

直接使用 dd if=pmon.bin of=/dev/mtdblock0 来写入pmon二进制文件

代码分析:

#include

#include

#include

#include

#include

#include

#include

#include

#define FLASH_PHYS_ADDR 0x1fc00000

#define FLASH_SIZE 0x080000

#define FLASH_PARTITION0_ADDR 0x00000000

#define FLASH_PARTITION0_SIZE 0x00080000

struct map_info flash_map = {

.name = "flash device",

.size = FLASH_SIZE,

.bankwidth = 1,

};

struct mtd_partition flash_parts[] = {

{

.name = "Bootloader",

.offset = FLASH_PARTITION0_ADDR, //分区偏移地址

.size = FLASH_PARTITION0_SIZE

},

};

#define PARTITION_COUNT ARRAY_SIZE(flash_parts)

static struct mtd_info *mymtd;

int __init init_flash(void)

{

printk(KERN_NOTICE "Flash flash device: %x at %x\n",

FLASH_SIZE, FLASH_PHYS_ADDR);

flash_map.phys = FLASH_PHYS_ADDR; //flash映射的物理地址

flash_map.virt = ioremap(FLASH_PHYS_ADDR,

FLASH_SIZE); //将物理地址进行映射 获取到映射地址

if (!flash_map.virt) {

printk("Failed to ioremap\n");

return ‐EIO;

}

//将flash_map结构中的read,write方法填写上

simple_map_init(&flash_map);

//搜索MTD设备并将其赋给mymtd

mymtd = do_map_probe("cfi_probe", &flash_map);

if (mymtd) {

mymtd‐>owner = THIS_MODULE;

//添加MTD分区到master

add_mtd_partitions(mymtd, flash_parts, PARTITION_COUNT);

printk(KERN_NOTICE "pmon flash device initialized\n");

return 0;

}

iounmap((void *)flash_map.virt);

return ‐ENXIO;

}

static void __exit cleanup_flash(void)

{

if (mymtd) {

del_mtd_partitions(mymtd); //删除在mymtd上的分区

map_destroy(mymtd); //destroy MTD devices

}

if (flash_map.virt) {

iounmap((void *)flash_map.virt); //撤销地址映射

flash_map.virt = 0;

}

}

module_init(init_flash);

module_exit(cleanup_flash);

更多例子可以参考 drivers/mtd/maps/ 下面

1.6 龙芯优化补丁描述

1.6.1 Uncache accelerate

思想:非高速缓存加速属性用于优化在一个连续的地址空间中完成的一系列顺序的同一类型的Uncached存数操作,可以加速顺序的Uncached 访问,它适用于对显示设备存储的快速输出访问。为了提高显示性能,在龙芯平台将显卡映射范围的访问属性改为_CACHE_UNCACHED_ACCELERATED

Xorg使用mmap()通过/dev/mem,直接对显卡映射的地址空间进行I/O操作。

(关于uncache accelerated的具体原理,可以参考2F用户手册)。

具体代码实现在 driver/char./mem.c

代码分析:

通过find_vga_mem_init()函数查询显卡分配的空间范围。

static int __init find_vga_mem_init(void)

{

……..

}

late_initcall(find_vga_mem_init);

判断是否需要开启此属性,uca=0 关闭 uca=1 开启

将这一影射范围属性修改为_CACHE_UNCACHED_ACCELERATED来开启uncache 加速。

If (uca) {

unsigned offset = vma->vm_pgoff << PAGE_SHIFT;

if (offset >= fb_start && offset < fb_end){

vma->vm_page_prot=

__pgprot((pgprot_val(vma->vm_page_prot)&~_CACHE_MASK)|_CACHE_

UNCACHED_ACCELERATED);

}

}

1.6.2 CS5536 Audio DMA (优化补丁)

龙芯对cache管理是非一致性的,使用pgprot_noncached()修改对应页的属性为uncached,这样做DMA映射时可以不用考虑cache的一致性问题,减少软件维护的开销。

CAC_ADDR()将一个地址重新映射到cache的范围。

具体代码实现在:sound/core/pcm_native.c

sound/core/sgbuf.c

具体代码分析:

在sound/core/pcm_native.c文件中snd_pcm_mmap_data_fault() 函数中添加

#if defined(__mips__) && defined(CONFIG_DMA_NONCOHERENT)

virt_to_page(CAC_ADDR(vaddr));

=

page

#else

page = virt_to_page(vaddr);

#endif

在函数snd_pcm_mmap()函数中添加

#if defined(__mips__) && defined(CONFIG_DMA_NONCOHERENT)

/* all mmap using uncached mode */

pgprot_noncached(area->vm_page_prot);

=

area->vm_page_prot

area->vm_flags |= ( VM_RESERVED | VM_IO);

#endif

在文件sound/core/sgbuf.c中snd_malloc_sgbuf_pages()函数添加

#if defined(__mips__) && defined(CONFIG_DMA_NONCOHERENT)

virt_to_page(CAC_ADDR(tmpb.area));

sgbuf->page_table[i]

=

#else

sgbuf->page_table[i] = virt_to_page(tmpb.area);

#endif

……..

#if defined(__mips__) && defined(CONFIG_DMA_NONCOHERENT)

dmab->area = vmap(sgbuf->page_table, sgbuf->pages, VM_MAP | VM_IO, pgprot_noncached(PAGE_KERNEL));

#else

dmab->area = vmap(sgbuf->page_table, sgbuf->pages, VM_MAP, PAGE_KERNEL);

#endif

将dma buffer通过mmap映射到用户进程空间,提高IO性能。

Linux内核修改与编译图文教程

Linux 内核修改与编译图文教程 1

1、实验目的 针对Ubuntu10.04中,通过下载新的内核版本,并且修改新版本内核中的系统调用看,然后,在其系统中编译,加载新内核。 2、任务概述 2.1 下载新内核 https://www.doczj.com/doc/492728566.html,/ 2.2 修改新内核系统调用 添加新的系统调用函数,用来判断输入数据的奇偶性。 2.3 进行新内核编译 通过修改新版内核后,进行加载编译。最后通过编写测试程序进行测试 3、实验步骤 3.1 准备工作 查看系统先前内核版本: (终端下)使用命令:uname -r 2

3.2 下载最新内核 我这里使用的内核版本是 3.3 解压新版内核 将新版内核复制到“/usr/src”目录下 在终端下用命令:cd /usr/src进入到该文件目录 解压内核:linux-2.6.36.tar.bz2,在终端进入cd /usr/src目录输入一下命令: bzip2 -d linux-2.6.36.tar.bz2 tar -xvf linux-2.6.36.tar 文件将解压到/usr/src/linux目录中 3

使用命令: ln -s linux-2.6.36 linux 在终端下输入一下命令: sudo apt-get install build-essential kernel-package libncurses5-dev fakeroot sudo aptitude install libqt3-headers libqt3-mt-dev libqt3-compat-headers libqt3-mt 4

实验四Linux内核移植实验

合肥学院 嵌入式系统设计实验报告 (2013- 2014第二学期) 专业: 实验项目:实验四 Linux内核移植实验 实验时间: 2014 年 5 月 12 实验成员: _____ 指导老师:干开峰 电子信息与电气工程系 2014年4月制

一、实验目的 1、熟悉嵌入式Linux的内核相关代码分布情况。 2、掌握Linux内核移植过程。 3、学会编译和测试Linux内核。 二、实验内容 本实验了解Linux2.6.32代码结构,基于S3C2440处理器,完成Linux2.6.32内核移植,并完成编译和在目标开发板上测试通过。 三、实验步骤 1、使用光盘自带源码默认配置Linux内核 ⑴在光盘linux文件夹中找到linux-2.6.32.2-mini2440.tar.gz源码文件。 输入命令:#tar –jxvf linux-2.6.32.2-mini2440-20110413.tar对其进行解压。 ⑵执行以下命令来使用缺省配置文件config_x35 输入命令#cp config_mini2440_x35 .config;(注意:x35后面有个空格,然后有个“.”开头的 config ) 然后执行“make menuconfig”命令,但是会出现出现缺少ncurses libraries的错误,如下图所示: 解决办法:输入sudo apt-get install libncurses5-dev 命令进行在线安装ncurses libraries服务。

安装好之后在make menuconfig一下就会出现如下图所示。 ⑶配置内核界面,不用做任何更改,在主菜单里选择退出,并选“Yes”保存设置返回到刚命令行界面,生成相应配置的头文件。 编译内核: #make clean #make zImage 在执行#make zImage命令时会出现如下错误: 错误:arch/arm/mach-s3c2440/mach-mini2440.c:156: error: unknown field 'sets' specified in initializer 通过网上查找资料 于是在自己的mach-mini2440.c中加入 #include

i.MX6UL -- Linux系统移植过程详解(最新的长期支持版本)

i.MX6UL -- Linux系统移植过程详解(最新的长期支持版本) ?开发平台:i.MX 6UL ?最新系统: u-boot2015.04 + Linux4.1.15_1.2.0 ?交叉编译工具:dchip-linaro-toolchain.tar.bz2 源码下载地址: U-Boot: (选择rel_imx_4.1.15_1.2.0_ga.tar.bz2) https://www.doczj.com/doc/492728566.html,/git/cgit.cgi/imx/uboot-imx.git/ Kernel: (选择rel_imx_4.1.15_1.2.0_ga.tar.bz2) https://www.doczj.com/doc/492728566.html,/git/cgit.cgi/imx/linux-2.6-imx.git/ 源码移植过程: 1、将linux内核及uBoot源码拷贝到Ubuntu12.04系统中的dchip_imx6ul目录下; 2、使用tar命令分别将uboot和kernel解压到dchip_imx6ul目录下; 3、解压后进入uboot目录下,新建文件make_dchip_imx6ul_uboot201504.sh,且文件内容如下: ################################################################### # Build U-Boot.2015.04 For D518--i.MX6UL By FRESXC # ################################################################### #!/bin/bash export ARCH=arm export CROSS_COMPILE=/dchip-linaro-toolchain/bin/arm-none-linux-gnueabi - make mrproper # means CLEAN make mx6ul_14x14_evk_defconfig make2>&1|tee built_dchip_imx6ul_uboot201504.out 4进入kernel目录下,新建文件make_dchip_imx6ul_linux4115120.sh,且文件内容如下: ###################################################################

如何自行编译一个Linux内核的详细资料概述

如何自行编译一个Linux内核的详细资料概述 曾经有一段时间,升级Linux 内核让很多用户打心里有所畏惧。在那个时候,升级内核包含了很多步骤,也需要很多时间。现在,内核的安装可以轻易地通过像 apt 这样的包管理器来处理。通过添加特定的仓库,你能很轻易地安装实验版本的或者指定版本的内核(比如针对音频产品的实时内核)。 考虑一下,既然升级内核如此容易,为什么你不愿意自行编译一个呢?这里列举一些可能的原因: 你想要简单了解编译内核的过程 你需要启用或者禁用内核中特定的选项,因为它们没有出现在标准选项里 你想要启用标准内核中可能没有添加的硬件支持 你使用的发行版需要你编译内核 你是一个学生,而编译内核是你的任务 不管出于什么原因,懂得如何编译内核是非常有用的,而且可以被视作一个通行权。当我第一次编译一个新的Linux 内核(那是很久以前了),然后尝试从它启动,我从中(系统马上就崩溃了,然后不断地尝试和失败)感受到一种特定的兴奋。 既然这样,让我们来实验一下编译内核的过程。我将使用Ubuntu 16.04 Server 来进行演示。在运行了一次常规的 sudo apt upgrade 之后,当前安装的内核版本是 4.4.0-121。我想要升级内核版本到 4.17,让我们小心地开始吧。 有一个警告:强烈建议你在虚拟机里实验这个过程。基于虚拟机,你总能创建一个快照,然后轻松地从任何问题中回退出来。不要在产品机器上使用这种方式升级内核,除非你知道你在做什么。 下载内核 我们要做的第一件事是下载内核源码。在 Kernel 找到你要下载的所需内核的URL。找到URL 之后,使用如下命令(我以 4.17 RC2 内核为例)来下载源码文件: wget https://git.kernel/torvalds/t/linux-4.17-rc2.tar.gz

嵌入式Linux内核移植详解(顶嵌)

内核移植阶段 内核是操作系统最基本的部分。它是为众多应用程序提供对计算机硬件的安全访问的一部分软件,这种访问是有限的,并且内核决定一个程序在什么时候对某部分硬件操作多长时间。直接对硬件操作是非常复杂的,所以内核通常提供一种硬件抽象的方法来完成这些操作。硬件抽象隐藏了复杂性,为应用软件和硬件提供了一套简洁,统一的接口,使程序设计更为简单。 内核和用户界面共同为用户提供了操作计算机的方便方式。也就是我们在windows下看到的操作系统了。由于内核的源码提供了非常广泛的硬件支持,通用性很好,所以移植起来就方便了许多,我们需要做的就是针对我们要移植的对象,对内核源码进行相应的配置,如果出现内核源码中不支持的硬件这时就需要我们自己添加相应的驱动程序了。 一.移植准备 1. 目标板 我们还是选用之前bootloader移植选用的开发板参数请参考上文的地址: https://www.doczj.com/doc/492728566.html,/thread-80832-5-1.html。bootloader移植准备。 2. 内核源码 这里我们选用比较新的内核源码版本linux-2.6.25.8,他的下载地址是 ftp://https://www.doczj.com/doc/492728566.html,/pub/linux/kernel/v2.6/linux-2.6.25.8.tar.bz2。 3. 烧写工具 我们选用网口进行烧写这就需要内核在才裁剪的时候要对网卡进行支持 4. 知识储备 要进行内核裁剪不可缺少的是要对内核源码的目录结构有一定的了解这里进 行简单介绍。 (1)arch/: arch子目录包括了所有和体系结构相关的核心代码。它的每一个子 目录都代表一种支持的体系结构,例如i386就是关于intel cpu及与之相兼容体 系结构的子目录。PC机一般都基于此目录。 (2)block/:部分块设备驱动程序。 (3)crypto:常用加密和散列算法(如AES、SHA等),还有一些压缩和CRC校验 算法。 (4) documentation/:文档目录,没有内核代码,只是一套有用的文档。 (5) drivers/:放置系统所有的设备驱动程序;每种驱动程序又各占用一个子目 录:如,/block 下为块设备驱动程序,比如ide(ide.c)。 (6)fs/:所有的文件系统代码和各种类型的文件操作代码,它的每一个子目录支持 一个文件系统, 例如fat和ext2。

嵌入式Linux系统移植试题

嵌入式Linux系统移植试题(时间:1个半小时) 一、选择题(每题2分,共50分,包括单选和多选,多选、少选均不得分) 1.嵌入式linux系统软件部分一般包括() [A] bootloader[B] linux内核[C] 根文件系统[D]用户应用程序 2.一般情况下,在搭建嵌入式linux开发环境时主机需要安装的软件有() [A] 串口通信软件[B] tftp服务器[C] nfs服务器[D]usb 3.下列选项中符合gcc的编译流程的是( ) [A] 预处理->编译->汇编->连接[B] 预处理->汇编->编译->连接[C] 编译->预处 理->汇编->连接[D预处理->连接->汇编->编译 4.gcc使用下列哪个选项可以查看编译的详细过程() [A] -o[B] -v [C] -E [D] -g 5.下列二进制工具哪个是丢弃目标文件的全部或者特定符号,减少文件体积的() [A] size[B] as [C ] nm [D ] strip 6.下列二进制工具哪个是用来反汇编的() [A] nm[B] objdump [C ] objcopy [D ] string 7.下列二进制工具哪个是用来进行目标格式转换的() [A] nm[B] objdump [C ] objcopy [D ] string 8.下列二进制工具哪个是用来把程序地址转换为文件名和行号的() [A] nm[B] objdump [C ] objcopy [D ] addr2line 9.下列二进制工具哪个是用来将目标文件生成静态库的() [A] ar[B]nm [C ] objcopy [D ] objdump 10.FS2410开发板如果从nand flash启动,启动后()访问到nor flash;如果从nor flash 启动,启动后()访问nand flash。 [A] 可以[B] 不可以 11.SMDK2410开发平台上,linux要求bootloader将内核参数存储在什么位置() [A] 0x30008000 [B] 0x30000100 [C ] 0x30004000 [D ] 0x33f80000 12.SMDK2410开发平台上,linux要求bootloader将平台号保存在() [A] r0[B] r1 [C ] r2 [D ] r3 13.SMDK2410开发平台上,linux要求bootloader在运行内核前,让系统进入何种模式() [A] user[B] svc [C ] system 14.u-boot所支持的命令中,哪个是来设置环境变量的() [A] setenv [B] mm [C ] mtest [D ] bootm 15.u-boot支持的命令中,哪个是擦除nor flash的命令() [A] nand erase[B] protect [C ] erase [D ] cp 16.在内核配置时,哪个关键词是来包含下一级Kconfig( ) [A] menu endmenu[B] source [C ] choice endchoice [D ]depends on 17.内核启动过程中,如果终端出现”Error:a”错误,可能出现的原因是()

嵌入式Linux系统内核的配置、编译和烧写

实验二 嵌入式Linux系统内核的配置、编译和烧写 1.实验目的 1)掌握交叉编译的基本概念; 2)掌握配置和编译嵌入式Linux操作系统内核的方法; 3)掌握嵌入式系统的基本架构。 2.实验环境 1)装有Windows系统的计算机; 2)计算机上装有Linux虚拟机软件; 3)嵌入式系统实验箱及相关软硬件(各种线缆、交叉编译工具链等等)。 3.预备知识 1)嵌入式Linux内核的配置和裁剪方法; 2)交叉编译的基本概念及编译嵌入式Linux内核的方法; 3)嵌入式系统的基本架构。 4.实验内容和步骤 4.1 内核的配置和编译——配置内核的MMC支持 1)由于建立交叉编译器的过程很复杂,且涉及汇编等复杂的指令,在这里 我们提供一个制作好的编译器。建立好交叉编译器之后,我们需要完成 内核的编译,首先我们要有一个完整的Linux内核源文件包,目前流行 的源代码版本有Linux 2.4和Linux 2.6内核,我们使用的是Linux 2.6内核; 2)实验步骤: [1]以root用户登录Linux虚拟机,建立一个自己的工作路径(如用命令 “mkdir ‐p /home/user/build”建立工作路径,以下均采用工作路径 /home/user/build),然后将“cross‐3.3.2.tar.bz2、dma‐linux‐2.6.9.tar.gz、 dma‐rootfs.tar.gz”拷贝到工作路径中(利用Windows与虚拟机Linux 之间的共享目录作为中转),并进入工作目录; [2]解压cross‐3.3.2.tar.bz2到当前路径:“tar ‐jxvf cross‐3.3.2.tar.bz2”; [3]解压完成后,把刚刚解压后在当前路径下生成的“3.3.2”文件夹移 动到“/usr/local/arm/”路径下,如果在“/usr/local/”目录下没有“arm” 文件夹,用户创建即可; [4]解压“dma‐linux‐2.6.9.tar.gz”到当前路径下:

02--基于ARM9的Linux2.6内核移植

基于ARM9的Linux2.6内核移植 姓名 系别、专业 导师姓名、职称 完成时间

目录 摘要................................................... I ABSTARCT................................................ II 1 绪论.. (1) 1.1课题研究的背景、目的和意义 (1) 1.2嵌入式系统现状及发展趋势 (1) 1.3论文的主要工作 (4) 2 嵌入式 Linux系统构成和软件开发环境 (5) 2.1嵌入式Linux系统的体系结构 (5) 2.2嵌入式Linux系统硬件平台 (5) 2.3嵌入式Linux开发软件平台建立 (7) 2.4本章小结 (11) 3 嵌入式Linux的引导BootLoader程序 (12) 3.1 BootLoader概述 (12) 3.2 NAND Flash和NOR Flash的区别 (13) 3.3本章小结 (19) 4 Linux内核的编译、移植 (20) 4.1 Linux2.6内核的新特性简介 (20) 4.2 Linux内核启动流程 (20) 4.3内核移植的实现 (21) 4.4 MTD内核分区 (23) 4.5配置、编译内核 (24) 4.6本章小结 (26) 5 文件系统制作 (27) 5.1 yaffs文件系统简介 (27) 5.2 内核支持YAFFS文件系统 (27) 5.3本章小结 (30) 6测试 (31) 6.1简单测试方法的介绍 (31) 6.2编写简单C程序测试移植的系统 (31) 6.3在开发板执行测试程序 (32)

嵌入式linux系统移植试题 - 答案

嵌入式Linux系统移植试题(时间:60分钟) 一、单项选择题(每题2分,共40分) 1.嵌入式linux系统移植不包括(D) [A] bootloader[B] linux内核[C] 根文件系统[D] 应用程序 2.下列选项中符合gcc的编译流程的是(A ) [A] 预处理->编译->汇编->连接[B] 预处理->汇编->编译->连接[C] 编译->预处 理->汇编->连接[D] 预处理->连接->汇编->编译 3.下列二进制工具哪个是丢弃目标文件的全部或者特定符号,减少文件体积的(D ) [A] size[B] as [C] nm [D] strip 4.下列二进制工具哪个是用来反汇编的(B) [A] nm[B] objdump [C] objcopy [D] string 5.下列二进制工具哪个是用来进行目标格式转换的(C ) [A] nm[B] objdump [C] objcopy [D] string 6.下列二进制工具哪个是用来把程序地址转换为文件名和行号的(D) [A] nm[B] objdump [C] objcopy [D] addr2line 7.FS4412开发平台上,uImage被解压到什么地址(B) [A] 0x40000000 [B] 0x40008000 [C] 0x41000000 [D] 0x43e00000 8.编译Linux内核设备树文件使用什么命令(D) [A] make dtbi[B] make tags [C] make dtb [D] make dtbs 9.linux要求bootloader在运行内核前,让系统进入何种模式(B) [A] user[B] svc [C] system 10.u-boot的命令中存放自启动命令的环境变量是(D) [A] ipaddr [B] bootargs [C] bootm [D] bootcmd 11.u-boot的命令中,设置环境变量的命令是(A) [A] setenv [B] printenv [C] tftp [D] bootm 12.u-boot中存放内核启动参数的环境变量是(C)

linux、内核源码、内核编译与配置、内核模块开发、内核启动流程

linux、内核源码、内核编译与配置、内核模块开发、内核启动流程(转) linux是如何组成的? 答:linux是由用户空间和内核空间组成的 为什么要划分用户空间和内核空间? 答:有关CPU体系结构,各处理器可以有多种模式,而LInux这样的划分是考虑到系统的 安全性,比如X86可以有4种模式RING0~RING3 RING0特权模式给LINUX内核空间RING3给用户空间 linux内核是如何组成的? 答:linux内核由SCI(System Call Interface)系统调用接口、PM(Process Management)进程管理、MM(Memory Management)内存管理、Arch、 VFS(Virtual File Systerm)虚拟文件系统、NS(Network Stack)网络协议栈、DD(Device Drivers)设备驱动 linux 内核源代码 linux内核源代码是如何组成或目录结构? 答:arc目录存放一些与CPU体系结构相关的代码其中第个CPU子目录以分解boot,mm,kerner等子目录 block目录部分块设备驱动代码 crypto目录加密、压缩、CRC校验算法 documentation 内核文档 drivers 设备驱动 fs 存放各种文件系统的实现代码 include 内核所需要的头文件。与平台无关的头文件入在include/linux子目录下,与平台相关的头文件则放在相应的子目录中 init 内核初始化代码 ipc 进程间通信的实现代码 kernel Linux大多数关键的核心功能者是在这个目录实现(程序调度,进程控制,模块化) lib 库文件代码 mm 与平台无关的内存管理,与平台相关的放在相应的arch/CPU目录net 各种网络协议的实现代码,注意而不是驱动 samples 内核编程的范例 scripts 配置内核的脚本 security SElinux的模块 sound 音频设备的驱动程序 usr cpip命令实现程序 virt 内核虚拟机 内核配置与编译 一、清除 make clean 删除编译文件但保留配置文件

linux内核编译和生成makefile文件实验报告

操作系统实验报告 姓名:学号: 一、实验题目 1.编译linux内核 2.使用autoconf和automake工具为project工程自动生成Makefile,并测试 3.在内核中添加一个模块 二、实验目的 1.了解一些命令提示符,也里了解一些linux系统的操作。 2.练习使用autoconf和automake工具自动生成Makefile,使同学们了解Makefile的生成原理,熟悉linux编程开发环境 三、实验要求 1使用静态库编译链接swap.c,同时使用动态库编译链接myadd.c。可运行程序生成在src/main目录下。 2要求独立完成,按时提交 四、设计思路和流程图(如:包括主要数据结构及其说明、测试数据的设计及测试结果分析) 1.Makefile的流程图: 2.内核的编译基本操作 1.在ubuntu环境下获取内核源码 2.解压内核源码用命令符:tar xvf linux- 3.18.12.tar.xz 3.配置内核特性:make allnoconfig 4.编译内核:make 5.安装内核:make install

6.测试:cat/boot/grub/grub.conf 7.重启系统:sudo reboot,看是否成功的安装上了内核 8.详情及结构见附录 3.生成makefile文件: 1.用老师给的projec里的main.c函数。 2.需要使用automake和autoconf两个工具,所以用命令符:sudo apt-get install autoconf 进行安装。 3.进入主函数所在目录执行命令:autoscan,这时会在目录下生成两个文件 autoscan.log和configure.scan,将configure.Scan改名为configure.ac,同时用gedit打开,打开后文件修改后的如下: # -*- Autoconf -*- # Process this file with autoconf to produce a configure script. AC_PREREQ([2.69]) AC_INIT([FULL-PACKAGE-NAME], [VERSION], [BUG-REPORT-ADDRESS]) AC_CONFIG_SRCDIR([main.c]) AC_CONFIG_HEADERS([config.h]) AM_INIT_AUTOMAKE(main,1.0) # Checks for programs. AC_PROG_CC # Checks for libraries. # Checks for header files. # Checks for typedefs, structures, and compiler characteristics. # Checks for library functions. AC_OUTPUT(Makefile) 4.新建Makefile文件,如下: AUTOMAKE_OPTIONS=foreign bin_PROGRAMS=main first_SOURCES=main.c 5.运行命令aclocal 命令成功之后,在目录下会产生aclocal.m4和autom4te.cache两个文件。 6.运行命令autoheader 命令成功之后,会在目录下产生config.h.in这个新文件。 7.运行命令autoconf 命令成功之后,会在目录下产生configure这个新文件。 8.运行命令automake --add-missing输出结果为: Configure.ac:11:installing./compile’ Configure.ac:8:installing ‘.install-sh’ Configure.ac:8:installing ‘./missing’ Makefile.am:installing ‘./decomp’ 9. 命令成功之后,会在目录下产生depcomp,install-sh和missing这三个新文件和执行下一步的Makefile.in文件。 10.运行命令./configure就可以自动生成Makefile。 4.添加内核模块

Linux内核移植开发手册

江苏中科龙梦科技有限公司 Linux内核移植开发手册 修 订 记 录 项 次 修订日期 版 本修订內容修订者审 核 1 2009‐02‐04 0.1 初版发行陶宏亮, 胡洪兵 2 2009‐11‐20 0.2 删除一些 多余文字 陶宏亮, 胡洪兵

DISCLAIMER THIS DOCUMENTATION IS PROVIDED FOR USE WITH LEMOTE PRODUCTS. NO LICENSE TO LEMOTE PROPERTY RIGHTS IS GRANTED. LEMOTE ASSUMES NO LIABILITY, PROVIDES NO WARRANTY EITHER EXPRESSED OR IMPLIED RELATING TO THE USAGE, OR INTELLECTUAL PROPERTY RIGHT INFRINGEMENT EXCEPT AS PROVIDED FOR BY LEMOTE TERMS AND CONDITIONS OF SALE. LEMOTE PRODUCTS ARE NOT DESIGNED FOR AND SHOULD NOT BE USED IN ANY MEDICAL OR LIFE SUSTAINING OR SUPPORTING EQUIPMENT. ALL INFORMATION IN THIS DOCUMENT SHOULD BE TREATED AS PRELIMINARY. LEMOTE MAY MAKE CHANGES TO THIS DOCUMENT WITHOUT NOTICE. ANYONE RELYING ON THIS DOCUMENTATION SHOULD CONTACT LEMOTE FOR THE CURRENT DOCUMENTATION AND ERRATA. JIANGSU LEMOTE TECHNOLOGY CORPORATION LIMITED MENGLAN INDUSTRIAL PARK,YUSHAN,CHANGSHU CITY,JIANGSU PROVINCE,CHINA Tel: 0512‐52308661 Fax: 0512‐52308688 Http: //https://www.doczj.com/doc/492728566.html,

ARM9上的嵌入式Linux系统移植

《自动化技术与应用》2009年第28卷第6期 Techniques of Automation & Applications | 43 1 引言 嵌入式系统是以应用为中心,以计算机技术为基础,且软硬件可裁减,是对功能、可靠性、成本、功耗有严格要求的专用计算机系统。它一般由以下几部分组成: 嵌入式微处理器、外围硬件设备、嵌入式操作系统、及特定的应用程序。 当前,人类进入信息爆炸的时代,各类信息极度丰富,数字信息技术和网络技术的高速发展,只有借助于各种计算机,才能够对各类信息进行处理,它们已不再局限于以前的PC,而是由形态各异、性能千差万别的嵌入式系统来完成。而嵌入式操作系统主要有:嵌入式Linux 、WindowsCE 、Vxworks 、uC/OS-II 等[1]。本文主要研究嵌入式Linux 在嵌入式系统中的应用。 2 嵌入式Linux 操作系统及特点 将Linux 应用于嵌入式环境,是基于其具有以下特点:(1)Linux 操作系统是层次结构,并且内核源代码完全开放。不同领域和不同层次的用户可以根据自己应用的需要,对内核进行修改,能够低成本的开发出满足自己需要的嵌入式系统。(2)其具有强大的网络支持功能。Linux 诞生于因特网时代,并具有 ARM9上的嵌入式Linux 系统移植 邹颖婷,李绍荣 (电子科技大学光电信息学院,四川 成都 610054) 摘 要:Linux 操作系统在各个嵌入式领域有着越来越广泛的应用。主要研究了在ARM9体系结构上,嵌入式Linux 系统的移植。介 绍了嵌入式Linux 操作系统、移植目标平台SBC2410、及Linux 内核源代码的目录结构。然后详细讲述了在SBC2410硬件平台上实现Uboot 移植的过程,及概要介绍了Linux 操作系统内核移植的过程。最后将嵌入式Linux 系统成功移植上SBC2410平台。 关键词:ARM9;嵌入式Linux;Uboot 移植;内核移植 中图分类号:TP311.54 文献标识码:B 文章编号:1003-7241(2009)06-0043-03 Transplant of the Linux System on ARM9 ZOU Ying-ting, LI Shao-rong ( School of Opto-Electronic Information, University of Electronic Science and Technology of China, Chengdu 610054 China )Abstract: Linux OS has been more and more widely applied in many embedded areas. This paper introduces the transplantation of the Embedded Linux System on the ARM9. The Embedded Linux OS, the SBC2410 board, and the directory structure of the Linux kernel are introduced. The transplant process of the Uboot and of the Linux kernel are also discussed. Key words: ARM9; embedded Linux; transplantation of Uboot; transplantation of the Linux kernel 收稿日期:2009-01-04 Unix 的特性,这保证了它支持所有标准因特网协议,并且可以利用Linux 的网络协议栈,将其开发成为嵌入式的TCP/IP 网络协议栈。此外,Linux 还支持ext2、fat16、fat32、romfs 等文件系统,为嵌入式系统应用开发打下了很好的基础。(3)Linux 具备一整套工具链,容易自行建立嵌入式系统的开发环境和交叉运行环境,可以跨越嵌入式系统开发中仿真工具的障碍。而且,Linux 也符合IEEE POSIX.1标准,使应用程序具有较好的可移植性[2]。 3 SBC2410硬件平台介绍 SBC2410是一款基于三星公司ARM9处理器S3C2410A,支持ARM-Linux 、WindowsCE 等操作系统的嵌入式硬件平台。平台的主要硬件资源有:一片64M SDRAM,一片64M Nand Flash,一片1M Nor Flash,一个串口 COM0,一个USB Host A 型接口,一个USB Slave B 型接口,一个标准JTAG 接口,等等。平台支持Linux2.4.18内核版本。 4 嵌入式Linux 系统移植 移植主要包括引导加载程序Uboot 的移植和Linux2.4.18内 计算机应用 Computer Applications

linux2.6内核的编译步骤及模块的动态加载-内核源码学习-linux论坛

[原创]linux2.6内核的编译步骤及模块的动态加载-内核源码 学习-linux论坛 05年本科毕业设计做的是Linux下驱动的剖析,当时就买了一本《Linux设备驱动程序(第二版)》,但是没有实现将最简单的helloworld程 序编译成模块,加载到kernel里。不过,现在自己确实打算做一款芯片的Linux的驱动,因此,又开始看了《Linux设备驱动程序》这本书,不过已 经是第三版了。第二版讲的是2.4的内核,第三版讲的是2.6的内核。两个内核版本之间关于编译内核以及加载模块的方法都有所变化。本文是基于2.6的内核,也建议各位可以先看一下《Linux内核设计与实现(第二版)》作为一个基础知识的铺垫。当然,从实践角度来看,只要按着以下的步骤去做也应该可以实现成功编译内核及加载模块。个人用的Linux版本为:Debian GNU/Linux,内核版本为:2.6.20-1-686.第一步,下载Linux内核的源代码,即构建LDD3(Linux Device Drivers 3rd)上面所说的内核树。 如过安装的Linux系统中已经自带了源代码的话,应该在/usr/src目录下。如果该目录为空的话,则需要自己手动下载源代码。下载代码的方法和链接很多,也可以在CU上通过

https://www.doczj.com/doc/492728566.html,/search/?key=&;q=kernel&a mp;frmid=53去下载。不过,下载的内核版本最好和所运行的Linux系统的内核版本一致。当然,也可以比Linux系统内核的版本低,但高的话应该不行(个人尚未实践)。 Debian下可以很方便的通过Debian源下载: 首先查找一下可下载的内核源代码: # apt-cache search linux-source 其中显示的有:linux-source-2.6.20,没有和我的内核版本完全匹配,不过也没关系,直接下载就可以了: # apt-get install linux-source-2.6.20 下载完成后,安装在/usr/src下,文件名为: linux-source-2.6.20.tar.bz2,是一个压缩包,解压缩既可以得到整个内核的源代码: # tar jxvf linux-source-2.6.20.tar.bz2

我来说linux移植过程

我对linux移植过程的整体理解 首先,要开始移植一个操作系统,我们要明白为什么要移植。因为我们要在另外一个平台上用到操作系统,为什么要用操作系统,不用行不行?这个问题的答案不是行或不行来回答。单片机,ARM7都没有操作系统,我们直接对寄存器进行操作进而实现我们需要的功能也是可以。但是,一些大型的项目设计牵涉很多到工程的创建,单纯对裸机进行操作会显得杂乱庞大这时候需要一个操作系统。 操作系统的功能能。我们用到操作系统,一方面可以控制我们的硬件和维护我们的硬件,另一方面可以为我们得应用程序提供服务。呵呵,这样说还是很抽象,具体到项目中就可以感受到操作系统的好处。 Linux操作系统的移植说白了总共三大部分:一,内核的重新编译。二,bootloader的重新编译。三,文件系统的制作。在这里要解释这些名词也很不好说的明白,首先,一个完整的操作系统是包括这三大部分的,内核、Bootloader、文件系统。我们知道Linux有很多版本,不同的版本只是文件系统不一样而内核的本质都是一样的。 那么,我们开始进行移植。首先是内核。1.我们需要下载一个内核源码,这个在网上很好下载,下载后,保存下。2.把这个压缩包复制到ubuntu(我用的版本)里,一般复制到/home/dong/SoftEmbed(我的目录,呵呵),然后呢,我们需要对这个内核进行修改重新编译,为什么要这样做,因为我们要让内核为我们的ARM服务,所以需要修改一些东西的。至于具体如何修改,我已经写在另外一个文档里了。3.修改的内容主要是 Makefile(设置体系架构为arm,设置交叉编译器)、时钟频率(我们板子的频率)、内核配置(进入内核配置主要是设置一些选项以适合我们的开发板)。具体设置步骤我会另加说明。4.设置好后我们需要重新编译内核,用的是make zImage命令。编译后就生成了我们自己编译好的内核,呵呵。 接下来,进行文件系统的移植。我们需要一个Yaffs2文件系统压缩包。1.复制这个压缩包到/home/dong/SoftEmede(我自己在ubuntu里建的目录,呵呵),2.解压,会生成一个文件夹。3.给内核打补丁,通过执行 ./patsh-ker.sh c /内核目录。呵呵4.进入 make menuconfig中配置选项,要选择对yaffs2的支持,具体怎么设置我写在另一个文档。 接下来,我们进行根文件制作,需要一个制作工具 mkyaffs2image.taz.还是复制到我自己的目录下,解压,安装。接着,我们需要对Busybox的移植、配置,具体移植、配置步骤我另写,呵呵。最后是构建我们自己的文件系统,到此我们已经完成了内核移植和文件系统的制作。准备移植,呵呵。今天先写到这里,累了。

Linux kernel内核升级全过程,教你一次成功

序言 由于开发环境需要在linux-2.6内核上进行,于是准备对我的虚拟机上的Linux系统升级。没想到这一弄就花了两天时间( 反复装系统,辛苦啊~~),总算把Linux系统从2.4.20-8内核成功升级到了2.6.18内核。 网上虽然有很多介绍Linux内核升级的文章,不过要么过时,下载链接失效;要么表达不清,不知所云;更可气的是很多 文章在转载过程中命令行都有错误。刚开始我就是在这些“攻略”的指点下来升级的,以致于浪费了很多时间。 现在,费尽周折,升级成功,心情很爽,趁性也来写个“升级攻略”吧!于是特意又在虚拟机上重新安装一个Linux系统 ,再来一次完美的升级,边升级边记录这些步骤,写成一篇Linux内核升级记实录(可不是回忆录啊!),和大家一起分享 ~~! 一、准备工作 首先说明,下面带#号的行都是要输入的命令行,且本文提到的所有命令行都在终端里输入。 启动Linux系统,并用根用户登录,进入终端模式下。 1、查看Linux内核版本 # uname -a 如果屏幕显示的是2.6.x,说明你的已经是2.6的内核,也用不着看下文了,该干什么干什么去吧!~~~如果显示的是 2.4.x,那恭喜你,闯关通过,赶快进行下一步。 2、下载2.6内核源码 下载地址:https://www.doczj.com/doc/492728566.html,/pub/linux/kernel/v2.6/linux-2.6.18.tar.bz2 3、下载内核升级工具 (1)下载module-init-tools-3.2.tar.bz2 https://www.doczj.com/doc/492728566.html,/pub/linux/utils/kernel/module-init-tools/module-init-tools-3.2.tar.bz2 (2)下载mkinitrd-4.1.18-2.i386.rpm https://www.doczj.com/doc/492728566.html,/fedora/linux/3/i386/RPMS.core/mkinitrd-4.1.18-2.i386.rpm (3)下载lvm2-2.00.25-1.01.i386.rpm https://www.doczj.com/doc/492728566.html,/fedora/linux/3/i386/RPMS.core/lvm2-2.00.25-1.01.i386.rpm (4)下载device-mapper-1.00.19-2.i386.rpm https://www.doczj.com/doc/492728566.html,/fedora/linux/3/i386/RPMS.core/device-mapper-1.00.19-2.i386.rpm (2.6.18内核和这4个升级工具我都有备份,如果以上下载地址失效,请到https://www.doczj.com/doc/492728566.html,/guestbook留下你的邮箱,我给你发过去)

linux实验报告(编译内核)

湖北大学 学生实验报告 实验课程网络实用技术 开课学院计算机与信息工程学院 任课教师徐婕 学生姓名骆婧 学生学号20112211042100 70 专业班级计科一班 学生年级2011级 2013-2014 学年第二学期

一.实验目的 通过实验,熟悉Linux操作系统的使用,掌握构建与启动Linux内核的方法;掌握用户程序如何利用系统调用与操作系统内核实现通信的方法,加深对系统调用机制的理解;进一步掌握如何向操作系统内核增加新的系统调用的方法,以扩展操作系统的功能。 二.实验内容 1.Linux环境下的C或者C++编译和调试工具的使用 2.向Linux内核增加新的系统调用,系统调用的功能为打印出自己的学号和 姓名信息。 3.Linux新内核的编译、安装和配置。 4.编写应用程序以测试新的系统调用并输出测试结果。 三、实验步骤 第一步:解压文件 1.下载linux-3.13.3.tar.xz压缩包。 2.在Ubantu系统下,解压该文件,解压之后得到linux- 3.13.3文件包 # tar –xf linux-3.13.3.tar.xz 3.将解压后的文件包复制到/usr/src # cp linux3.13.3 /usr/src 第二步:修改源程序,增加系统调用 1.gedit /usr/src/linux-3-13.3/kernel/sys.c (增加系统调用,使用面向内核的 打印函数printk打印姓名学号) 使用gedit命令,可以直接在文档编辑器中直接修改。修改好后按保存关闭文档编辑器。 在开头加入头文件: #include 在末尾加入函数 asmlinkage int sys_mycall(void) { printk(KERN_ALERT "My name is XXXX!My studentid is XXXXXXX\n"); return 1; } 2.gedit /usr/src/linux-3-1 3.3/arch/x86/include/asm/syscalls.h 在倒数第二行后插入 asmlinkage int sys_mycall(void);

相关主题
文本预览
相关文档 最新文档