關於do brk 分析

2021-09-13 21:28:41 字數 1354 閱讀 3334

unsigned long do_brk(unsigned long addr, unsigned long len)

do_brk函式目的是為了將addr位置向後繼續申請len位元組長度,用作於擴充套件堆記憶體的長度

首先會對於len這個長度進行頁面對齊,並且去判斷頁面對齊之後是否超出了邊界

len = page_align(len);

if (!len)

return addr;

if ((addr + len) > task_size || (addr + len) < addr)

return -einval;

判斷一下當前的物理記憶體是否處於鎖定狀態(防止被交換出去),保持和原來狀態的一致性

if (mm->def_flags & vm_locked)

尋找當前addr位置對應的vma,看看是不是已經存在的vma將addr已經覆蓋了,需要呼叫munmap將覆蓋部分清除,保證addr到addr+len這一段記憶體是空白的沒有被任何的vma所覆蓋。

vma = find_vma_prepare(mm, addr, &prev, &rb_link, &rb_parent);

if (vma && vma->vm_start < addr + len)

對於當前上乙個的vma進行擴充套件,擴充套件至addr加上len的位置,如果成功那麼ok,進行mm_struct的維護然後返回。

if (vma_merge(mm, prev, addr, addr + len, flags,

null, null, pgoff, null))

goto out;

否則需要來建立乙個新的vma來對當前的記憶體進行對映,將變數設定後放入vma的紅黑樹鍊錶中。

vma = kmem_cache_alloc(vm_area_cachep, slab_kernel);

if (!vma)

memset(vma, 0, sizeof(*vma));

vma->vm_mm = mm;

vma->vm_start = addr;

vma->vm_end = addr + len;

vma->vm_pgoff = pgoff;

vma->vm_flags = flags;

vma->vm_page_prot = protection_map[flags & 0x0f];

vma_link(mm, vma, prev, rb_link, rb_parent);

關於curl,關於url分析

leader需要我從海量的url中選取url最多的1000個站點,每個站點再隨機抽取100個url,分析url的質量,這裡的質量,就是指是否死鏈,是否全部廣告之類的 是否死鏈只要使用瀏覽器開啟看看就ok了 然而 1000乘以100 乙個乙個去做的話,顯然太傻,於是我使用了curl寫個程式去獲取htt...

關於需求分析

以下是抄別人的,特註明 1 弄清楚三件事 業務流 企業工作流程,比如如何填寫乙個 等 控制流 權力關係,因為這決定將來的許可權,比如簽字級別 資料與操作者的關係等 資料流 就是資料資訊的格式 流轉過程,比如乙個單據是怎麼流轉處理的,這決定將來的資料規劃 2 一定要盡量理解使用者業務,吃透使用者的業務...

關於cout hex原理分析

c primer plus提到,hex是乙個函式,hex cout 效果和cout 比如operator 經過反覆測試,其實hex被計算機理解為了函式指標型別。於是我偽造了乙個ios類,並構造了乙個cout物件,cout 經過cout include include using namespace ...