• 活的潇洒
    2019-05-29
    决心从头把计算机所有的基础课程全部补上,夯实基础,一定要坚持到最后
    day26笔记:https://www.cnblogs.com/luoahong/p/10931320.html
    
     8
  • 没心没肺
    2019-07-05
    好恐怖,看到这里,是硬看了

    作者回复: 不怕不怕

    
     7
  • Ezra_Xu
    2019-05-27
    内核能用c语言编写,是不是意味着用c可以直接操作物理内存,另外linux上的c语言编译器是用什么语言开发的,c语言实现了自举吗,c语言跨平台底层原理是什么,请老师答疑解惑。

    作者回复: 是因为C语言编译完了就直接是硬件能够识别的二进制,不像java,需要jvm才能运行。C语言不用自举,除了第一个开发C语言的,需要用汇编来做,后面都可以用锤子造锤子

    
     5
  • why
    2019-05-27
    - 涉及三块内容:
        - 内存映射函数 vmalloc, kmap_atomic
        - 内核态页表存放位置和工作流程
        - 内核态缺页异常处理
    - 内核态页表, 系统初始化时就创建
        - swapper_pg_dir 指向内核顶级页目录 pgd
            - xxx_ident/kernel/fixmap_pgt 分别是直接映射/内核代码/固定映射的 xxx 级页表目录
        - 创建内核态页表
            - swapper_pg_dir 指向 init_top_pgt, 是 ELF 文件的全局变量, 因此再内存管理初始化之间就存在
            - init_top_pgt 先初始化了三项
                - 第一项指向 level3_ident_pgt (内核代码段的某个虚拟地址) 减去 __START_KERNEL_MAP (内核代码起始虚拟地址) 得到实际物理地址
                - 第二项也是指向 level3_ident_pgt
                - 第三项指向 level3_kernel_pgt 内核代码区
        - 初始化各页表项, 指向下一集目录
            - 页表覆盖范围较小, 内核代码 512MB, 直接映射区 1GB
            - 内核态也定义 mm_struct 指向 swapper_pg_dir
            - 初始化内核态页表, start_kernel→ setup_arch
                - load_cr3(swapper_pg_dir) 并刷新 TLB
                - 调用 init_mem_mapping→kernel_physical_mapping_init, 用 __va 将物理地址映射到虚拟地址, 再创建映射页表项
                - CPU 在保护模式下访问虚拟地址都必须通过 cr3, 系统只能照做
                - 在 load_cr3 之前, 通过 early_top_pgt 完成映射
    - vmalloc 和 kmap_atomic
        - 内核的虚拟地址空间 vmalloc 区域用于映射
        - kmap_atomic 临时映射
            - 32 位, 调用 set_pte 通过内核页表临时映射
            - 64 位, 调用 page_address→lowmem_page_address 进行映射
    - 内核态缺页异常
        - kmap_atomic 直接创建页表进行映射
        - vmalloc 只分配内核虚拟地址, 访问时触发缺页中断, 调用 do_page_fault→vmalloc_fault 用于关联内核页表项
    - kmem_cache 和 kmalloc 用于保存内核数据结构, 不会被换出; 而内核 vmalloc 会被换出
    展开
    
     3
  • 活的潇洒
    2019-05-27
    坚持完整的学到底,坚持完整的笔记到底
    day26 学习笔记:https://www.cnblogs.com/luoahong/p/10931320.html

    作者回复: 加油

    
     2
  • 俩孩儿他爸
    2019-09-03
    page_address的实现如下:

    ```
    /**
     * page_address - get the mapped virtual address of a page
     * @page: &struct page to get the virtual address of
     *
     * Returns the page's virtual address.
     */
    void *page_address(const struct page *page)
    {
        unsigned long flags;
        void *ret;
        struct page_address_slot *pas;

        if (!PageHighMem(page))
            return lowmem_page_address(page);

        pas = page_slot(page);
        ret = NULL;
        spin_lock_irqsave(&pas->lock, flags);
        if (!list_empty(&pas->lh)) {
            struct page_address_map *pam;

            list_for_each_entry(pam, &pas->lh, list) {
                if (pam->page == page) {
                    ret = pam->virtual;
                    goto done;
                }
            }
        }
    done:
        spin_unlock_irqrestore(&pas->lock, flags);
        return ret;
    }
    ```

    - 如果不是高端内存,物理地址和虚拟地址之间的转换相对比较简单,直接使用lowmme_page_address进行转换,前面提到过这个函数;
    - 对于非高端内存页,通过page_slot计算出pas,pas保存在由pagez作为key的hash表page_address_htable中;
    - 遍历pas->lh双向链表,链表的节点保存有page的地址和page所对应的虚拟地址,通过page,可以确定page对应的虚拟地址。
    展开
    
     1
  • Bing
    2019-08-15
    用malloc申请的内存,进程退出时,操作系统是否会释放

    作者回复: 当然会啊,虚拟内存嘛

    
     1
  • 莫名
    2019-07-18
    👍看起来很有感觉,先讲用户态、内核态虚拟内存的管理,然后讲物理内存的管理,最后讲用户态、内核态虚拟内存与物理内存如何建立关联。

    作者回复: 赞,有感觉就好,要的就是心动

    
     1
  • LDxy
    2019-06-02
    操作系统是如何知道计算机上有多少物理内存的呢?

    作者回复: 初始化的时候,会检测硬件

    
     1
  • Dylan
    2020-01-31
    我记得kmalloc 分配的内存大小有限制的,128k
    
    
  • 陈志恒
    2019-11-25
    对于内存,要提醒自己内核态和用户态的概念,虚拟地址和物理地址的概念!
    
    
  • 陈志恒
    2019-11-25
    整个内存的讲解(这个专栏内容如果一下看不懂直接跳总结部分,甚至每章的最后,现有个整体认识,再返回去看细节,会容易很多)
    
    
  • kdb_reboot
    2019-10-02
    老师,针对内存管理有什么资料推荐吗,看的有点晕。发现了一件事情:虽然老师讲的很好,但是如果针对个人,看专栏的话,还是有很多隐含信息需要自己去了解
    
    
  • 栋能
    2019-07-25
    没太看懂kmalloc又是从哪里来的,是写错了么?(这个我还特意往前找了下,以为是kmmap,用于内存映射区的呢)

    作者回复: kmalloc内核空间内存申请函数。

    
    
我们在线,来聊聊吧