2019年8月5日 星期一

unix組語筆記


gcc inline的ouput第一個會自動從eax取得 默認只能取一個(有空再研究一下gcc的inline好了)
movq 需要 uint64_t, movl 則只需要普通int
當call一個function會有
call function //function是函數簽名
每次進人新function,function內的頭2句都會是
push rbp
mov rsp,rbp
作用是把上一個function的回傳地址推入stack然後再將目前的rsp內容複製到rbp,是一個進入新環境的概念 然後離開函式時會
ret //same as "pop eip"
把當前esp pop進eip
另外再留一下gdb的用法 對理解程序有幫助 首先如果想反組譯某些函數
b*funcname //funcname是函數名 另外建議幫gdb安裝插件例如gdb-peda 一目了然比較好懂
r//same as run 作用是從breakpoint開始函式
nexti//下一個執行組語指令
p *x//打印x位置所存內容
i r//打印r系列register
x /100c addr//顯示addr開始以後100個位的內容

2019年7月19日 星期五

Yocto修改內核源碼筆記

怕忘記 留個筆記
先下載poky linux
git clone -b thud git://git.yoctoproject.org/poky poky_thud
cd poky_thud
進入標準開發環境
source oe-init-build-env
接下來就是重點,進入編輯模式
bitbake -c devshell virtual/kernel
做你想做的事 例如apply預先寫好patch
git apply xxx.patch
設定defconfig
bitbake -c menuconfig
如果想用本身定defconfig可以在
cat /boot/config-*
找到 但只在普通linux distro找到 至於poky linux的路徑...我忘了:P(以後再補上)
compile kernel和distro
bitbake virtual/kernel
bitbake core-image-full-cmdline
然後當然 compile完要run他
runqemu qemux86
補充: toaster project 貌似不能改kernel源碼,他用的kernel不是預設的virtual/kernel

2019年7月6日 星期六

[轉載]淺顯易懂的 SELinux 政策實施指南

原文
SELinux(Security-Enhanced Linux)是一款 Linux 的安全性增強模組,起初由美國國家安全局(NSA)所開發,後來則整合進 Linux 核心,成為 Linux 核心的內建模組。不過並非所有的 Linux 發行版都預設啟用了 SELinux。Red Hat 是 SELinux 的最主要支持者,預設啟用 SELinux 的發行版多半都是來自於 Red Hat 或其衍生物,例如 Fedora、RHEL、CentOS 等等。

儘管 SELinux 相較於基本的 Unix-like 權限管理而言是更為嚴謹 ,但同時也顯得更為複雜,因此有不少 Linux 的使用者會傾向於直接停用它。另一方面,也有不少的使用者會讓它維持啟用,然後再根據阻擋的狀況執行特定的放行動作。然而無論是選擇啟用或停用,或許更大多數的使用者其實都對 SELinux 的工作原理一知半解,也未曾明白它真正的益處。

今年是 SELinux 首次釋出的十週年,一名 Red Hat 的員工 Daniel Walsh 在 opensource.com 發表了一篇文章:Your visual how-to guide for SELinux policy enforcement,該文章旨在以淺顯易懂的方式,說明 SELinux 的原理。由於內容並不涉及任何 SELinux 的指令與操作,而是純粹利用譬喻、漫畫和舉例來解釋 SELinux,因此對任何人來說應該都是很容易吸收的一篇文章。

以下是 DR 所翻的中文版,原版的圖文內容皆採 CC BY-SA 授權,而圖片的作者為 Máirín Duffy。

屬於你的 SELinux 政策實施視覺化教學指南

今年我們慶祝 SELinux 的十週年,這真是驚人。SELinux 第一次被導入是在 Fedora Core 3(DR 註:更精確的說法是從 FC2 就包含了,然後在 FC3 成為預設啟用),接著是在 Red Hat Enterprise Linux 4。以下則是給那些從沒用過 SELinux、或者想要有個解釋的人……

2018年2月22日 星期四

異步編程與CPS

有看過"使用Lua Function表示Lambda calculus"的,應該都會對hof(高階函數)不會陌生
使用高階函數 可以做出很多powerful的事請 例如異步編程 所謂異步 舉個栗子就像https://www.zhihu.com/question/19732473所說的

老張愛喝茶,廢話不說,煮開水。
出場人物:老張,水壺兩把(普通水壺,簡稱水壺;會響的水壺,簡稱響水壺)。
1 老張把水壺放到火上,立等水開。(同步阻塞)老張覺得自己有點傻
2 老張把水壺放到火上,去客廳看電視,時不時去廚房看看水開沒有。(同步非阻塞)老張還是覺得自己有點傻,於是變高端了,買了把會響笛的那種水壺。水開之後,能大聲發出嘀~~~~的噪音。
3 老張把響水壺放到火上,立等水開。(異步阻塞)老張覺得這樣傻等意義不大
4 老張把響水壺放到火上,去客廳看電視,水壺響之前不再去看它了,響了再去拿壺。(異步非阻塞)
老張覺得自己聰明了。

這種「不會馬上回傳」的性質,在某些更新頻繁且大量的情況下很有用.就例如ajax,如果一個網站有大量資料且前後相關,一般的逐頁搜索會很沒效率而且很不方便.但如果可以用一些簡單操作逐批資料加載 整個網站就變得人性化多了

至於異步要如何控制呢,這就是我要今天記下的題目:Continuation-passing style(CPS)

所謂CPS 顧名思義就是一種編程的style 在這種style底下 每個動作都會回傳一個函數 這個函數會呼叫下個函數直至動作完結 這個呼叫的函數大多是呼叫他的父函數自身 形成一種連續的時間線 著名的函數式語言Haskell在發明初期都是用CPS處理I/O 以下是一個node.js呼叫sqlite例子

2018年2月21日 星期三

[轉載]淺析Go語言Interface類型的語法行為及用法

原文
Go不是一種典型的OO語言,它在語法上不支持類和繼承的概念。 沒有繼承是否就無法擁有多態行為了呢?答案是否定的,Go語言引入了一種新類型—Interface,它在效果上實現了類似於C++的「多態」概念,雖然與C++的多態在語法上並非完全對等,但至少在最終實現的效果上,它有多態的影子。
那麼,Go的Interface類型到底是什麼呢?怎麼使用呢?這正是本篇筆記試圖說明的問題。

1. Method(s) in Go

在說明Interface類型前,不得不先用Go的method(s)概念來熱身,因為Go語言的interface與method(s)這兩個語法有非常緊密的聯繫。
雖然Go語言沒有類的概念,但它支持的數據類型可以定義對應的method(s)。本質上說,所謂的method(s)其實就是函數,只不過與普通函數相比,這類函數是作用在某個數據類型上的,所以在函數簽名中,會有個receiver來表明當前定義的函數會作用在該receiver上。
關於methods的精確語法規範,可以參考language specificationEffective Go中的說明,這裡略過。
注意:Go語言支持的除Interface類型外的任何其它數據類型都可以定義其method(而並非只有struct才支持method),只不過實際項目中,method(s)多定義在struct上而已。
在struct類型上定義method(s)的語法特性與C++中的struct支持的語法非常類似(c++中的struct定義了數據,此外也支持定義數據的操作方法),從這一點來看,我們可以把Go中的struct看作是不支持繼承行為的輕量級的「類」。

2. What is Interface type in Go ?

GoLang官網language specification文檔對interface type的概念說明如下:
An interface type specifies a method set called its interface. A variable of interface type can store a value of any type with a method set that is any superset of the interface. Such a type is said to implement the interface. The value of an uninitialized variable of interface type is nil.

說實話,這段說明對新手來說比較晦澀,這正是本篇筆記試圖解釋清楚的地方。

2018年1月8日 星期一

[轉載]使用Lua Function表示Lambda calculus

http://blog.csdn.net/yuanlin2008/article/details/8627081
很多程序語言所帶給你的“完美”的感覺都來自於數學抽象之美。
在Lua中,function被描述成“具有真正的詞法範圍的一類值”(first-class values​​ with proper lexical scoping)。
所謂的“一類值”,應該滿足以下條件:
  • 可以被保存到變量和數據結構中
  • 可以被當作子程序的參數和返回值
  • 可以在運行期創建
  • 具有內在標識,不依賴於任何給定的名稱
大多數語言的基本數據類型,比如int,就屬於“一類值”。很多語言中的函數實​​現,只能滿足其中一些條件。比如在C中可以將函數指針保存到變量中,可以將函數指針當作參數和返回值。這樣的函數實現一般不會被算作“一類值"。
在Lua中,所有的值都是“一類”值,包括function本身。函數可以被保存到任何的變量或者table中,可以被當作參數和返回值使用,所有的函數(更準確的說應該是closure)都是運行期被創建的,函數本身並沒有名字,名字只是對函數的引用而已。作為“一類值”的function更為抽象,可以用來表示很多的"Functional Programming"的概念。比如“高階函數”(Higher-order functions),“匿名函數”(Anonymous functions")。這些功能在很多語言中都是通過特殊的語法來支持的,而在lua中則不需要。

2017年11月2日 星期四

[轉載]Haskell與範疇論

2010-04-06 黃毅 原文
用haskell的概念解釋範疇論。翻譯自 wikibook : http://en.wikibooks.org/wiki/Haskell/Category_theory

Haskell與範疇論

本文對範疇論做一個簡單的介紹,最終目的是為了將它應用到Haskell語言。為了達到這個目的,我們一邊介紹數學上的定義,一邊給出對應的Haskell代碼。我們不追求這個對應有多精確,只期望讀者在讀完以後,能對範疇論的基本概念及其跟Haskell之間的聯繫有一個直觀的感受。

一個簡單的範疇,由三個對像 A, BC 組成,有三個單位態射 , ,還有另外兩個態射 。第三個組成元素(即如何對態射進行組合)沒有展示出來。
本質上講,範疇由三部分組成:
  1. 一組 對像
  2. 一組 態射 。每個態射捆綁兩個對像(一個源對象,一個目標對像)。(也有人把它們叫做箭頭,我們這裡不這麼叫它,因為這個詞語在Haskell裡面有其他含義。譯註:其他含義指的是 Control.Arrow 。)如果 f 是一個從源對像 A 到目標對像 B 的態射,我們把它記作
  3. 一個稱為 態射組合 的概念。如果 h 是態射 fg 的組合,我們記作:
許多事物都構成範疇。比如全部的集合就構成範疇 Set ,函數(譯註:這裡說的函數是指集合論中的函數)是它的態射,態射的組合就是函數的組合。全部的群也構成範疇 Grp ,保持群結構的函數就是它的態射(群同態),比如任意兩個群 GHG 的操作符為 H 的操作符是 ,那麼函數 只要滿足如下條件就是一個態射:
乍看之下似乎所有態射都是函數,實際上不一定,比如下面這個例子,任何偏序結構 (P, ) 都構成範疇, P 中的元素就是該範疇的對象,任意兩個元素 ab 只要滿足 ,那麼 就是一個態射。另外,在相同的源對像和目的對象之間可以存在多個態射。我們拿 Set 範疇為例, 都是從 的函數,但是他們是不同的態射。