_基于s3c2440的嵌入式linux操作系统内核研究(编辑修改稿)内容摘要:

图 4 Linux 内核系统模块结构及相互依赖关系 由 上图 可以看出,所有的模块都与进程调 度模块存在依赖关系。 因为它们都需要依靠进程调度程序来挂起(暂停)或重新运行它们的进程。 通常,一个模块会在等待硬件操作期间被挂起,而在操作完成后才可继续运行。 例如,当一个进程试图将一数据块写到软盘上去时,软盘驱动程序就可能在启动软盘旋转期间将该进程置为挂起等待状态,而在软盘进入到正常转速后再使得该进程能继续运行。 另外 3 个模块也是由于类似的原因而与进程调度模块存在依赖关系。 其他几个模块的依赖关系有些不太明显,同样也很重要。 进程调度子系统需要使用内存管理来调整 特定进程所使用的物理内存空间。 进程通信子系统则需要依 靠内存管理器来支持共享内存通信机制。 这种通信机制允许两个进程访问内存的同一区域以进行进程间信息的交换。 虚拟文件系统也会使用网络接口来支持网络文件系统( NFS),同样也能使用内存管理子系统提供内存虚拟盘( ramdisk)设备。 而内存管理子系统也会使用文件系统来支持内存数据块的交换操作 [8]。 Linux 内核源码目录 如下 : : 这个目录下面没有内核代码,只有很多质量参差不齐的文档,但往往能够给我们提供很多的帮助。 : 所有与体系结构相关的代码都在这个目录以及 include/asm*/目录中, Linux支持的每种体系结构在 arch 目录下都有对应的子目。 :这个目录是内核中最庞大的一个目录,显卡、网卡、 SCSI 适配器、 PCI总线、 USB 总线和其他任何 Linux 支持的外围设备或总线的驱动程序都可以在这里找到。 :虚拟文件系统 (VFS, Virtual File System)的代码,和各个不同文件系统的代码都在这个目录中。 Linux 支持的所有文件系统在 fs 目录下面都有一个对应的子目录。 :这个目录包含了内核中大部分的头文件,它们按照下面的 子目录进行分组。 include/asm*/,这样的子目录有多个,每一个都对应着一个 arch 的子目录。 内存管理 进程调度 网络接口 进程间 通信 文件系统 虚拟文件系统 10 :内核的初始化代码。 包括 、创建早期用户空间的代码以及其他初始化代码。 :即进程间通信 (interprocess munication)。 它包含了共享内存、信号量以及其他形式 IPC 的代码。 :内核中最核心部分,包括进程的调度 (kernel/),以及进程的创建和撤销 (kernel/ 和 kernel/) 等,和平台相关的另 外一部分核心的代码在arch/*/kernel 目录。 :库代码,实现了一个标准 C 库的通用子集,包括字符串和内存操作的函数(strlen、 mmcpy 和其他类似的函数 )以及有关 sprintf 和 atoi 的系列函数。 与 arch/lib 下的代码不同,这里的库代码都是使用 C 编写的,在内核新的移植版本中可以直接使用。 :包含了体系 结构无关部分的内存 管理代码,体系相关 的部分位于arch/*/mm 目录下。 :网络相关代码,实现了各种常见的网络协议,如 TCP/IP、 IPX 等。 :该目录下没有内核代码,只包含了用来配置内核的脚本文件。 当运行make menuconfig 或者 make xconfig 之类的命令配置内核时,用户就是和位于这个目录下的脚本进行交互的。 : block 层的实现。 最初 block 层的代码一部分位于 drivers 目录,一部分位于 fs 目录,从 开始, block 层的核心代码被提取出来放在了顶层的 block 目录。 :内核本身所用的加密 API,实现了常用的加密和散列算法,还有一些压缩和 CRC 校验算法。 :这 个 目 录 包 括 了 不 同 的 Linux 安 全 模 型 的 代 码 , 比 如 NSA SecurityEnhanced Linux。 :声卡驱动以及其他声音相关的代码。 :实现了用于打包和压缩的的 cpio 等 [9]。 嵌入式 Linux 内核移植 实现 移植 准备工作 ,在 windows 平台下面操作。 需要 windows 和 Linux 之间共享文件 ,实现如下: 11 (1)安装 smb 服务器。 (2)配置 smb 服务器:建立一个共享的目录和 win7 可以访问的用户名和密码。 (3)在 win7 中创建一个虚拟网卡,设置 虚拟网卡的静态 ip 地址,例如:。 (4)设置虚拟机网络: vm8,hostonly。 sub 的 ip:。 (5)设置 linux eth0 的 ip 地址和虚拟网卡 ip 地址在一个网段,例如:。 (6)启动 smb 服务器: service smb start。 (7)win7 中 win+r 输入 \\ 即可访问共享的资源。 , 从官网 下载 , 本课题 用的是 版本的内核,即文件。 解压至工作目录。 arm,交叉编译器为 linux 修改 下的 Makefile: 183 行: linux ARCH ?=arm 184 行: CROSS_COMPILE ?=armlinux 修改 Makefile 权限为可写可执行,保存。 修改 arch/arm/machs3c2440/ 163 行: s3c24xx_init_clocks(12020000)。 make menuconfig 进入 Load an Alternate Configuration File 输入 2440 的默认配置文件: arch/arm/configs/s3c2410_defconfig 在 System Type 下, s3c24XX Machine 那部分,只选中 : SMDK2410/A9M2410 SMDK2440 SMDK2440 with S3C2440 cpu moudle 进入 Kernel Features 选择 Use the ARM EABI to pile the kernel 和 Allow old ABI binaries to run with this kernel 保存配置文件改名为: .config 并退出 [10]。 编译: make zImage, 把镜像烧进 NandFlash 跑一下,看 串口 是否打印出信息。 CS8900A 网卡驱动移植 CS8900A 工作流程图如图 5 所示。 12 图 5 CS8900A 工作流程图 移植时首先确定网卡的地址为 0x19000000,中断号为 EINT9。 修改 drivers//,指定 CS8900A 使用的资源: elif defined(CONFIG_ARCH_S3C2410) include asm/ include mach/ define S3C24XX_PA_CS8900 0x19000000 static unsigned int card_portlist[] __initdata ={0,0}。 static unsigned int cs8900_irq_map[] = {IRQ_EINT9,0,0,0}。 然后修改入口函数 cs89x0_probe: if defined(CONFIG_ARCH_S3C2410) unsigned int oldval_bwscon。 unsigned int oldval_bankcon3。 endif if defined(CONFIG_ARCH_S3C2410) //设置 MAC,总线宽度等 if(card_portlist[0]) return ENODEV。 card_portlist[0] = (unsigned int)ioremap(S3C24XX_PA_CS8900, SZ_1M) + 13 0x300。 devdev_addr[0] = 0x08。 devdev_addr[1] = 0x89。 devdev_addr[2] = 0x89。 devdev_addr[3] = 0x89。 devdev_addr[4] = 0x89。 devdev_addr[5] = 0x89。 oldval_bwscon = *((volatile unsigned int *)S3C2410_BWSCON)。 *((volatile unsigned int *)S3C2410_BWSCON) = (oldval_bwscon amp。 ~(312)) | S3C2410_BWSCON_DW3_16 | S3C2410_BWSCON_WS3 | S3C2410_BWSCON_ST3。 oldval_bankcon3 = *((volatile unsigned int *)S3C2410_BANKCON3)。 *((volatile unsigned int *)S3C2410_BANKCON3) = 0x1f7c。 endif out: //出错退出 if defined(CONFIG_ARCH_S3C2410) iounmap(card_portlist[0])。 card_portlist[0] = 0。 *((volatile unsigned int *)S3C2410_BWSCON) = oldval_bwscon。 *((volatile unsigned int *)S3C2410_BANKCON3) = oldval_bankcon3。 endif free_dev(dev)。 注册中断处理程序,指定中断触发方式,修改 _open 函数: if 0 writereg(dev, PP_BusCTL, ENABLE_IRQ | MEMORY_ON)。 endif write_irq(dev, lpchip_type, devirq)。 if defined(CONFIG_ARCH_S3C2410) ret = request_irq(devirq, amp。 _interrupt, IRQF_TRIGGER_RISING, devname, dev)。 else ret = request_irq(devirq, amp。 _interrupt, 0, devname, dev)。 endif 在 drivers// 中适当的位置加上 CONFIG_ARCH_S3C2410 宏编译开关 , 14 可以参考: CONFIG_ARCH_PNX010X: _open(struct _device *dev) { struct _local *lp = dev_priv(dev)。 int result = 0。 int i。 int ret。 if !defined(CONFIG_MACH_IXDP2351) amp。 amp。 !defined(CONFIG_ARCH_IXDP2X01) amp。 amp。 !defined(CONFIG_ARCH_PNX010X) amp。 amp。 !defined(CONFIG_ARCH_S3C2410) if (((1 irq) amp。 lpirq_map) == 0) { printk(KERN_ERR %s: IRQ %d is not in our map of allowable IRQs, which is %x\n,devname, devirq, lpirq_map)。 ret = EAGAIN。 goto bad_out。 } endif if defined(CONFIG_ARCH_PNX010X) || defined(CONFIG_ARCH_S3C2410) result = A_CNF_10B_T。 endif 内核配置文件修改,修改 drivers//kconfig 中的描述: config CS89x0 tristate CS89x0 support depends on NET_ETHERNET amp。 amp。 (ISA || EISA || MACH_IXDP2351 \ || ARCH_IXDP2X01 || MACH_MX31ADS || MACH_2440) ||ARCH_S3C2410 help Support for CS89x0 chipset based Ether cards. If you have a work (Ether) card of this。
阅读剩余 0%
本站所有文章资讯、展示的图片素材等内容均为注册用户上传(部分报媒/平媒内容转载自网络合作媒体),仅供学习参考。 用户通过本站上传、发布的任何内容的知识产权归属用户或原始著作权人所有。如有侵犯您的版权,请联系我们反馈本站将在三个工作日内改正。