- 博客(35)
- 收藏
- 关注
原创 2440init代码分析(5)
626 627 ;===========================================================628 629 LTORG630 631 ;GCS0->SST39VF1601632 ;GCS1->16c550633 ;GCS2->IDE634 ;GCS3->CS8900635 ;GCS4->DM9000636 ;GC
2013-10-05 10:04:58 764
原创 2440init代码分析(4)
310 ;===========================================================311 312 ldr r0, =BWSCON313 ldr r0, [r0]314 ands r0, r0, #6 ;OM[1:0] != 0, NOR FLash boot315 bne copy_proc_beg ;do not r
2013-10-05 09:54:02 894
原创 2440init代码分析(3)
160 ;=======161 ; ENTRY162 ;=======163 ResetHandler164 ldr r0,=WTCON ;watch dog disable165 ldr r1,=0x0166 str r1,[r0]167 第164-166行watchdog也是个定时器,一般是用来监控系统有没有”跑飞”,正常情况下watchdog
2013-10-05 09:09:32 820
原创 2440init代码分析(2)
064 IMPORT |Image$$RO$$Base| ; Base of ROM code065 IMPORT |Image$$RO$$Limit| ; End of ROM code (=start of ROM data)066 IMPORT |Image$$RW$$Base| ; Base of RAM to i
2013-10-04 20:49:10 838
原创 2440init代码分析(1)
;========================================= ; NAME: 2440INIT.S ; DESC: C start up codes ; Configure memory, ISR ,stacks ; Initialize C-variables ; HISTORY: ; 2002.02.25:kwtark: ver
2013-10-04 18:58:16 733
原创 U-BOOT启动流程之四
(5) main_loop()函数在这个函数前也有许多其它的函数,也是一些初始化的信息,不一一介绍.在main_loop函数中会有与用户进行交互,如果在默认情况下,会等待3秒,如果你设置了,在mini2440.h中可以配置为0,也就是不延迟,直接启动kernel.如果你跟踪代码的话,会经过这么一引动步骤,从parse_string_outer->parse_stream_outer->run_
2012-04-16 20:20:41 1174
原创 U-BOOT启动流程之三
U-boot启动的第二部分在u-boot的第二部分当中,主要初始化一些与硬件相关的信息,比如串口,LCD,flash,timer等.当然这些硬件是根据自己的需要来初始化的,比如我不需要使用MMC,这个我们就不需初始化了.基本图示如下从这个图中,可以看出第二部分的执行流程,里面的函数也比较多,不一一介绍,自己可以找一些感兴趣的函数看一下.同时注意一下,gd这个指针很重要,同时要关注一
2012-04-16 20:17:45 572
原创 U-BOOT启动流程之二
(3)关闭cache,mmu,初始化SDRAM存储控制器#ifndef CONFIG_SKIP_LOWLEVEL_INIT bl cpu_init_crit #endif.当我们把u-boot下载到内存当中时,就可以不用再使用这个函数.118 #ifndef CONFIG_SKIP_LOWLEVEL_INIT119 cpu_init_crit:1
2012-04-16 20:15:30 520
原创 U-BOOT启动流程之一
U-boot的启动流程版本 V1.0u-boot的作用主要是初始化一部分硬件,设置堆栈,然后把U-boot的第二部分代码搬运到内存当中运行.U-BOOT的启动分为两个部分.第一部分(1) 初始化一部分硬件,比如关闭watch dog,中断等(2) 搬运u-boot的第二部分代码到sdram中(3) 设置堆栈sp(4) 跳到第二部分代码开始执行
2012-04-16 20:10:40 664
原创 EXT2目录文件索引节点的操作方法
const struct inode_operations ext2_dir_inode_operations = { .create = ext2_create, .lookup = ext2_lookup, .link = ext2_link, .unlink = ext2_unlink, .symlink = ext2_symlink, .mkdir = e
2011-11-19 19:38:47 1910
原创 EXT2普通文件节点的操作方法
const struct inode_operations ext2_file_inode_operations = { .truncate = ext2_truncate,#ifdef CONFIG_EXT2_FS_XATTR .setxattr = generic_setxattr, .getxattr = generic_getxattr, .listxattr = ex
2011-11-19 19:37:26 1307
原创 EXT2的文件操作方法
const struct file_operations ext2_file_operations = { .llseek = generic_file_llseek, .read = do_sync_read, .write = do_sync_write, .aio_read = generic_file_aio_read, .aio_write = generic_
2011-11-19 19:34:47 1282
原创 ext2文件系统的super操作方法
static const struct super_operations ext2_sops = { .alloc_inode = ext2_alloc_inode, .destroy_inode = ext2_destroy_inode, .write_inode = ext2_write_inode, .delete_inode = ext2_delete_inode, .
2011-11-19 19:32:42 899
原创 EXT2文件系统超级块的初始化(二)
=======================================struct inode *ext2_iget (struct super_block *sb, unsigned long ino){001 struct ext2_inode_info *ei;002 struct buffer_head * bh;003 struct ext2_inode *r
2011-11-19 19:31:15 920
原创 EXT2超级块初始化(一)
====================================static int ext2_get_sb(struct file_system_type *fs_type, int flags, const char *dev_name, void *data, struct vfsmount *mnt){ return get_sb_bdev(fs_type, fla
2011-11-19 19:30:10 3091
原创 挂载EXT2文件系统
文件系统的安装主要是通用mount命令来实现的,然后通过系统调用由用户态进入到内核态,把某一个分区下的文件系统挂载到某一个目录下,当然挂载也可以能指定挂载的文件系统。mount函数通过sys_mount函数来实现,其具体函数如下asmlinkage long sys_mount(char __user *dev_name, char __user *dir_name, char __
2011-11-19 19:27:39 3312
原创 EXT2的磁盘数据结构
Ext2分区当中第一个块是引导块,其余部分分成块组,每个块组分布如下图。Ext2文件系统中所有块组大小相同并被顺序存放,因此,内核可以从块组的整数索引中得到磁盘中一个块组的位置。内核尽可能地把属于一个文件的数据块存放在同一块组中,所以块组减少了文件的碎片。超级块与组描述符被复制到每个块组中。只有块组0中所包含的超级块和组描述符才由内核使用,是其余的超级块和组描述符保持不变,一个分区有多少块
2011-11-19 19:17:27 1431
原创 块设备驱动层
这一章不准备介绍太多,以后还会补充,主要介绍一下块设备驱动的大致流程。一、 磁盘和磁盘分区的表示磁盘是一个由通用块层处理的逻辑块设备。通常一个磁盘对应一个硬件块设备,如硬盘,软盘或光盘。磁盘是由gendisk对象描述。struct gendisk {01 int major; 02 int first_minor;03 int minors;
2011-10-30 14:27:25 1108
原创 IO调度层
一、 IO调度的两个重要的数据结构request_queue数据结构如下struct request_queue{01 struct list_head queue_head;02 struct request *last_merge;03 struct elevator_queue *elevator;04 struct request_list rq;0506
2011-10-30 14:21:05 959
原创 通用块层
通用块层是一个内核组件,处理来自系统中的所有块设备发出的请求,接着上一层,处理提交过来的缓存区头。如果上一章address_space是关键的数据结构,这一章是bio和bio_vec,这两个数据结构一、 两个重要的数据结构struct bio {01 sector_t bi_sector; 02 struct bio *bi_next; /* request queue lin
2011-10-30 14:19:19 1335
原创 页高速缓存(二)
五. 把块放在页高速缓存中在旧的Linux内核版本中,有两种不同的磁盘高速缓存,分别是页高速缓存和缓冲区高速缓存,前者用来存放访问磁盘文件内容时生成的磁盘数据页,后者把通过VFS访问的块的内容保留在内存中。从2.4.10版本开始,缓冲区高速缓存不存在了,把它们存放在叫做”缓冲区页”的专门页中,页缓冲区页保存在页高速缓冲中。缓冲区页在形式上就是与称做”缓冲区首部”的附加描述符相关的数据页,主要目
2011-10-30 14:15:36 1293
原创 页高速缓存(一)
一、 页高速缓存页高速缓存是Linux内核使用的主要磁盘高速缓存。在大多数情况下,内核在读写磁盘的时候都会引用页高速缓存。如果页不在高速缓存中,新的页就会回到高速缓存中,然后从磁盘中读出数据来填充它。如果内存有足够的空闲空间,会让该页长期保留在高速缓存中,以提高访问磁盘的速度。同样,把数据写到磁盘上也是一样的,如果该数据对应的页在高速缓存中,就可以直接写回磁盘,如果不在,就增加新页,然后写
2011-10-30 14:12:01 2110
原创 块设备的基本概述
什么是块设备,块设备将信息存储在固定大小的块中,每个块都有自己的地址。数据块的大小通常在512字节到32768字节之间。块设备的基本特征是每个块都能独立于其它块而读写。块设备驱动程序的调用,可以由上往下分为下面几层。也就是从上层的应用中的读写函数如何到磁盘中的数据,可以这样分,也就是函数调用的步骤。 第一层VFS部分,在VFS文件系统中给出了一些分析。第二层的具体的文件系统
2011-10-30 14:08:49 1359
原创 sysfs之platform总线初始化简单分析
int __init platform_bus_init(void){01 int error;0203 early_platform_cleanup();0405 error = device_register(&platform_bus);06 if (error)07 return error;08 error = bus_register(&plat
2011-10-23 15:10:03 962
原创 sys之device初始化简单
01int __init devices_init(void)02{03 devices_kset = kset_create_and_add("devices", &device_uevent_ops, NULL);04 if (!devices_kset)05 return -ENOMEM;06 dev_kobj = kobject_create_and_add("dev
2011-10-23 10:03:00 1253
原创 sysfs 文件系统简单分析
01int __init sysfs_init(void)02{03 int err = -ENOMEM;0405 sysfs_dir_cachep = kmem_cache_create("sysfs_dir_cache",06 sizeof(struct sysfs_dirent),07 0, 0, NULL);08 if (
2011-10-22 19:26:50 1011
原创 linux 驱动模型的数据结构
sysfs文件系统sysfs文件系统是一种特殊的文件系统,在系统启动时,被安装在/sys目录,目标主要是展现设备驱动程序模型组件间的层次关系。所包含的目录如下:block 块设备,它们独立于所连接的总线devices 所有被内核识别的硬件设备,都挂在它们的总线上。bus 系统中大部分设备,依靠总线进行连接drivers 注册过的设备驱动程序class 系
2011-10-19 21:55:11 724
原创 rootfs文件系统的简单分析
rootfs文件系统是基于内存的文件系统,也是虚拟的文件系统,在系统启动之后,隐藏在真正的根文件系统后面,不能被卸载。在开始介绍rootfs之前,先介绍一下,rootfs的数据结构,然后再看一下rootfs中的函数rootfs_get_sb是怎么调用的。rootfs的数据结构如下1static struct file_system_type rootfs_fs_type = {2
2011-10-19 07:53:11 6009 2
原创 linux 内核的启动构架
内核为2.6.30.4,平台为S3C2440,友善之臂。内核的启动代码,但一般情况下,是两部分,为了容易理解,可以这样分成三部分。内核启动的第一部分,内核启动的位置在0x30008000,0x30001000存放标记列表,有可以标记列表不只一个,在0x30004000-0
2011-10-18 07:34:33 924
原创 linux 启动之setup_arch函数(二)
01static void __init alloc_init_section(pgd_t *pgd, unsigned long addr,02 unsigned long end, unsigned long phys,03 const struct mem_type *type)04{05 pmd_t *pmd = pmd_offset(p
2011-10-18 07:20:34 836
原创 linux 启动之setup_arch函数(一)
01void __init setup_arch(char **cmdline_p)02{03 struct tag *tags = (struct tag *)&init_tags;04 struct machine_desc *mdesc;05 char *from = default_command_line;0607 unwind_init();0809 s
2011-10-18 07:17:12 1059
原创 linux 根文件系统挂载分析(二)
第三部分解压initramfs文件系统中的内容到rootfs01static int __init populate_rootfs(void)02{03 char *err = unpack_to_rootfs(__initramfs_start,04 __initramfs_end - __initramfs_start);05 if (err)06 pani
2011-10-17 23:32:42 1179
原创 linux 根文件系统的挂载分析(一)
在介绍根文件系统挂载之前先介绍一些基础知识initramfs当linux内核启动后,会找到并执行第一个用户程序,一般是init。这个程序存在于文件系统当中,文件系统存在于设备上,但不知道init存在哪个设备上,于是有了内核命令列选项root=,用来指定root文件系统存在于哪个设备上。然后由于后来的设备类型越来越来多,比如可能在scsi,sata,flash这些设备,还有的存在于网络设
2011-10-17 23:28:26 1003 1
原创 linux VFS数据结构(二)
目录项对象存放目录项与对应文件进行链接的有关信息。每个磁盘文件系统都以自己特有的方式将该类信息存在磁盘上。VFS把目录项当作目录文件来对待,路径中的每个组成部分有一个索引结点表示,虽然它们可以由索引结点表示,但VFS经常需要执行目录相关操作,比如路径的查找等。为了查找方便,VFS引入了目录项这个概念,每个目录项代表路径中一个特定部分。01struct dentry {02 atom
2011-10-17 23:25:48 624
原创 linux VFS数据结构(一)
VFS的数据结构超级块对象记录已安装文件系统的整体信息,由于具体的文件系统来实现,它对应于具体文件系统的超级块或控制块,存储在磁盘的特定扇区上,如果不是基于磁盘的文件系统,比如sysfs,会生成临时的超级块,保存在内存当中。01struct super_block {02 struct list_head s_list; /* Keep this first */03 dev
2011-10-17 23:20:01 592
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人