江苏中科龙梦科技有限公司Linux内核移植开发手册修 订 记 录项 次 修订日期 版 本修订內容修订者审 核1 2009‐02‐04 0.1 初版发行陶宏亮,胡洪兵2 2009‐11‐20 0.2 删除一些多余文字陶宏亮,胡洪兵DISCLAIMERTHIS 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 LIMITEDMENGLAN INDUSTRIAL PARK,YUSHAN,CHANGSHU CITY,JIANGSU PROVINCE,CHINATel: 0512‐52308661Fax: 0512‐52308688Http: //目 录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内核源码,网址是:/code/linux_loongson它是由git管理的龙芯相关项目开发的一个子项目,在这里,你可以跟踪此项目的每一次改动克隆到本地,创建分支,做你自己开发,使用:git‐clone git:///linux_loongson当然,前提是你的电脑里已经安装了git工具.关于git的介绍和使用,你同样可以在这个开 发网站的热门文章里找到,也可以访问以下链接:/drupal/node/211.2 内核的编译环境及其配置1.2.1本地编译在建立编译环境前,建议您在/etc/apt/sources.list中加入龙芯官方源deb /debian‐loongson loongson contrib main non‐freedeb /debian testing contrib main non‐free并使用 apt‐get update 更新以启用源。
安装gcc:apt‐get install gcc更新/usr/bin/下的as文件:下载地址:/files/toolchain/kernel/asmv /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下载地址: /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/。