Linux内存空间访问札记(转)
http://blog.chinaunix.net/u/25764/showart_1882931.html
引:本来打算将这部分内容并入到《The Linux Kernel Module Programming Guide笔记》中去,但是想下内存空间管理访问相当基础重要而且内容量较大,所以就单独记录。在过去一年里,由于成功开发过几个颇为复杂的设备驱动,就自以为掌握了驱动开发的方法和技巧,事实上在基础上,我却有着致命的盲点。这个盲点就是Linux的内存管理,其实很久之前,就一直就搞不懂MMU、Page、Section、页表等概念,那时以为这些并不重要。现在看来终于尝到苦果了,在开发Virtual Framebuffer的时候,就在mmap这个接口实现上卡住了。俗话所说的书到用时方很少,是至理名言啊。
注:在x86架构上,会分为内存空间和I/O空间,但是在大多数嵌入式控制器如ARM、PowerPC并不提供I/O空间。我面向的主要是嵌入式方面的驱动开发,所以这里并不讨论I/O空间的内容。本文的内容大多数是摘录《Linux设备驱动开发详解》的第十一章,并结合我在开发过程的一些心得体会。
一、内存管理单元MMU
MMU辅助操作系统进行内存管理、提供虚拟地址和物理地址的映射、内存访问权限保护和Cache缓存控制等硬件支持,可见,这将使得Linux操作系统能单独为系统的每个用户分配独立的内存空间并保证用户空间不能访问内核空间的地址,为操作系统的虚拟内存管理模块提供了硬件基础。
在s3c2410的vivi这个bootloader中,建立了一个4GB物理地址与虚拟地址一一映射的一级页表,我们可以通过函数mem_mapping_linear()来探寻一下其创建过程
static inline void mem_mapping_linear(void)
{
unsigned long pageoffset, sectionNumber;
/*4GB虚拟地址映射到相应的物理地址上,均不能缓存*/
for (sectionNumber = 0; sectionNumber < 4096; sectionNumber++)
{
pageoffset = (sectionNumber << 20);
*(mmu_tlb_base + (pageoffset >> 20)) = pageoffset | MMU_SECDESC;
//mmu_tlb_base为存放页表的首地址,tlb是转换旁路缓存,是转换表的Cache
}
/*使能DRAM的区域可缓存*/
 
相关文档:
(AIX命令)iostat命令主要通过观察物理磁盘的活跃时间以及他们的平均传输速度,监控系统输入/输出设备负载.
iostat [间隔时间] [打印次数]
exp: iostat 5 2
ps命令是UNIX系统中最常见的命令,它主要显示系统中关于进程的统计和状态信息,如进程ID,I/O行为以及CPU利用率等.
显示10个消耗CPU最多的进程:
ps aux |sort ......
1. 最常用的命令列表
下面列出十个在使用linux过程中使用频率最高的命令。这里只作简单介绍,具体用法请参考后面内容。
cat,显示文件内容。
cd,改变目录路径。
cp,复制文件。
find,查找文件。
grep,搜索、过滤信息。
ls,列出目录信息。
more,分页显示。
rm,删除文件或目录。
vi,调用vi文本编辑器 ......
序 言
由于开发环境需要在linux-2.6内核上进行,于是准备对我的虚拟机上的Linux系统升级。没想到这一弄就花了两天时间(反复装系统,辛苦啊~~),总算把Linux系统从2.4.20-8内核成功升级到了2.6.18内核。
网上虽然有很多介绍Linux内核升级的文章,不过要么过时,下载链接失效;要么表达不清,不知所云;更可气的 ......
在debian Linux服务器的日志中,dmesg出现类似的信息:
TCP: Treason uncloaked! Peer 202.106.38.7:57824/80 shrinks window 3573023813:3573023814. Repaired.
TCP: Treason uncloaked! Peer 202.106.38.7:57824/80 shrinks window 3573023813:3573023814. Repaired.
TCP: Treason uncloaked! Peer 202.99.99.211:3760 ......
Linux使用从1970年1月1日0时0分0秒起到开机时经过的秒数作为开机时间, 是在main.c和mktime.c中进行初始化的.
1. linux/init/main.c
/*
* read current time from CMOS.
* 访问CMOS需要通过端口0x70, 0x71进行.
* 读数据时,先用OUT指令向0x70发送要读取字节的偏移位置值, 然后用IN指令从0x71读数据. ......