Big Ben

一个半吊子的编码爱好者

0%

内核逻辑地址:开始于0xC000_0000(3G,在编译时指定,即PAGE_OFFSET=3G)处,是物理地址的线性映射,所以如此配置的32位CPU的可控内存最大值即为1GB。由于物理内存的低地址和高地址会留作他用,所以一般可用内存大小只有大约950MB。如果物理内存超过950MB,则在编译时要指定CONFIG_HIGHMEM4G和CONFIG_HIGHMEM64G。由于物理内存本身也是有页式内存管理,所以并不冲突。其线性地址仍然由页表来对应到具体的内存单元。
内核虚拟地址:是指整个1G的内核空间,其中包含了上面的内核逻辑地址以及超过内核逻辑地址空间的高端内存。这一块内存是为数量大于896MB的物理内存准备的,需要由kmap将内存映射到该区域上来使用,用完再用kunmap来释放。

逻辑地址应当是一种特殊的虚拟地址,他应该和段式内存管理对应起来。
内存转换: 逻辑地址 -> 线性地址 -> 物理地址

逻辑地址: = 段标识符 + 段内偏移量。为了兼容,将远古时代的段式内存管理方式保留了下来。
CPU将一个虚拟内存空间中的地址转换为物理地址,需要进行两步:首先将给定一个逻辑地址(其实是段内偏移量,这个一定要理解!!!),CPU要利用其段式内存管理单元,先将为个逻辑地址转换成一个线程地址,再利用其页式内存管理单元,转换为最终物理地址。 (http://bbs.chinaunix.net/thread-2083672-1-1.html

所谓的段式管理,就是把所有内存空间分为:数据段,代码段,系统段等等(可参考UBOOT里面的lds链接脚本)。每个段有一个描述符,称为段描述符。而段描述符又分为全局的(GDT, 用于系统或内核级),局部的(LDT, 用于进程级)。不同的内存空间的逻辑地址会取到不同 的段描述符,再从段描述符中取到段基地址,然后得到线性地址。
linux的段式管理做了一定的简化,对于用户空间和内核空间来说,可以从代码看出,其基地址均为0,所以一个逻辑地址其实就=线性地址,因为线性地址=基地址(0)+offset=逻辑地址

每个CPU都会保存的变量,因为CPU的指令都是分时复用的,所以对该变量的操作不用锁定,用DEFINE_PER_CPU(type, name)来声明这样一个变量

最好保证这些变量较小,因为在某些架构的CPU上per-CPU地址空间是受限的。一般per-CPU变量可以作为一个会被频繁操作的计数器使用。

静态的per-CPU变量,可以用get_cpu_var, put_cpu_var来操作该变量。
为了防止内核被抢占或切换到其他CPU运行,动态per-CPU变量在操作前,最好用get_cpu()来阻塞内核抢占。

Linux内存分为三个区段:
DMA内存
常规内存
高端内存

内核只能分配一些预定义的,固定大小字节数组 
1. kmalloc不能分配高端内存

2. 后备高速缓存,是一个内存池,容纳了任意数量的小内存块,块的大小由分配该缓存池时指定。高速缓存的使用统计可以从/proc/slabinfo中获得。

3. 内存池,其实就是一种高速缓存,其会保存某个最小数额的分配块,当超过该最小数额的内存块被释放时,会被返回给系统,如果在此数额之内,则还是会留在这块内存池中。在内存池被销毁时,需要返回所有已分配内存,否则内核会有oops。

4. get_free_page
以页(2的n次方)为单位分配内存,可以有效避免外部碎片

5. vmalloc,用来分配大尺寸内存。因为其会建立页表,所以他的物理内存可能不连续,但是他的虚拟内存一定是连续的。

6. 内核甚至允许在引导时分配内存,这是一个不得已采取的方法,在引导时分配的内存,是没办法由内核的内存管理模块管理的,其接口是alloc_bootmem_xxx

内存技术的区别:
1. kmalloc,__get_free_pages,vmalloc均分配的是虚拟地址。前两个的地址是直接线性映射的,所以虚拟地址和物理地址是一一对应的,而后者是通过页表间接映射的,所以分配时较慢,且不和物理地址一一对应
2. vmalloc不能用于原子上下文,因为他是用kmalloc(GFP_KERNEL)实现的,没有用GFP_ATMIC标志,所以会休眠。

你正在开发UNIX软件?哪一种?你是否处理了所有可移植性问题?你正在为某个特定版本的Windows做开发?哪一种——3.1,95,98,NT,CE,还是2000?支持其他版本有多难?如果你让决策保持软和与柔韧,事情就完全不困难。如果在代码中有着糟糕的封装,高度耦合以及硬编码的逻辑或参数,事情也许就是不可能。
得墨忒尔(Demeter)法则:
1.调用属于类本身的函数
2.调用通过参数传入的函数
3.调用在函数体中创建的对象(包括new出来的和按值定义的)的函数
这一法则可能会造成很多只有包装的方法,只做参数传递而不做任何处理。可能会造成性能的牺
牲,在必要时必须做出取舍。但这是一种哲学,必须牢记。

配平:一个分配注定一次释放

C++:依靠构造函数和析构函数,自动释放,而避免手动操作和丑陋的代码
JAVA:一口finally子句,只要用try,不管发不发生异常,改子句都会被call到

针对C这样的语言,最好是为每个重要结构编写自己的模块,提供相应的分配和解除措施

还有一个比较好的做法,是为动态分配的对象实现引用计数

明朝7
二月河的三帝系列
银河英雄传说
李自成
加起来得有小30本了,够我看好些年了
先这么定了,一套套买

今晚一如往常的看bbs,看到chinese版聚的帖子。对chinese的人气早有耳闻,只是一直没有去浏览。

我本对文学有些兴趣,不排斥读书,也好些古文之类,读诗也不过是在写字之余略吟几首。很向往文采斐然的人,什么样的文字都可以写的很优美。说这些,又显得有点叶公好龙了。大学以来,或者高中以来,甚至初中,书读的是很少的。偶尔会借几本小说看看,没有看过诗集,没有读过思辨的文字,书法方面也没读过名家的书论,只有小说,而且看完就忘记了。如果说时间都是花来学习了,或许也不是我所愿,但至少也有所得。然而也非如此,大段的时间都是人浮于事,浑浑噩噩。也不至于后悔,只是可以更心平气和一些,把时间花在一些更有意义的事情上。

 可是话又说回来,当下我也不知道哪些是更有意义的,至少chinese版我会常去潜水的。

又在实验室厮混了一天。晚上十一点,徒步回寝室。
刚下过雨,三月的风吹过来,夹杂了细雨,还是有些冷的。没有月亮,路灯很亮,没有行人,只有我。
为了让CD不至于放坏了,路上开始听。偶尔听到张,范合唱的别让情两难。这是一个电视剧的片尾曲,片首曲是华仔的你震撼了我的心灵,片名已经记不得了。只记得大概是小学末,初中初的时候安徽台放的。范文芳和万梓良主演的。记得书记好像也看过。
那是夏末的季节。外公还没有去世。那时我爱唱你震撼了我的心灵,粤语的。外公总是呵斥我,“歌都不好好唱!”
而我继续:“奔奔波波就像人生,多多少少各自成怨恨。。。。”。
十来年了。外公也去世快十年了。十年以后,不知道我会听到哪首歌,想到今天。
寝室太热了,一身汗。今天肚子不舒服,明天还要起来看球。笔记本电源丢在实验室了。快十二点了,又是一天了