摘要:make -n 得到makefile的整个过程make -p 得到makefile中的变量611A的DDR问题,总线、转接头每个进程有一个mm_struct,是进程整个用户空间的抽象,mm_struct和vm_area_struct是页面的需求,而page、zone_struct是对页面的供应系统初始化时,根据物理内存大小,建立mem_map,每个page代表系统中的物理页面。物理页面分为zone_dma、zone_normal、zone_highmem,DMA不经MMU,当DMA所需的缓冲区大于一个页面时,要求物理页面连续.PHYS_OFFSET定义在arch/unicore/mach-se
阅读全文
摘要:Linux内核中可以有一个相对简单的方法预先分配缓冲区,就是同步”mem=“参数预留内存。例如,对于内存为64MB的系统,通过给其简单传递mem=62MB命令行参数可以使得顶部的2MB内存被预留出来为I/O内存使用,这2MB内存可以被静态映射,也可以被执行ioremap()。
阅读全文
摘要:写了个platform架构的UART测试驱动,在卸载的时候出了问题,驱动卸载不掉,感觉很奇怪,用户空间使用的rmmod最终会调用kernel/module.c 中的 SYSCALL_DEFINE2(delete_module, const char __user*, name_user, unsigned int, flags)1、按找lsmod显示的模块名查找模块 mod = find_module(name); if (!mod) { ret = -ENOENT; printk("lccdandeion we cant find mod\n"); goto out;}2
阅读全文
摘要:kernel/arch/unicore/mach-sep0611/io.c: map_desc 数组描述了开始有内核自动建立的虚拟空间到物理地址空间的映射(静态映射)kernel/arch/unicore/mach-sep0611/devices.c: 描述了板级支持包,描述了各种资源的物理空间,以及各种platform_device实例的部分内容取值kernel/arch/unicore/mach-sep0611/mach-tiger-test.c: static struct platform_device *devices[] __initdata写明了支持platform架构的设备驱动
阅读全文
摘要:记个事,nfs系统作为根文件系统启动参数没有使用u-boot中传入的参数,内核中自己指定。ubuntu中安装nfs服务端开发板: General setup--->取消Initial RAM filesystem and RAM disk (initramfs/initrd) support设置 Boot options--->取消Passing CMDLINE from u-boot,并设置启动内核指定启动参数root=/dev/nfs rw nfsroot=192.168.0.1:/nfs,v3 ip=192.168.0.2:192.168.0.1:192.168.0.1:25
阅读全文
摘要:1 kbuild.txt 2 3 KBUILD_VERBOSE 4 -------------------------------------------------- 5 Set the kbuild verbosity. Can be assigned same values as "V=...". 6 See make help for the full list. 7 Setting "V=..." takes precedence over KBUILD_VERBOSE. 8 9 KBUILD_EXTMOD 10 ---------------
阅读全文
摘要:记个事: 611在开了dcache情况下,对IO空间地址3和b开头的部分访问结果不同,3开头的被cache住了,而b开头的没有被cache住,3和b还是有区别的. 611BP的FPGA镜像就存在这样的问题,搞了半天才明白
阅读全文
摘要:使用rmmod会出现 rmmod : chdir(/lib/modules): No such file or directory ? 现在的内核模块在插入卸载时都会要转到/lib/modules/内核版本号/ 这个目录里。所以只要建立这个目录并且把要使用的模块.ko文件复制到这个目录就行了。 mkdir -p /lib/modules/$(uname -r) 这个语句不要加到制作ramdisk的脚本中,要加到rc文件中。 较新版本的busybox 1.13.1+ 要卸载模块必须要 “完全匹配模块名”才行,原来在老标本的使用模块文件名就能卸载,现在发现不行了。lsmod====>mmc_
阅读全文
摘要:卡检测CD和写保护WPSD卡槽对于WP和CD和COMM没有统一的物理规范.但对于引脚1~9有统一规范.引脚顺序为 8,7,6,5,4,3,2,1,9卡检测CD和写保护WP是通过机械方式实现WP和CD是否和COMM的连接来区别卡是否插入和是否有写保护.COMM为WP和CD的公共引脚,所以如果COMM被连接到地,那么WP和CD一定要使用Pull-UP电阻上拉到VCC,反之,如果COMM被连接到VCC,那么WP和CD一定要使用Pull-down电阻下拉到GND当卡插入时,卡槽中同COMM连接的金属连接会由于卡的插入使得COMM同CD短路(这个过程与卡插入与否有确定关系,即发生在COMM和CD间的插入
阅读全文
摘要:没办法,自己没有看下去,又被说了“好弱”,自嘲下,在这个实验室,习惯了dalvik-bytecode.html中描述了字节码的顺序,其中,OP & Formatop指示执行何种操作,Format描述了该种操作所对应的数据流格式。这是师兄的一个case,记录下: 1 class add { 2 public static void main (String[] args) 3 { 4 int i = 2; 5 int k = 0; 6 for (i = 1; i < 100; i++) 7 k += i; 8 System.out.println("k = "
阅读全文
摘要:http://blogold.chinaunix.net/u2/69404/showart_1922655.htmlARM GCC 内嵌(inline)汇编手册
阅读全文
摘要:内核必须能够同时处理很多进程,并把进程描述符存放在动态内存中,而不是放在永久分配给内核的内存区域(此内存区指线性地址空间中的一个区域,分配给内核的线性地址空间在3GB以上)linux把两个不同的数据结构紧紧的存放在一个单独的为进程分配的存储区内:一个是与进程描述符相关的小数据结构thread_info,叫做进程描述符,另一个是内核的进程堆栈。内核栈和进程描述符尽量在物理上连续的页匡中,但是也可分离。
阅读全文
摘要:格式参考Multimedia Programming Interface and Data Specifications 1.0 1 aplay -C -c 1 -f U8 -r 11025 -t wav -d 7 my.wav 2 000000 52 49 46 46 9c 2d 01 00 >RIFF.-..< 3 000008 57 41 56 45 66 6d 74 20 >WAVEfmt < 4 000010 10 00 00 00 01 00 01 00 >........< 5 000018 11 2b 00 00 11 2b 00 00 &g
阅读全文
摘要:lwl,lwr,swl,swr中的指令后缀r(right),l(left)都是相对寄存器而言,load操作是把取到的部分数据,置入寄存器的left或者right,store操作时将寄存器中的数据的 left或者right部分写入目标地址。无论时大端和小端寄存器的格式都是固定的,即 寄存器中的有端时数据的低位,左端时数据的高位。非对齐访问的解决都是将原来的一条(对齐访问)完成的事分两步完成:首先取始地址addr到下一个对齐地址处的部分数据,按一定的顺序,置入寄存器的适当位置;然后取从该对齐地址到addr+len-1处的部分数据,按一定的顺序,置入寄存器的适当位置。lwr: 对于大端:从所指位置(
阅读全文
摘要:只谈一个问题:head_common.S中__switch_data:.long init_thread_union + THREAD_START_SPinit_thread_union 使用ctags无法跳转,且链接脚本中没有init_thread_union,使用grep搜索下发现这是在arch/unicore/kernel/init_task.c3 中的联合体变量名称(无法跳转,且不再链接脚本中,即该文件根本汇编文件并不像C文件那样,需要包含头文件,再加extern外部声明)。所以我们在head_common.S中用一个C中的联合体变量名加上了一个常数值。这是因为一个C中联合体变量名被当
阅读全文
摘要:mov pc, r4 @ call kernel 绝对跳转到r4:40008000处开始执行开始进入Image,Image由vmlinux生成,所以从vmlinux开始阅读理解。arch/unicore/kernel目录,据其链接脚本,从head.S开始:__lookup_processor_type:运用相对取址,取出proc_info_list,做出processor对比(因为一个镜像支持一种processor,该processor的信息从协处理器的c0:4d000863中取出)。这里首先要运用相对取值,因为我们编译的内核是按照虚拟地址进行编译链接的,其次是proc_info_list的存
阅读全文
摘要:misc.c中函数decompress_kernel的列表四个参数是:output_start:40008000,free_mem_ptr_p:sp, free_mem_ptr_end_p:sp+64K ,arch_id:9fc (arch_num个人感觉这个英文但其会引起歧义,arch_num的中文意思应该时架构号,改成mach_id可能更适合些,mach_id对应的中文时机器号)最终解压出的是Image放置在了40008000处unicore32-linux-objcopy -O binary -R .note -R .note.gnu.build-id -R .comment -S vm
阅读全文
摘要:do_bootm函数及其所调用的函数,根据头部的定位地址(mkimage –a的参数)将zImage搬移到指定的内存处),根据头部的入口地址(mkimage –e的参数)获得head.o在内存中的地址,设置r0、r1、r2跳到此处执行。boot传入r0=0,r1=machine_ID,r2=taglist (r0为0, r1为machine type, r2位参数列表的物理地址)在次过程中会开启Icache、Dcache,来加速开机过程程序中有一段称为 LC0的表,其中根据链接脚本确定了got段的起始和结束地址,bss段的起始和结束地址,栈的地址(比链接脚本中的指定的stack大于4),解压的
阅读全文
摘要:程序入口The first instruction to execute in a program is called the entry point. You can use theENTRY linker script command to set the entry point. The argument is a symbol name:ENTRY(symbol)There are several ways to set the entry point. The linker will set the entry point by tryingeach of the following
阅读全文