摘要:0. 背景知识 0.1. 硬件 sram : 硬件复杂,成本高,CPU通过A0-A18个地址线一次输入要访问的地址,就能获得数据,所以CPU能直接访问 ddr sdram: 硬件简单,成本低,但CPU需要通过a0-a10地址线多次输入地址,先输入行地址,再输入列地址,才获得数据,由于有时序问题,所以
阅读全文
摘要:简单上手 1. 环境搭建 按照资料建立的开发环境,遇到个问题 VFS: Mounted root (yaffs filesystem) on device 31:4. Freeing unused kernel memory: 200K This architecture does not have
阅读全文
摘要:此文介绍Linux的设备树使用模范。 Open Firmware 设备树是用于描述硬件的数据结构和语言。 他是一种对硬件的描述,此描述是可被操作系统读的,所以OS不需要硬编码机器的详细信息。 从结构上看,DT是一个命名节点构成的树,节点可能有任意数量的属性,属性可以包含任意数量的数据。存在一种机制,
阅读全文
摘要:1. 简介 platform是 设备驱动总线模型 2. 示例 #include <linux/platform_device.h> #include <linux/module.h> static struct platform_device *led_dev; static struct reso
阅读全文
摘要:1. framebuffer框架简述 1.1 init init完成主设备号申请,cdev创建并加入系统,设置了fops,但这个fops只是虚函数 fbmem_init register_chrdev 1.2 open fb_open fbidx = iminor(inode); info = re
阅读全文
摘要:1. 框架分析 1.1 connect input_init register_chrdev(INPUT_MAJOR, "input", &input_fops); static const struct file_operations input_fops = { .owner = THIS_MO
阅读全文
摘要:button字符驱动 #include <linux/module.h> #include <linux/spinlock.h> #include <asm/atomic.h> #include <linux/poll.h> #include <linux/interrupt.h> #include
阅读全文
摘要:设备模型的意义 为了避免驱动开发中对相同功能的重复实现,内核按照面向对象的思想,实现了一套驱动开发通用的函数和对象,称为设备模型。 如下,根据开发驱动的不同,继承不同父类,简化开发。 kobject kobj使用示例 #include <linux/module.h> #include <linux
阅读全文
摘要:1. 准备 首先在 menuconfig 时开启 debugfs Kernel hacking > Generic Kernel Debugging Instruments > [*] Debug Filesystem Debugfs default access (Access normal) >
阅读全文
摘要:1. 简介 proc文件系统:一种和内核交互的接口,最早专用于读写进程信息。 特点: proc文件系统的文件节点只能从内核层创建,且这些节点的 ops 和 设备节点类似,是由创建者定义的。 2. proc文件系统的注册和挂载 start_kernel --vfs_caches_init 挂载root
阅读全文
摘要:设备端文件系统的格式 所有文件系统都使用如下格式为基础 如minix,适用于小容量环境 如ext2,适用于大容量环境,于是进行了扩展 具体分析设备上的文件系统 以最简单的minix为例 格式化 root@ubuntu:~# mkfs.minix /dev/sdb 704 inodes 2048 bl
阅读全文
摘要:字符设备驱动的框架 设备节点:inode,类型为字符设备,记录设备号 设备号:内核确定驱动的唯一编号 cdev:字符驱动对象 框架代码 驱动 #include <linux/module.h> #include <linux/file.h> #include <linux/rtc.h> static
阅读全文
摘要:1. 理论 早期的51单片机只有4个中断,中断可以直接发给cpu ARM SoC有GIC,中断发给GIC,GIC发给cpu。 GIC有两个重要部分, 中断仲裁器,根据中断优先级,屏蔽,决定发送哪个中断, cpu接口,由于现在都是多核cpu,所以需要决定发送给哪个cpu 中断分类 SGI:16 sof
阅读全文
摘要:1. 系统调用的原理 linux借助硬件实现特权态和用户态运行,应用程序只能通过系统调用进入内核态。 方法是使用系统调用指令。 以arm32环境,打印hello world字符串的汇编为例 .text .global _start _start: mov r0, #1 /* stdout */ ad
阅读全文
摘要:0. kbuild的组成 0.1 构成文件 顶层Makefile .config arch/$(ARCH)/Makefile 各个目录下的Makefile scripts/Makefile.* 0.2 预定义的目标和变量 obj-m obj-y xxx-objs zImage menuconfig
阅读全文
摘要:1. 缓冲区的作用 缓冲区是在物理内存中开辟的一块空间,这块内存空间的物理性质与进程所占的内存空间没有什么本质的不同。块设备与缓冲区交互数据同硬盘与进程内存空间交互数据从物理层面上看完全相同,既不会影响交互数据的正确性,也不会影响交互数据的传输速度。从这个角度看,没有缓冲区没有什么不可以,完全可以实
阅读全文
摘要:现代操作系统的重要特征就是支持实时多任务——同时运行多个程序。运行中的程序被称为进程。在类UNIX操作系统的设计者看来,操作系统的核心就是进程。 所谓的操作系统就是若干个正在运行、操作的进程构成的系统。按照这个思路,进程的创建只可能由进程承担,也就是父子进程创建机制。在任何情况下,至少得有 一个进程
阅读全文
摘要:1. 使用模块机制 测试模块hello.c #include <linux/init.h> #include <linux/module.h> static int __init hello_init(void) { printk("Hello world\n"); return 0; } stat
阅读全文
摘要:1. 挂载文件系统 当前系统已经完成了根文件系统的挂载,将要挂载新的文件系统。 新的文件系统挂载在根文件系统的某个目录的inode上。 1)将硬盘的超级块读出,载入系统的super_block[8]中 2)从根文件系统读出指定的inode,载入inode_table[32] 3)将硬盘的超级块挂接到
阅读全文
摘要:现在已经有进程0,进程1,并挂载根文件系统,接下来创建进程2,并加载shell。 1. 打开标准输入,标准输出,标准错误 加载完根文件系统后,进程1调用open打开标准输入 open产生软件中断 int0x80,根据在IDT中的偏移,进入sys_open函数。 sys_open 分配 文件描述符,分
阅读全文