精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

為什么Linux內核常常用Unsigned Long來代替指針

系統 Linux
昨天我犯了一個錯誤把指針和整數“混淆”的錯誤,幸得隊友王童鞋指正,今早起床,我把這個心得花一點時間記錄下來。

 

本文目錄

  • 不知道自己不知道!
  • 指針何時指針?
  • 指針何時是整數?
  • 物理地址是指針?
  • 模糊地帶
  • 絕世好代碼?

昨天我犯了一個錯誤把指針和整數“混淆”的錯誤,幸得隊友王童鞋指正,今早起床,我把這個心得花一點時間記錄下來。

大抵掌握一個技術或者知識都是這三個階段:

  • 不知道自己不知道;
  • 知道自己不知道;
  • 知道自己知道。

比較難突破的是“不知道自己不知道”的階段,因為“不知道自己不知道”,所以才往往特別自信,覺得“老子天下第一”。基本上,本文要記錄的一個小點,也是一個我從“不知道自己不知道”到“知道自己知道”的過程。

我們都知道(???),指針和整數在C語言里面是兩種不同含義的:

  • 指針:主要是為了方便引用(Dereferencing)一個內存地址, Dereferencing is used to access or manipulate data contained in memory location pointed to by a pointer。所以指針的目的其實就是為了這樣的讀寫操作:
  1. *p = a; 
  2. b = *p; 
  • 整數:整數是一個數值,它的主要目的是為了加減等計算、比對、做數組下標、做索引之類的。它的目的不是為了引用一個內存。指針和整數(這里主要是unsigned long,因為unsigned long的位數一般等于CPU可尋址的內存地址位數)本身是八竿子打不著的,但是它們之間的一個有趣聯系是:

如果我們只是關心這個地址的值,而不是關心通過這個地址去訪問內存,這個時候,內核經常喜歡用unsigned long代替指針。

我們下面來看2個不同的場景:

指針是指針?

  1. copy_from_user(void *to,  
  2.      const void __user *from,  
  3.      unsigned long n); 
  4.  
  5. copy_to_user(void __user *to,  
  6.      const void *from,  
  7.     unsigned long n); 

在這2個函數里面,void __user *from,void __user *to都清楚地表明用戶空間的虛擬地址是一個指針。這2個函數這樣做的原因是非常清晰的,我就是要去Dereference用戶空間的地址,進行內存拷貝的,所以它的目的是為了通過指針來訪問內存。

類似的例子比如file_operations里面read、write什么的:

指針是整數?

  1. /**              
  2.  * get_user_pages() - pin user pages in memory 
  3.  * @start: starting user address 
  4.  * ... 
  5.  */ 
  6. long get_user_pages( 
  7.    unsigned long start, 
  8.    unsigned long nr_pages, 
  9.    unsigned int gup_flags, struct page **pages, 
  10.    struct vm_area_struct **vmas) 

注釋清楚地寫明,start是用戶態的起始地址:@start: starting user address

所以,本質上,和copy_from_user()里面的void __user *from一樣的,但是這里它用的是unsigned long start !!!不是void __user * start !!!

原因非常清楚,get_user_pages()只關心start這個數值本身,它用于去運算、查找、比對。它不是要:

  1. *start = 100; 

類似的例子還有:

  1. long pin_user_pages( 
  2.    unsigned long start, unsigned long nr_pages, 
  3.    unsigned int gup_flags, struct page **pages, 
  4.    struct vm_area_struct **vmas); 

更加不要提著名的find_vma():

  1. /* Look up the first VMA which satisfies  addr < vm_end,   
  2. NULL if none. */ 
  3. struct vm_area_struct *find_vma( 
  4. struct mm_struct *mm,  
  5. unsigned long addr); 

它根據addr用戶態地址,在進程的mm里面去找到addr位于的VMA。顯然,這個時候,它的目的是為了完成addr與進程每個VMA起始和結束地址的比多。

這個時候,我們來看看VMA結構體的長相,就更加有意思了。我們都知道,VMA是為了記錄進程每一段虛擬地址空間的(比如代碼段、數據段、堆、棧、mmap等):

然后我們看看VMA的定義:

看到沒有,vm_start和vm_end都是妥妥的unsigned long啊!!!

我于是試圖弄清楚這么做的科學依據是什么,發現LDD3里面赫然寫著這么一段話(LDD3第11章289頁):

它的科學依據是,既然你不是為了dereferencing,我就讓你dereferencing不了,免得你又跑去dereferencing,從而導致bug。有的人說,我強制轉化unsigned long為指針,不就可以訪問了嗎?

你不是還是需要強制轉換不是?你強制轉換之前,會想一下,這個地方指針為啥是個整數呢?你想明白了,說不定就不去訪問了。這樣它實際達到了震懾心靈的效果。

到這里,我們談的都還是虛擬地址,那么下面我們來談下物理地址。

物理地址是指針?

在一個有MMU的系統中,物理地址從來都不是指針。物理地址,從骨子里就是一個整數!!!我記得之前經常有人往內核發patch,把物理地址用個指針

*p來描述,這是錯到根子里面的事情,所以每次都被罵地狗血淋頭。

因為你根本不可能用物理地址去Dereferencing 什么東西。物理地址在內核的描述是:

它要么是一個32位的整數,要么是一個64位的整數。

那么,物理地址什么時候是一個指針呢?在我還是一個小屁孩在大學玩《仙劍奇俠傳》和《軒轅劍:天之痕》的時候,我那個時候玩單片機,單片機里面沒有MMU,所以也沒虛擬地址的概念,都是妥妥地通過物理地址“指針”來訪問內存的。

所以,如果一個人,一輩子都是玩單片機,它肯定會覺得我這篇文章在胡扯,因為他還是一個“不知道自己不知道”的階段。

模糊地帶

這里面仍然有一些模糊地帶,比如__get_free_page()、__get_free_pages()這樣的API,返回的也是unsigned long而不是指針:

往死里作也要把它弄成unsigned long!!!

實際上,內核要有時候需要訪問__get_free_page()返回的內存,此前它需要進行強制類型轉換:

這看起來是不是特別地“精分”?折騰來折騰去,折騰什么鬼呢?這一篇文章有解釋:An (unsigned) long story about page allocation

https://lwn.net/Articles/669015/

統計表明,90%以上的情況下,__get_free_page()返回的unsigned long都會被強制轉化為指針!!!但是這個返回unsigned long是在歷史的第一天,Linux的0.01就這樣了。Al Viro

https://lwn.net/Articles/668852/

但是改動實在太多了,改了接近600個文件,對此Linus的態度是:

"No way in hell do we suddenly change the semantics of an interface that has been around from basically day #1."

所以Linus的建議是,你真的需要一個指針的時候,你還是去調用kmalloc()吧:

  1. *kmalloc(size_t size, gfp_t flags); 

絕世好代碼

很多工程師喜歡較真,就是必須在0和1之間做一個選擇。這個選擇有時候真的很難,所以Linus的意思是,0和1踏馬地都不要,我不去跟你爭這個0和1的問題,我給你第三條路。這里,我看出了Linus的大智若愚啊!

我個人在工程里面對無意義的0和1的爭論也也沒什么好感,感覺在浪費我的時間。我對事情的看法是,爭一個0.7或者0.3就OK了。0.7就是真方向,0.3就是假方向。

“絕世好代碼”是不存在的,“水至清則無魚”,往死里爭反而陷入了鉆牛角尖。等你寫出絕對完美代碼的時候,黃花菜早就歇了。別忘了,還有最重要的一招,“天下武功,無堅不破,唯快不破。”

本文轉載自微信公眾號「Linux閱碼場」,可以通過以下二維碼關注。轉載本文請聯系Linux閱碼場公眾號。 

 

責任編輯:武曉燕 來源: Linux閱碼場
相關推薦

2009-12-17 15:18:47

2015-05-13 14:12:52

Linux內核內核獲得成功

2021-09-06 07:45:08

LinuxLinux內核

2015-07-27 11:34:03

Linux內核指針

2022-02-18 00:15:58

Linux指令CPU

2024-03-15 08:54:59

Linux內核NUMA

2014-07-02 16:51:08

WOT2014高效技術團隊

2023-02-28 09:47:42

2010-03-01 13:32:42

Linux常用文件

2016-09-26 13:50:52

Linux系統性能

2021-09-27 09:52:41

FacebookBOLTLinux

2020-03-18 14:08:48

Windows操作系統功能

2021-07-04 15:16:14

索引B+數據庫

2012-04-06 10:35:30

SpringJavaHibernate

2023-01-03 15:47:09

Linux內核C語言

2024-07-01 12:53:19

2014-03-26 10:09:14

指針指針使用

2021-02-20 11:34:43

Linux內核指針

2022-03-25 12:31:49

Linux根文件內核

2009-12-21 17:11:38

Linux認證
點贊
收藏

51CTO技術棧公眾號

国产裸体美女永久免费无遮挡| www.黄色在线| 男女羞羞在线观看| 久久久久亚洲蜜桃| 成人av在线天堂| 久久香蕉精品视频| 精品国产精品国产偷麻豆| 欧美高清一级片在线| 欧美午夜性视频| xxxxx日韩| 成人99免费视频| 成人a级免费视频| 欧美一级视频免费观看| 色小子综合网| 亚洲美女视频网| 国产精品91久久久久久| 91精品国自产在线| 北条麻妃一区二区三区在线| 欧美又粗又大又爽| 免费观看国产精品视频| 国产原厂视频在线观看| 2023国产精品视频| 动漫美女被爆操久久久| 在线观看日韩一区二区| 99精品国产福利在线观看免费 | 91av视频导航| 精品国产视频在线观看| 欧美日韩激情在线一区二区三区| 亚洲第一黄色网| 性生活在线视频| 亚洲狼人综合| 在线免费观看日本一区| 欧美黑人经典片免费观看| caopo在线| 亚洲欧美综合另类在线卡通| 日本在线观看一区二区三区| 偷拍精品一区二区三区| 成人综合婷婷国产精品久久蜜臀| 国产精品欧美在线| 国产一区二区视频免费| 亚洲九九精品| 高清欧美性猛交xxxx| 一区视频免费观看| 伊人青青综合网| www.亚洲男人天堂| 女同久久另类69精品国产| 精品国产一区二区三区久久久樱花| 亚洲福利视频二区| www.555国产精品免费| 精品久久免费| 91精品国产91久久久久久一区二区| 亚洲第一狼人区| 韩日一区二区| 欧美三级三级三级爽爽爽| 波多野结衣作品集| 国产麻豆久久| 欧美三级一区二区| 中文字幕第22页| 日韩区一区二| 精品人在线二区三区| 91视频在线免费| 欧美理论电影在线精品| 亚洲跨种族黑人xxx| 亚洲码无人客一区二区三区| 国产欧美一区二区三区精品观看 | 欧美三级日本三级少妇99| 国产一线二线三线在线观看| aaaa欧美| 欧美一区二区三级| 国产高清成人久久| 国产欧美日韩| 久久夜色精品亚洲噜噜国产mv| 黄色片在线观看网站| 影音先锋亚洲电影| 日本欧美精品在线| 91丨九色丨丰满| 国产成人高清在线| 久久亚洲免费| 91社区在线观看| 尤物在线观看一区| 日本三级免费网站| 成人深夜福利| 欧美人牲a欧美精品| 国产大学生av| 久久综合色占| 久久五月天色综合| 国产 欧美 日韩 在线| 欧美aaa在线| 91九色对白| 你懂的视频在线| 一区视频在线播放| 国产原创中文在线观看| 欧美精选视频一区二区| 日韩午夜激情视频| 无码 人妻 在线 视频| 一区二区电影在线观看| 欧美专区在线播放| 91女人18毛片水多国产| 2020日本不卡一区二区视频| 佐佐木明希av| 中文字幕影音在线| 欧美一区二区三区在线电影| 给我看免费高清在线观看| 天天射综合网视频| 欧美最近摘花xxxx摘花| 国产黄色美女视频| 国产欧美视频在线观看| 国产美女在线一区| 国产亚洲观看| 在线播放日韩精品| 国产69精品久久久久久久久久| 国产在线精品免费av| 日本在线观看一区二区| 岛国av在线网站| 日韩一区二区视频| 又色又爽的视频| 噜噜噜躁狠狠躁狠狠精品视频| 99国产视频| 日本高清视频在线播放| 色婷婷激情久久| 女同性恋一区二区三区| 欧美高清日韩| 成人中文字幕在线观看| 成人在线播放视频| 都市激情亚洲色图| 中文字幕a在线观看| 欧美天天视频| 91免费版网站在线观看| 精品国产99久久久久久| 欧美日韩国产影片| 美国黄色特级片| 久久精品日产第一区二区| 国产欧美综合精品一区二区| 18av在线播放| 欧美一级生活片| 看免费黄色录像| 精东粉嫩av免费一区二区三区| 视频一区视频二区视频| 日韩成人av电影| 亚洲欧美日韩一区二区在线| 草久久免费视频| 久久人人超碰精品| 国产综合免费视频| 亚洲第一福利社区| 国产v综合ⅴ日韩v欧美大片| 日本一区二区三区在线观看视频| 欧美日韩精品中文字幕| 亚洲第一黄色网址| 香蕉久久夜色精品国产| 久久精品99| 国产精品一区二区av影院萌芽| 日韩精品免费一线在线观看| 午夜毛片在线观看| 久久久久综合网| 天堂av在线网站| 欧美r级电影| 成人午夜小视频| 91国内在线| 精品噜噜噜噜久久久久久久久试看| 久久婷婷综合国产| 91香蕉视频在线| 免费在线观看的毛片| 欧美日韩水蜜桃| 91精品视频在线播放| 欧美hdxxx| 亚洲电影免费观看| 日韩精品一区二区亚洲av观看| 欧美国产精品v| 99视频在线观看视频| 最新国产乱人伦偷精品免费网站| 精品一区在线播放| 福利视频亚洲| 欧美久久久精品| 色播色播色播色播色播在线| 欧美性大战久久久| 欧美精品一区二区成人| 99久久精品免费看| 亚洲一区在线不卡| 欧美三级在线| 日本成人三级| 国产亚洲高清一区| 日本国产欧美一区二区三区| 免费黄网站在线| 日韩精品极品毛片系列视频| 中文字幕 亚洲视频| 亚洲一区二区三区在线| 男人舔女人下部高潮全视频| 国产高清在线精品| 欧在线一二三四区| 国产一区二区中文| 日韩区国产区| 精品欠久久久中文字幕加勒比| 国产精品久久在线观看| 欧美人与性动交α欧美精品图片| 亚洲码在线观看| 亚洲AV无码精品国产| 色94色欧美sute亚洲线路一ni | sese在线视频| 精品国产在天天线2019| 久久久久精彩视频| 性做久久久久久免费观看| 激情高潮到大叫狂喷水| 91麻豆国产在线观看| 丰满人妻一区二区三区53视频| 久久亚洲电影| 久久av综合网| 一区二区三区四区电影| 日本一区二区三区四区高清视频 | 日韩成人动漫| 欧美第一页在线| 日本在线观看www| 亚洲欧美中文另类| 天堂中文在线观看视频| 日韩一区和二区| 一级黄色大毛片| 色先锋aa成人| 久久国产精品免费看| 亚洲亚洲精品在线观看| 美脚丝袜一区二区三区在线观看| 亚洲人辣妹窥探嘘嘘| 欧美高清成人| 欧美日韩一区高清| 免费无码国产精品| 狠狠色狠色综合曰曰| 久久久久久久蜜桃| 亚洲精品国久久99热| 国产精品嫩草影院俄罗斯| 国产欧美日韩麻豆91| 李宗瑞91在线正在播放| 99精品国产91久久久久久| 精品国产一二区| 国产成人a级片| 韩国三级hd中文字幕有哪些| 狠狠色2019综合网| 午夜精品中文字幕| 麻豆极品一区二区三区| 奇米影音第四色| 蜜臀av一区二区在线免费观看| 成人免费无码av| 久久狠狠婷婷| 亚洲成熟丰满熟妇高潮xxxxx| 亚洲在线免费| 国产一区亚洲二区三区| 久久午夜精品一区二区| 成人一级片网站| 日韩中文字幕一区二区三区| 日本熟妇人妻中出| 男女性色大片免费观看一区二区| 亚洲欧美日韩一级| 精品一二三四区| 中文字幕avav| 成人99免费视频| 亚洲第一页av| 国产视频911| 精品伦精品一区二区三区视频密桃 | 熟妇人妻系列aⅴ无码专区友真希 熟妇人妻av无码一区二区三区 | 中文天堂在线一区| 日韩av片在线免费观看| 亚洲欧美一区二区三区久本道91| 国产这里有精品| 五月婷婷另类国产| 国产污视频网站| 欧美精品在欧美一区二区少妇| 国产普通话bbwbbwbbw| 精品久久久久久综合日本欧美| 手机av免费在线观看| 亚洲女同精品视频| 在线免费av电影| 欧美丰满片xxx777| 天堂在线中文网官网| 国产精品欧美日韩一区二区| 国产精品一区免费在线| 国产一区二区精品在线| 精品国产91乱码一区二区三区四区| 亚洲蜜桃在线| 黄色日韩在线| 看欧美ab黄色大片视频免费| 久久精品国内一区二区三区| 免费看91视频| 日本一区二区三区高清不卡| 黑鬼狂亚洲人videos| 亚洲成精国产精品女| 亚洲永久精品一区| 欧美一级欧美三级| 免费在线稳定资源站| 久久精品国产亚洲7777| 久久男人天堂| 成人网在线观看| 曰本一区二区三区视频| 男人天堂成人网| 欧美亚洲在线| 亚洲欧美一区二区三区不卡| 久久综合色8888| wwwav国产| 在线观看日韩国产| 天堂中文在线资源| 久久夜色撩人精品| 黄瓜视频成人app免费| 懂色av一区二区三区在线播放| 日本一区二区高清不卡| 少妇av一区二区三区无码| 韩国精品一区二区| 欧洲av一区二区三区| 午夜伦欧美伦电影理论片| 亚洲一卡二卡在线观看| 亚洲精品视频在线播放| 香蕉久久aⅴ一区二区三区| 国产精品久久久久久久美男 | 神马影院一区二区三区| 亚洲九九精品| 亚洲国产精品第一页| 国产精品久久久久久亚洲毛片| 99久在线精品99re8热| 欧美一卡二卡在线| 一区二区高清不卡| 国产mv久久久| 亚洲美女15p| 黄色成人在线看| 成人午夜伦理影院| 五月天激情丁香| 欧美日韩激情一区二区| 免费福利在线观看| 欧美在线视频网站| 欧美激情久久久久久久久久久| www婷婷av久久久影片| 国产又粗又猛又爽又黄91精品| 69精品无码成人久久久久久| 一本一道综合狠狠老| 天堂网在线播放| 午夜精品一区二区三区在线视 | 久久综合亚洲色hezyo国产| 欧美精品自拍偷拍| 欧美人xxx| 成人在线一区二区| 久久久久久久久丰满| 亚洲天堂网2018| 一色屋精品亚洲香蕉网站| 国产原创中文av| 久久精品视频亚洲| 99精品女人在线观看免费视频| 伊人久久大香线蕉综合75| 美国毛片一区二区| 亚洲一级二级片| 欧美久久久影院| 动漫一区在线| ts人妖另类在线| 99这里有精品| 中文字幕一区二区三区人妻电影| 黑人巨大精品欧美一区免费视频 | 91精品国产沙发| 色婷婷狠狠五月综合天色拍| 欧美国产激情视频| 国产亲近乱来精品视频| 中文字幕视频在线播放| 色播久久人人爽人人爽人人片视av| 日本成人一区二区| 黄黄视频在线观看| 成人精品鲁一区一区二区| 精品美女久久久久| 在线观看91久久久久久| 中文字幕日韩亚洲| 日韩美女爱爱视频| 91看片淫黄大片一级在线观看| 免费看污视频的网站| 日韩中文在线不卡| 日韩精品一区二区三区中文字幕| 人人妻人人做人人爽| 91香蕉视频污在线| 中文字幕永久在线视频| 欧美精品一本久久男人的天堂| 国产亚洲成av人片在线观黄桃| 国产精品免费观看久久| 国产精品久久久久久久久搜平片| 99国产精品99| 欧美亚洲在线视频| 91麻豆国产自产在线观看亚洲| 亚洲成a人无码| 日本久久一区二区三区| 国产原创在线观看| 久久一区二区三区av| 久久99国产精品免费| 不卡的免费av| 伊是香蕉大人久久| 亚洲视频国产精品| 老司机午夜av| 亚洲永久精品国产| 超碰在线国产| 国产另类自拍| 蜜桃一区二区三区在线| 免费一级特黄特色大片| 一区二区三区美女xx视频| 97视频一区| 在线免费观看av的网站| 午夜av电影一区| 黄色网在线免费观看| 青娱乐国产91| 国产成人av电影在线| 中文字幕精品一区二| 69视频在线播放| 午夜国产精品视频免费体验区|