Linux设备驱动开发详解 笔记11 内存与I/O访问
typedef void (*lpFunction) ();//定义一个无参数,无返回类型的函数指针类型
//定义一个函数指针,指向cpu启动后所执行的第一条指令的位置
lpFunction lpReset = (lpFunction)0xF000FFF0;
lpReset();//调用函数
MMU停供虚拟地址和物理地址的映射、内存访问权限保护和Cache缓存控制等硬件支持。操作系统内核借助MMU,可以让用户感觉到好像程序可以使用非常大的内存空间,从而使得编程人员在写程序时不用考虑计算机的物理内存的实际容量
如图,当ARM要访问存储器时,MMU先查找TLB中的虚拟地址表。如果ARM的结构支持分开的数据TLB(DTLB)和指令TLB(ITLB),则除去指令使用的ITLB外,其他的都是用DTLB
若TLB中没有虚拟地址的入口,则转换表遍历硬件从存放于主存储器中的转换表中获取地址转换信息和访问权限(即执行TTW),同时将这些信息放入TLB,它或者被放在一个没有使用的入口或者替换一个已经存在的入口。之后,在TLB条目中控制信息的控制下,当访问权限允许时,对真实物理地址的访问将在Cache或者在内存中发生
用户空间0-3GB,内核空间3-4GB,用户进程通常情况下只能访问用户空间的虚拟地址,不能访问内核空间虚拟地址。用户进程只能通过系统调用等方式才能访问到内核空间
每个进程的用户空间都是完全独立、互不相干的,用户进程各自有不同的页表。而内核空间是由内核负责映射,它并不会跟着进程改变,是固定的。内核空间地址有自己对应的叶表,内核的虚拟空间独立于其他程序
Linux中的1GB内核地址空间又被划分为内存映射区,虚拟内存分配区、高端页面映射区、专用页面映射区和系统保留映射区
void kmalloc(size_t size, int flags);
第二个参数为分配标志,用于控制kmalloc的行为,最通常用的分配标志是GFP_KERNEL,其含义是再内核空间的进程中申请内存。Kmalloc的底层依赖__get_free_pages()实现,GFP正好是这个函数的缩写,使用GFP_KERNEL标志申请内存时,若暂时不能满足,则进程会睡眠等待页,即引起阻塞,因此不能在中断上下文或持有自旋锁的时候使用此标志申请内存
在中断处理函数、tasklet和内核定时器等非进程上下文中不能阻塞,此时驱动应该使用GFP_ATOMIC标志来申请,若不存在空闲页,直接返回
__get_free_pages():
此系列函数包括:
get_zeroed_page(unsigned int flags);
返回一个指向新页的指针并且将该页清零
__get_free_page(unsigned int flags)
该宏返回一
相关文档:
总览
用iptables -ADC 来指定链的规
则
,-A添加 -D删除 -C 修改
iptables - [RI] chain rule num rule-specification[option]
用iptables - RI 通过规则的顺序指定
iptables -D chain rule num[option]
删除指定规则
iptables -[LFZ] [chain][option]
用iptables -LFZ 链名 [选项]
iptables -[NX] chain
用 -NX ......
这两天搭建了一组Apache服务器,每台服务器4G内存,采用的是prefork模式,一开始设置的连接数太少了,需要较长的时间去响应用户的请求,后来修改了一下Apache 2.0.59的配置文件httpd.conf:
# prefork MPM
# StartServers: number of server processes to start
# MinSpareServers: minimum number of server processes ......
我用的是最普通的usb摄像头,主芯片为中星微ZC0301P(据说市场占有率70%以上),COMS传感器为hynix的hv7131e1,市面上能买到的基本上是这种配置。
linux下驱动,我直接移植spca5xx,现在出了spc5xx-le(Light-Edition for Linux Embedded)更方便,直接针对嵌入式系统做了优化,可以参考这里http://mxh ......
我的第一个shell程序:tt1.sh
while true
do
date;
sleep 1;
done
执行方式1:sh tt1.sh
执行方式2:./tt1.sh(要求该文件有可执行权限)
Shell变量:
环境变量:
工具:echo 回显
&n ......
使用下列洪可以通过主设备号和次设备号生成dev_t
MKDEV(int major, int mainor)
如果复制的内存是简单类型,如char、int、long等,则可以使用简单的put_user()和get_user()
Linux系统建议以如图方式定义ioctl命令码
命了码的设备类型字段为一个“幻数”,可以是0-0xff之间的值,内核中的ioctl-number ......